Plot 三次样条外推
我有一个很好的三次样条曲线代码,但它只是用于插值。我需要对未来有一点了解。有人知道这样做的好的代码源,而不是库吗Plot 三次样条外推,plot,interpolation,spline,graphing,extrapolation,Plot,Interpolation,Spline,Graphing,Extrapolation,我有一个很好的三次样条曲线代码,但它只是用于插值。我需要对未来有一点了解。有人知道这样做的好的代码源,而不是库吗 我用basic(现在是ASM)编写了插值程序。你真的需要把这个问题扩展一点。此外,“三次样条曲线”是一个非常广泛的术语 如果您对样条线感兴趣,我可以衷心推荐Carl de Boors“样条线实用指南”。不过,它有点数学化,但它包含了代码示例(可以从作者的主页下载)。谷歌搜索和维基搜索“三次样条曲线”可以带来一些例子,甚至可能是在特定的语言中——这是问题的另一个补充(如果你正在寻找代码
我用basic(现在是ASM)编写了插值程序。你真的需要把这个问题扩展一点。此外,“三次样条曲线”是一个非常广泛的术语 如果您对样条线感兴趣,我可以衷心推荐Carl de Boors“样条线实用指南”。不过,它有点数学化,但它包含了代码示例(可以从作者的主页下载)。谷歌搜索和维基搜索“三次样条曲线”可以带来一些例子,甚至可能是在特定的语言中——这是问题的另一个补充(如果你正在寻找代码) 如果你对外推法和曲线拟合感兴趣,谷歌搜索这些可能会有所帮助。Matlab软件包有一个很好的曲线拟合工具箱。维基百科有一些有用的参考资料链接 真的,这是一个太宽的问题,甚至开始猜测答案 另外,你能解释一下你到底想做什么吗?什么样的数据?有什么事吗
Edit1:在这里,试试这个:您可能会在这里发现一些有用的东西-通常对于样条曲线插值,您使用变量t在直线上插值。只要0就不需要新代码 要外推样条曲线,可以外推第一条和最后一条样条曲线的参数 根据您现有的代码/库,如果不修改代码,这可能是不可能的。在这种情况下,只需在点列表的开始/结束处添加另两个点即可。通过在第一个/最后两个点之间进行线性插值,可以获得这两个点
小心:根据点的原始含义,外推可能完全不合适,尤其是在涉及统计数据时。在这种情况下,你应该考虑使用.你需要对请求的代码写更好的要求。样条曲线通常用于利用固定数据集对未知或复杂函数进行插值。如果您希望在该数据集的边界之外估计函数的值,则不应使用样条曲线 如果样条曲线是在您真正想要计算值的位置(三次,但不是分段三次)定义的函数,那么您已经可以计算该值了 如果希望能够在插值范围外计算样条曲线,但将其保留为分段三次函数,在插值范围内具有相同的值,则应将样条曲线范围扩展一些节点,并在新节点处添加一些计算值逻辑(例如,您希望样条曲线不仅是一个连续函数,还希望一些一阶导数也是连续函数)
实际上,我建议您使用一些更适合于外推的算法,例如,如果您真正需要的是离原始数据集点不远的单个值,则使用。为简单起见,我将表示一条三次贝塞尔曲线 作为4分(A、B、C、D), 其中A和D是曲线的端点, B和C是“控制手柄点”。 (实际曲线通常不接触控制手柄点) 看 有关转换此三次Bezier曲线表示形式的方法,请参见 转化为其他流行的表现形式 插值 给定一条三次贝塞尔曲线(P0,P1,P2,P3), 我们使用 将贝塞尔曲线切分为 左半边和右半边。 即使在没有“乘法”指令的微控制器上,这也非常容易, 因为它只需要计算几个平均值,直到我们得到一个中点:
P0
F0 := average(P0, P1)
P1 S0 := average(F0, F1)
F1 := average(P1, P2) Midpoint := average(S0, S1)
P2 S1 := average(F1, F2)
F2 := average(P2, P3)
P3
整个贝塞尔曲线是(P0,P1,P2,P3)
整个贝塞尔曲线的左半部分是贝塞尔曲线(P0,F0,S0,M)
整个贝塞尔曲线的右半部分是贝塞尔曲线(M、S1、F2、P3)
许多微控制器继续分割每条曲线
变成越来越小的曲线
直到每一块都足够小,可以用
直线
但我们想走另一条路——外推到一条更大的曲线
外推
不管是左半部分还是右半部分,
我们可以反向运行,以恢复原始曲线
假设我们忘记了原始点P1,P2,P3
给定贝塞尔曲线的左半部分(P0,F0,S0,M),
我们可以用以下公式进行右推:
S1 := M + (M - S0)
F1 := S0 + (S0 - F0)
P1 := F0 + (F0 - P0)
然后使用这些值进行计算
F2 := S1 + (S1 - F1)
P2 := F1 + (F1 - P1)
最后
P3 := F2 + (F2 - P2)
外推并恢复外推的Bazier曲线(P0、P1、P2、P3)
详细信息
外推曲线(P0、P1、P2、P3)
通过原始曲线中的每个点
(P0,F0,S0,M)--
特别是,从P0开始并通过中点M--
并一直持续到P3
我们总是可以从任何4个点(P0,F0,S0,M)进行推断,
这4个点是否是最初计算的
作为某些较大贝塞尔样条曲线的左半部分(或右半部分)
我相信您已经知道这一点,但为了清楚起见:
Midpoint = average(F0, F1)
表示“在点F0和F1之间正好找到中点”,
换句话说
Midpoint.x = (F0.x + F1.x)/2
Midpoint.y = (F0.y + F1.y)/2
Midpoint.z = (F0.z + F1.z)/2
表情
S1 := M + (M - S0)
指“给定线段,一端在S0,中点在M,
从S0开始,沿直线穿过M,直到到达S1的另一端,
或者换句话说
(除非你有一个像样的向量库)3行代码
S1.x := M.x + (M.x - S0.x)
S1.y := M.y + (M.y - S0.y)
S1.z := M.z + (M.z - S0.z)
。
(如果你在做2D,跳过所有的“z”字——它总是零).MATLAB是一个库,我在寻找前面提到的代码。我有一系列数据点生成曲线。我需要向前延伸一点曲线。它并不比这复杂。好吧,只需要取你得到的最后一条三阶曲线,然后计算出所需的值。如果你拟合了它,你就可以