已知: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)初值问题:初值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独立性有点疑问;二是用于拟合的数据集偏小。供参考,祝好运。