具有预定节数的科学线性样条拟合

问题描述 投票:0回答:1

我尝试将n结线性样条曲线拟合到一组点。现在scipy有一种方法可以将度数d的多项式(我将其用于线性)设置为一组点,但是我无法定义所需的节数(我可以通过一些常量参数来影响节数,但是我事先不知道,并使用错误和错误信息搜索他)。我找到了一种将曲线拟合到一组点的方法,起初看起来很有希望。

我试图将一个线性样条拟合为3个结,从根本上说,这个想法是定义一个函数,该函数将结的位置和三个结的每条线的参数作为参数。不幸的是,我认为它不会收敛。

我正在寻找有关如何轻松实现所要实现的目标的新思路。

import matplotlib.pyplot as plt

def knot3_spline_wrapper(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
    vfunc = np.vectorize(knot3_spline)
    return vfunc(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4)

def knot3_spline(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4):
    if x <c1:
        return x*a1+b1
    if c1<=x <c2:
        return x*a2+b2
    if c2<=x<c3:
        return x*a3+b3
    if c3<=x:
        return x*a4+b4
xdata = np.linspace(-2, 2, 50)
y = np.power(xdata, 2)
plt.plot(xdata, y, 'b-', label='data')
popt, pcov = curve_fit(knot3_spline_wrapper, xdata, y)
knot3_spline_wrapper(xdata, *popt)
plt.plot(xdata, knot3_spline_wrapper(xdata, *popt), 'r-')

编辑:我想提一下,我既不知道,也不想指定结的位置...我想找到一种方法来找到解决问题的“最佳”职位和最佳路线

结果:enter image description here

scipy curve-fitting spline linear-interpolation
1个回答
0
投票

使用scipy功能LSQUnivariateSpline,可以指定想要的结的位置:

LSQUnivariateSpline

图形为:

from scipy.interpolate import LSQUnivariateSpline import numpy as np import matplotlib.pylab as plt # Generate some data x = np.linspace(-1, 1, 123) y = 3 + 10*x**2 + np.random.randn(len(x)) # Define wanted knot positions knot_positions = np.linspace(-0.7, 0.7, 4) # Performe the spline fitting (degree=k) spline = LSQUnivariateSpline(x, y, knot_positions, k=1) # Graph y_fit = spline(x) x_knots = spline.get_knots() y_knots = spline(x_knots) plt.plot(x, y, '.', color='black', label='data points'); plt.plot(x, y_fit, '-', color='red', label='fit'); plt.plot(x_knots, y_knots, 'o', color='red', label='knots') plt.legend(); plt.xlabel('x'); plt.ylabel('y');

这是您要寻找的吗?

© www.soinside.com 2019 - 2024. All rights reserved.