MatlabCurve曲线拟合后如何获得高精度参数

Posted 菜老越

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MatlabCurve曲线拟合后如何获得高精度参数相关的知识,希望对你有一定的参考价值。

一 出现的问题

Matlab的Curve工具是非常实用的曲线拟合工具,关于它的使用网上一搜一大把。一直以来,我也在使用它进行曲线拟合,而且一直用的很好,没有感觉到不对,直到今天出现了这样一个情况:
在拟合完一条3次多项式曲线后,直接将红框中的参数扔到C语言里参与计算了。

在C中的程序如下所示:

	res = -2.121e05*pow(x,3) + 6.302e05*pow(x,2) - 6.241e05*x + 2.06e05

这个式子与Curve中的参数完全吻合,而真正到计算时,res会返回一个“令人感觉不对”的数。甚至我将拟合时用的点带入,都不能得到准确的结果。

二 问题所在

后来经过考虑,认为这是精度丢失造成的结果。所谓精度丢失,即上图红框中的参数只取了4位有效数字,这本来就是截断后的浮点数,是有精度损失的。因此在对计算精度非常敏感的场合,将会产生不可预知的误差。

三 问题解决

知道了原因,解决办法很简单——直接从Curve中获得高精度的参数不就好了?可是当我在网上一顿搜索无果后,只得自己想办法解决。
经过摸索,可以通过将Curve拟合结果保存到workspace中,然后分别提取参数的方式获得高精度参数。具体步骤如下:
1.在Curve中,Fit–>Save to Workspace

2.在弹出的窗口中,其实只选择第一个选项即可,其他两个可选可不选,因为我们要的参数就在第一个选项里,这里我把它存到一个名为fittedmodel6的变量中。

3.这时,在workspace中就出现了fittedmodel6变量,我们在命令行中查看fittedmodel6变量,输出如下:

fittedmodel6 = 

     Linear model Poly3:
     fittedmodel6(x) = p1*x^3 + p2*x^2 + p3*x + p4
     Coefficients:
       p1 =  -2.121e+05
       p2 =   6.302e+05
       p3 =  -6.241e+05
       p4 =    2.06e+05

可以看到,仍然是截断为4位有效数字。
5.分别提取变量,提取后的即是满精度数据。fittedmodel6中有p1 p2 p3 p4四个参数,取出其中的某一个只需fittedmodel6.px即可。那么方法就简单了:
直接依次取出,存在不同的变量里,然后再将高精度的数copy到C程序中,问题得以解决。

p1 =

    -2.121057443100790e+05

>> p2 = fittedmodel6.p2

p2 =

     6.301790424353683e+05

>> p3 = fittedmodel6.p3

p3 =

    -6.241000774146421e+05

>> p4 = fittedmodel6.p4

p4 =

     2.060275894166932e+05

以上是关于MatlabCurve曲线拟合后如何获得高精度参数的主要内容,如果未能解决你的问题,请参考以下文章

matlab曲线拟合后如何给出得到的各个参数的标准差

matlab中如何拟合光滑曲线

优美的曲线(含蝴蝶线)-CoCube

优美的曲线(含蝴蝶线)-CoCube

曲线洛伦兹拟合峰

opencv多边形拟合曲线approxPolyDP()函数