Przypuśćmy, że mam krzywą, a następnie oszacam swój gradient za pośrednictwem skończonych różnic, używając np.gradient. Biorąc pod uwagę punkt początkowy x [0] i wektor gradientu, jak mogę zrekonstruować oryginalną krzywą? Matematycznie widzę, że to możliwe, biorąc pod uwagę ten system równań, ale nie jestem pewien, jak to zrobić programowo.

Oto prosty przykład mojego problemu, gdzie mam grzech (X) i obliczę różnicę numeryczną, która pasuje do COS (X).

test = np.vectorize(np.sin)(x)
numerical_grad = np.gradient(test, 30./100)
analytical_grad = np.vectorize(np.cos)(x)

## Plot data.
ax.plot(test, label='data', marker='o')
ax.plot(numerical_grad, label='gradient')
ax.plot(analytical_grad, label='proof', alpha=0.5)
ax.legend();

Sine and its gradient.

1
masta-g3 2 wrzesień 2017, 03:28

2 odpowiedzi

Najlepsza odpowiedź

Znalazłem, jak to zrobić, używając funkcji Numpy's {X0}} (integracja z reguły trapezowej).

Obserwuj na kodzie, który przedstawiłem na pytaniu, aby odtworzyć tablicę wejściową test, robimy:

x = np.linspace(1, 30, 100)
integral = list()
for t in range(len(x)):
    integral.append(test[0] + np.trapz(numerical_grad[:t+1], x[:t+1]))

Integralna tablica zawiera następnie wyniki integracji numerycznej.

1
masta-g3 6 wrzesień 2017, 23:39

Możesz przywrócić początkową krzywą za pomocą integracji.

Jako Przykład życia: Jeśli masz funkcję do pozycji dla 1D, możesz uzyskać funkcję prędkości jako pochodnej (gradient)

 v(t) = s(t)' = ds / dt

Oraz o prędkości, możesz potencjalnie uzyskać pozycję (nie wszystkie funkcje są integrowane analitycznie - w tej przypadku integracja numeryczna jest używana) z niektórą nieznaną stałą (zmianą) dodaną - oraz z pozycją początkową możesz przywrócić dokładną wartość

s(T) = Integral[from 0 to T](v(t)dt) + s(0)
0
MBo 2 wrzesień 2017, 01:43