利用matlab求解非线性回归模型的常数值,并计算相关系数。个人估计应该用nlinfit,但总出问题。 模型为:

已知:x1=[200,400,600,200,400,600];
x2=[7356,5184,3740,7683,5513,4132];
y=[424700,33230,5520,218120,13680,2810];
我个人程序如下,但是提示错误,请朋友们帮忙看看。
(1)定义function
function yy=myfun(beta,x)
a=beta(1)
b=beta(2)
c=beta(3)
x1=x(:,1);
x2=x(:,2);
yy=beta(1)*((1./x1).^beta(2))*((1./x2).^beta(3))
(2)主程序(试验数据,先用两组拟合。)
x=[200,400,600,200,400,600;7356,5184,3740,7683,5513,4132]'
y=[424700,33230,5520,218120,13680,2810]'
beta0=[10000,3,2]'
beta= nlinfit(x,y,@myfun,beta0)
提示错误:
??? Error using ==> nlinfit
The model function 'myfun' generated the following error:
Error using ==> mtimes
Inner matrix dimensions must agree.
y=k1*(1/x1)^k2*(1/x2)^k3
这是原始模型,以此为准。

第1个回答  2012-10-04
仅就你现在遇到的问题而言,很容易找到原因:乘法需要使用点运算,把
yy=beta(1)*((1./x1).^beta(2))*((1./x2).^beta(3))
改成
yy=beta(1)*((1./x1).^beta(2)).*((1./x2).^beta(3))
即可。

不幸的是,这样程序虽然可以运行,但拟合失败,因为经过几次迭代之后,函数值计算出现非数(NaN),导致计算无法继续进行,换言之,求解过程发散了。

我没有试图替你把这个问题彻底解决,因为我不确定你的问题是否有解以及何种情况下可以求出解来。在此给你提供两个建议供参考:

1、看你程序中的表达式,似乎和图中给的拟合公式并不吻合,程序中使用的是k1*(1/x1)^k2*(1/x2)^k3,到底是想要什么样的拟合公式请核实一下(当然,你也可以说二者是一致的,只不过k相差了个符号而已,但这和下一个问题有关);

2、非线性拟合问题是否收敛,和所给初值有很大关系,所以请最好对k1-k3的数值有个大概的预估,不然随便给个数就去拟合,我就只能祝你好运了。追问

您好。点乘我确实也试过了,和您说的一样出现非数。做以下说明:

1)初值问题:初值K1应该是非常大的10的5次方至10的19次方之间的,K2和K3的值非常可靠, 我这里是参考研究报告的结果。

2)模型问题:模型是疲劳模型,专业方面的,见下图,肯定无误。

3)数据方面:数据是试验数据,从参考资料来看,也是非常可靠的。

非常感谢你,还请你帮忙给出一个算法,具体的拟合可靠度,我再补充数据进行提高。

模型如下:

追答

我换了一个拟合函数,初值也改了改:
beta0=[10000,1,1]';
beta= lsqcurvefit(@myfun,beta0,x,y)
倒是能出来结果,但效果有点差强人意(可以画图对照拟合结果yy和原始数据y):
beta =
9999.56
2.28
-1.74

如果改初值为
beta0=[1000000,0,0]';
结果为
beta =
999993.61
2.48
-1.35

这个结果倒是很容易解释,因为x1是200的倍数,如果系数k1变化100倍,大致可以从k2的变化得到补偿(相应的k3也有变化)。

个人觉得有两个问题:一是三个系数k1-k3独立性有点疑问;二是用于拟合的数据集偏小。供参考,祝好运。

相似回答