一 出现的问题
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