Я пытаюсь вычислить кривизну 2D-кривой в каждой точке, используя formula here. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я получаю постоянное значение, как и должно быть, это значение неверно. Вот мой код:Ошибка вычисления кривизны с numpy
from scipy.ndimage import gaussian_filter1d
import numpy as np
def curvature(x, y):
#first and second derivative
x1 = gaussian_filter1d(x, sigma=1, order=1, mode='wrap')
x2 = gaussian_filter1d(x, sigma=1, order=2, mode='wrap')
y1 = gaussian_filter1d(y, sigma=1, order=1, mode='wrap')
y2 = gaussian_filter1d(y, sigma=1, order=2, mode='wrap')
return np.abs(x1*y2 - y1*x2)/np.power(x1**2 + y1**2, 3/2)
# make circle data
alpha = np.linspace(-np.pi/2,np.pi/2, 1000)
R = 5
x = R*np.cos(alpha)
y = R*np.sin(alpha)
>>> 1/curvature(x, y)
array([ 9.60e+02, 5.65e+01, 4.56e-01, 1.41e-02, 6.04e-01,
6.04e-01, 6.04e-01, 6.04e-01, 6.04e-01, 6.04e-01,
6.04e-01, 6.04e-01, 6.04e-01, 6.04e-01, 6.04e-01,
...
я ожидал получить что-то близкое к 5. Может ли кто-нибудь помочь мне обнаружить ошибку или предложить более надежный способ сделать это? На практике мои точки x, y не равномерно распределены.
EDIT: Я использую gaussian_filter1d
вместо np.gradient
для производной, потому что было показано here, что это более надежный метод, особенно для второй производной.
Уверены ли вы? Я взял эту технику из [здесь] (http://stackoverflow.com/questions/18991408/python-finite-difference-functions), где 'gaussian_filter1d' составил лучший метод оценки производной. – Elian
Итак, вы говорите, что ответ, который я связал, ошибочен или я неправильно применил его? – Elian
@Joel, я пошел с 'gaussian_filter1d' вместо' np.gradient', потому что связанный ответ доказал, что это более надежный метод, особенно для второй производной. Я также наблюдал то же самое в своих тестах. – Elian