Подгонка кривой с граничными условиями

#python #numpy #curve-fitting #spline

#python #numpy #подгонка кривой #сплайн

Вопрос:

Я пытаюсь подогнать кривую, используя LSQUnivariateSpline.

 from scipy.interpolate import LSQUnivariateSpline, UnivariateSpline
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2)   0.1 * np.random.randn(50)

t = [-2, -1, 0, 1, 2]
spl = LSQUnivariateSpline(x, y, t, k=4 )

xs = np.linspace(-3, 3, 1000)
plt.plot(x, y, 'ro', ms=5)
plt.plot(xs, spl(xs), 'g-', lw=3)
plt.show()
  

Этот код приводит к приведенному ниже графику.

введите описание изображения здесь

Я хочу объявить граничные условия, такие как dy / dx = 0 или d2x / dy = 0. Есть ли способ или другая функция подгонки кривой с граничными условиями?

Комментарии:

1. Вы пытаетесь создать кусочную функцию, в которой вы используете LSQUnivariateSpline в середине графика и меняете на какую-то линейную функцию в концах?

2. @Jack Moody Да, вы правы. Я хочу добавить ограничение в начале и в конце. В конце я хочу получить кусочный многочлен с применяемыми граничными условиями. x’ = 0 или x» = 0.

3. Лично я бы подогнал данные к уравнению, используя curve_fit() scipy, у вас есть какая-то особая причина для использования сплайна?

4. @Джеймс Филипс Я создаю тестовые данные для сравнения результатов системы, которая создает кусочные полиномы в качестве выходных данных.

5. Теоретически все сплайны должны иметь дело с граничными условиями тем или иным способом. Однако в случае scipy.interpolate у вас есть базовые подпрограммы FORTRAN. Чтобы выяснить, как это делается, вам, вероятно, придется покопаться в них. С другой стороны, если ваш случай не слишком общий, вы могли бы попробовать запрограммировать некоторую подгонку сплайнов для себя. Это не слишком сложно.