我尝试将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-')
编辑:我想提一下,我既不知道,也不想指定结的位置...我想找到一种方法来找到解决问题的“最佳”职位和最佳路线
使用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');
这是您要寻找的吗?