Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Plot 三次样条外推_Plot_Interpolation_Spline_Graphing_Extrapolation - Fatal编程技术网

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是一个库,我在寻找前面提到的代码。我有一系列数据点生成曲线。我需要向前延伸一点曲线。它并不比这复杂。好吧,只需要取你得到的最后一条三阶曲线,然后计算出所需的值。如果你拟合了它,你就可以