在Python中,如何仅在特定点上生成平滑样条插值设置导数? TL;博士
显然,在Python中,如何仅在特定点上生成平滑样条插值设置导数? TL;博士,python,matlab,scipy,interpolation,spline,Python,Matlab,Scipy,Interpolation,Spline,显然,scipy没有提供类似于MATLAB的spapi的方法,该方法只允许在特定点设置导数,确保沿插值样条曲线平滑过渡。我想找到一种在Python中实现这一点的方法 总体上 我的目标是使用Python 3进行样条插值,但只在特定点设置所需的导数。例如,假设数组X定义了一个对象的位置,点对点,我想要一条样条线来表示一条可行的轨迹,但也要确保起点和终点的速度(一阶导数)为零,其他点对导数没有约束。在这个例子中,我也希望加速度(二阶导数)在相同的点上等于零 换句话说,我想要的是样条插值的实现,类似于M
scipy
没有提供类似于MATLAB的spapi
的方法,该方法只允许在特定点设置导数,确保沿插值样条曲线平滑过渡。我想找到一种在Python中实现这一点的方法
总体上
我的目标是使用Python 3进行样条插值,但只在特定点设置所需的导数。例如,假设数组X定义了一个对象的位置,点对点,我想要一条样条线来表示一条可行的轨迹,但也要确保起点和终点的速度(一阶导数)为零,其他点对导数没有约束。在这个例子中,我也希望加速度(二阶导数)在相同的点上等于零
换句话说,我想要的是样条插值的实现,类似于MATLAB的spapi
函数,如参考:
spline=spapi(结,x,y)
返回顺序的样条曲线f(如果有)
k=长度(节)-长度(x)
带结序列的结
(*)f(x(j))=y(:,j),所有j.
如果x
的一些条目相同,那么这是在接触意义下进行的,即,在Dm(j)f(x(j))=y(:,j)
的意义下,具有m(j):={i
和Dmf
f的mth
导数。因此,在x
中,一个位点z
的r倍重复对应于在z
处f的第一个r–1
导数的规定值
我试过的
我从scipy.interpolate
类的BPoly
导数中了解到方法,但这带来了一个关键问题,如前所述,当在任何点未指定导数时,算法无法保证平滑过渡。我也尝试了提议的内容,但正如预期的那样,同样的问题也出现了
所以,接下来我将简单地复制我想要实现的目标,不管成功与否
spapi
不含衍生工具
这里,使用spapi
方法,在MATLAB中,不设置任何导数。不是我想要的,因为导数在起点和终点都很高:
xi=linspace(0,10,6);
xnew=linspace(0,10100);
yi=[0214120];
结=optknt(xi,顺序);
RefyType=SPAPI(节、席、义);
样条曲线=fnval(xnew,ref_样条曲线);
der_样条=梯度(样条);
以及参考点与插值样条曲线的对应图:
这里是样条曲线的一阶导数:
spapi
带衍生工具
在这里,使用spapi
方法的示例,在MATLAB中,在起点和终点将导数设置为0
。完全符合预期结果,沿样条曲线平滑过渡,起点和终点处的导数等于0
:
xi=linspace(0,10,6);
xnew=linspace(0,10100);
XDER=〔0席10〕;
yi=[0214120];
ynew=[0 yi 0];
结=optknt(xder,顺序);
ref_样条曲线=spapi(节点、xder、ynew);
样条曲线=fnval(xnew,ref_样条曲线);
der_样条=梯度(样条);
以及参考点与样条曲线的曲线图:
这里是样条曲线的一阶导数:
b衍生金融工具衍生金融工具
这里,使用BPoly.from_导数的示例在起点和终点将导数设置为0
。不成功,即使导数在开始和结束时为0
,也不能保证沿样条曲线平滑过渡:
ref_points=[0,2,1,4,2,0]
时间向量=np.linspace(0,10100)
时间点=np.linspace(0,10,6)
ref_complete=[[ref_points[j]if(i==0)否则范围(2)内的i为0]if(
(j==0)或(j==len(ref_点)-1)其他[ref_点[j]]对于范围内的j(len(ref_点))]
ref_样条曲线=b从_导数的多边形(时间点,ref_完成)
样条线=参考样条线(时间向量)
der_样条=参考样条导数(1)
der_y=der_样条曲线(时间向量)
为了澄清,定义ref\u complete
的行只是用一个数组替换ref\u点的第一个和最后一个元素,该数组包含索引0
处的原始值,以及索引1
处的0
:
参考点
[0, 2, 1, 4, 2, 0]
>>>参考完整
[[0, 0], [2], [1], [4], [2], [0, 0]]
以及参考点与样条曲线的曲线图:
这里是样条曲线的一阶导数:
如果你只想做两端导数为零的三次样条插值,这就足够了()
谢谢你的回复,但是,实际上,我希望能够选择样条曲线的顺序,因为对于主要用途,三次样条曲线并不适合。而且,不是严格需要而是期望的,能够在任何点上设置导数都很好,不仅是第一个和最后一个,而且不一定是零。
from scipy.interpolate import CubicSpline
CubicSpline(time_points, ref_points, bc_type="clamped")