非线性函数与实验数据的拟合方法

Fitting method for non-linear function with experimental data

我想用实验数据拟合非线性函数(变量为T)。 在这里,我使用了lsqcurvefit,但是我不知道这个功能的具体原理,甚至不知道如何使用func这个命令。 (所以我写的剧本不好。)

为此,我该如何修改下面的脚本? (即使w/o使用lsqcurve拟合,我不在乎。卡方,最小二乘,任何形式都可以。) 代码如下(3部分):

%script 1
x=coefficient1
y=coefficient2
z=coefficient3
A1=x*0.321*T
A2=(y/0.2)+0.5*T
A3=(z+0.3)*0.17/T

%script 2
global A1
global A2
global A3
Result=(A1+0.3)*A2+0.3

%script 3
global Result

Sample=readmatrix(‘experimentaldata’);
XX=sample(1,:)’;
YY=sample(2,:)’;
Xdata=linespace(min(XX),max(XX),2000);
Yadata=(interpl(XX,YY,xdata);
Fitting=lsqscurvefit(Result,T,xdata,ydata,250,2000)

恐怕我在理解您的脚本时有误(包括奇怪的全局变量和系数...)。但直到现在,在我看来,您想将数据拟合到二次多项式中(将 T 视为单个变量,将 x、y、z 视为常数,将 A1 和 A2 插入到您的结果中得到二次多项式)

%Result = (x*0.321*T+0.3)*((y/0.2)+0.5*T)+0.3
Result = @(c,T)c(1)*T^2+c(2)*T^3+c(3);

在这里,你的最终方程形式将如上所示,c 代表你的常量,T 代表你的变量(或 xdata)。 在你弄清楚你的方程形式之后,你应该设置你的初始状态常数 c。在 lsqcurve 中,如他们的解释所示,他们通过迭代直到误差(或欧氏距离)小于给定标准来找到最终答案。因此在这里设置有效的初始值将是关键,如果不是答案将收敛到局部最小值(你可以在这里参考约翰关于这个问题的完美答案,curve fitting error:nlinfit rank deficient)。

c0=[0.1, 0.2, 0.3];

但在这种情况下,我会像上面那样随机给出初始值。
之后,answer(or c) 就可以计算了

Fitting=lsqscurvefit(Result,c0,xdata,ydata)

其他matlab的非线性拟合函数包括nlinfit也有类似的工作流程。我想如果你多注意他们的描述,你可以简单地了解更多关于他们的详细信息。

但就个人而言,如果您的最终方程形式是多项式,我建议您使用 matlab 的 polyfit。然后你不必小心调整你的初始值...