matlab中的外推非线性数据

时间:2013-09-07 23:17:08

标签: matlab extrapolation

如何在matlab中对850及以上的数据进行外推?

x =  200.0000  205.0000  210.0000  215.0000  220.0000  225.0000  230.0000  235.0000  240.0000 245.0000  250.0000  255.0000  260.0000  265.0000  270.0000  275.0000  280.0000  285.0000 290.0000  295.0000  300.0000  305.0000  310.0000  315.0000  320.0000  330.0000  340.0000 350.0000  360.0000  370.0000  380.0000  390.0000  400.0000  410.0000  420.0000  430.0000 440.0000  450.0000  460.0000  470.0000  480.0000  490.0000  500.0000  510.0000  520.0000 530.0000  540.0000  550.0000  560.0000  570.0000  580.0000  590.0000  600.0000  620.0000 640.0000  660.0000  680.0000  700.0000  750.0000  800.0000

y =  0.8900    0.8600    0.8400    0.8200    0.8000    0.7900    0.7700    0.7500    0.7400   0.7200    0.7100    0.6900    0.6800    0.6700    0.6500    0.6400    0.6300    0.6200   0.6100    0.6000    0.5900    0.5800    0.5700    0.5600    0.5500    0.5400    0.5200   0.5100    0.4900    0.4800    0.4700    0.4500    0.4400    0.4300    0.4200    0.4100   0.4000    0.3900    0.3900    0.3800    0.3700    0.3600    0.3600    0.3500    0.3400   0.3400    0.3300    0.3200    0.3200    0.3100    0.3100    0.3000    0.3000    0.2900   0.2800    0.2700    0.2600    0.2600    0.2400    0.2200

2 个答案:

答案 0 :(得分:4)

如果您绘制log(y) vs log(x),则会看到它们遵循线性关系。所以我们可以这样做:

x =  [200.0000  205.0000  210.0000  215.0000  220.0000  225.0000  230.0000  235.0000  240.0000 245.0000  250.0000  255.0000  260.0000  265.0000  270.0000  275.0000  280.0000  285.0000 290.0000  295.0000  300.0000  305.0000  310.0000  315.0000  320.0000  330.0000  340.0000 350.0000  360.0000  370.0000  380.0000  390.0000  400.0000  410.0000  420.0000  430.0000 440.0000  450.0000  460.0000  470.0000  480.0000  490.0000  500.0000  510.0000  520.0000 530.0000  540.0000  550.0000  560.0000  570.0000  580.0000  590.0000  600.0000  620.0000 640.0000  660.0000  680.0000  700.0000  750.0000  800.0000];
y =  [0.8900    0.8600    0.8400    0.8200    0.8000    0.7900    0.7700    0.7500    0.7400   0.7200    0.7100    0.6900    0.6800    0.6700    0.6500    0.6400    0.6300    0.6200   0.6100    0.6000    0.5900    0.5800    0.5700    0.5600    0.5500    0.5400    0.5200   0.5100    0.4900    0.4800    0.4700    0.4500    0.4400    0.4300    0.4200    0.4100   0.4000    0.3900    0.3900    0.3800    0.3700    0.3600    0.3600    0.3500    0.3400   0.3400    0.3300    0.3200    0.3200    0.3100    0.3100    0.3000    0.3000    0.2900   0.2800    0.2700    0.2600    0.2600    0.2400    0.2200];

coeff = polyfit(-log10(x) , log10(y), 1)   % the '1' means linear
xp = [200:1000];
yp = 10^coeff(2)*xp.^(-coeff(1));
plot(x,y,'o',xp,yp)

你得到:

enter image description here

答案 1 :(得分:3)

我正在尝试将上述函数用于我自己的曲线,我希望进一步扩展,但面临一些问题。 我是这个slm工具箱的新手。请建议如何避免此错误 时间1是x轴变量数组,其值范围为:9.8682e-05 9.8687e-05 enter image description here

我会评论推断的危险性。在“密西西比河上的生活”中,没有人比马克吐温更好地说过here。推断太远,并期望随机垃圾作为预测。

话虽如此,人们可以使用许多工具。你可能会做一些类似的指数。这里的问题是你需要找到一个具有适当形状的模型。如果您还没有从第一原理开始有意义的物理模型,通常需要进行一些实验来找到适合您数据的内容。

更好的是样条模型,但问题是插值样条外推得很差。所以我的建议是使用像SLM这样的工具,然后根据你对外推区域内可能/应该发生的事情的知识进行构建。

在这里,我对曲线的合理属性做了一些猜测,因为它推断了很多方面。我对整个曲线施加了单调递减约束,具有正二阶导数。同样,右端点不允许低于零。

mdl = slmengine(x,y,'knots',[200:100:800,1000:500:2000],... 
   'decreasing','on','concaveup','on','rightminvalue',0,'plot','on');

enter image description here