如何在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
答案 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)
你得到:
答案 1 :(得分:3)
我正在尝试将上述函数用于我自己的曲线,我希望进一步扩展,但面临一些问题。 我是这个slm工具箱的新手。请建议如何避免此错误 时间1是x轴变量数组,其值范围为:9.8682e-05 9.8687e-05
我会评论推断的危险性。在“密西西比河上的生活”中,没有人比马克吐温更好地说过here。推断太远,并期望随机垃圾作为预测。
话虽如此,人们可以使用许多工具。你可能会做一些类似的指数。这里的问题是你需要找到一个具有适当形状的模型。如果您还没有从第一原理开始有意义的物理模型,通常需要进行一些实验来找到适合您数据的内容。
更好的是样条模型,但问题是插值样条外推得很差。所以我的建议是使用像SLM这样的工具,然后根据你对外推区域内可能/应该发生的事情的知识进行构建。
在这里,我对曲线的合理属性做了一些猜测,因为它推断了很多方面。我对整个曲线施加了单调递减约束,具有正二阶导数。同样,右端点不允许低于零。
mdl = slmengine(x,y,'knots',[200:100:800,1000:500:2000],...
'decreasing','on','concaveup','on','rightminvalue',0,'plot','on');