首页 > 技术文章 > 多元函数多参数拟合lsqcurvefit

elapsetor 2021-01-22 22:39 原文

多元函数多参数拟合lsqcurvefit

根据已有数据,要拟合已知模型的多元函数参数。

例如二元函数

\[z = f\left( {x,y} \right) = C{x^m}{y^n} \]

根据已有数据拟合\(C\quad m\quad n\)三个参数。

MATLAB采用lsqcurvefit需要注意语法,经常写错,特别注意。


lsqcurvefit函数语法

x = lsqcurvefit(fun,x0,xdata,ydata)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)

[x,resnorm] = lsqcurvefit(…)
[x,resnorm,residual] = lsqcurvefit(…)
[x,resnorm,residual,exitflag] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)
参数说明:
x0为初始解向量;xdata,ydata为满足关系ydata=F(x, xdata)的数据;
lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];
options为指定的优化参数;
fun为待拟合函数,计算x处拟合函数值,其定义为 function F = myfun(x,xdata)
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x处残差的平方和;
residual=fun(x,xdata)-ydata,即在x处的残差;
exitflag为终止迭代的条件;
output为输出的优化信息;
lambda为解x处的Lagrange乘子;
jacobian为解x处拟合函数fun的jacobian矩阵。

下面这个例子是拟合一个二元函数的三个参数。

clc;clear;
q_data = [1.962 3.488 3.924 6.976];
d_data = [4.45	8.01	5.34	9.81];
T_data = [538.82604	560.74205	564.13515	577.05757];
T_data = T_data+273;
QR = -146000/8.314;
k10 = 8.725e9;
alpha10 = -0.08637;
beta10 = 0.008683;

%拟合
m0 = [k10,alpha10,beta10];
mmin = 0.01*m0;
mmax = 100*m0;
f = @(m,x)( m(1)*(1./(x(1,:)).^m(2)).*exp(m(3)./x(1,:)).*exp(QR./x(2,:)) );
Xdata = [q_data;T_data];
[m,resnorm,residual] = lsqcurvefit(f,m0,Xdata,d_data,mmin,mmax);
d_yb = f(m,Xdata);
plot(q_data,d_data,'b*');
hold on
plot(q_data,d_yb,'r-');
% plot(d_data,d_yb);
% fun = 8.725e9*(1./q_data).^(-0.08637).*exp(0.008683./q_data).*exp(QR./T_data);
% plot(d_data,fun);

上面这个例子数据太少,拟合效果不好。

  • lsqcurvefit的第三个参数xdata只能是一个,因此要多元函数自变量写成向量形式。拟合的参数有多个,也写成向量形式即可。

  • 有时候发现lsqcurvefit找不到合适的拟合参数,或许是模型问题,也有可能是参数范围有问题。

  • 如果模型没问题的话,可以先假定一组拟合参数值看看曲线形状,与原始数据进行对比。

  • 如果模型有问题,获得无量纲数,通过遗传编程获得比较好的模型。


复杂的拟合问题有时候还是用软件来得快。

推荐阅读