Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何仅在特定点上生成平滑样条插值设置导数? TL;博士_Python_Matlab_Scipy_Interpolation_Spline - Fatal编程技术网

在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")