我有一些我希望建模的数据,以便能够在与数据相同的范围内获得相对准确的值。
为了做到这一点,我使用polyfit来拟合6阶多项式,并且由于我的x轴值,它建议我居中并缩放它以获得更准确的拟合。
但是,现在我想找到这个函数的导数来模拟模型的速度。
但我不确定聚合物功能如何与我生成的缩放和拟合的polyfit相互作用。 (我不想使用未缩放的模型,因为这不是很准确)。
以下是一些可以重现我的问题的代码。我尝试重新调整x值,然后再将它们放入适合的导数中,但这仍然无法解决问题。
x = 0:100;
y = 2*x.^2 + x + 1;
Fit = polyfit(x,y,2);
[ScaledFit,s,mu] = polyfit(x,y,2);
Deriv = polyder(Fit);
ScaledDeriv = polyder(ScaledFit);
plot(x,polyval(Deriv,x),'b.');
hold on
plot(x,polyval(ScaledDeriv,(x-mu(1))/mu(2)),'r.');
在这里,我选择了一个简单的多项式,这样我就可以准确地拟合它并产生实际的导数。
非常感谢任何帮助。 我正在使用Matlab R2014a BTW。
编辑。 刚刚玩了它并将差分的结果点除以标准差mu(2),它在-3e-13到约5e-13范围内给出了非常接近的结果。
polyval(ScaledDeriv,(x-mu(1))/mu(2))/mu(2);
不确定为什么会出现这种情况,还有另一种更优雅的方法来解决这个问题吗?
EDIT2。很抱歉有另一个编辑,但再次发现,并发现大样本x = 1:1000;偏差变得大得多,直到10.我不确定这是否是由于一个坏的polyfit,即使它是居中和缩放,或者由于绘制衍生物的有趣方式。
感谢您的时间
答案 0 :(得分:5)
链规则的简单应用提供了
根据定义
紧随其后
这正是您用数字验证的内容。
大样本缺乏准确性是由于您已经完成的全局而非局部拉格朗日多项式插值。我建议您尝试使用样条线拟合数据,并使用fnder()
获取导数。另一种选择是在本地应用polyfit()
函数,即移动一小组点,然后将polyder()
应用于所有拟合多项式。