matlab 求解要完整答案

来源:百度知道 编辑:UC知道 时间:2024/05/21 12:05:17
r(m) 2 2.5 3 3.5 4
(元)
C 65 170 350 660 1000
知道 c=a*r的b次方 求a b 的值

r=[2,2.5,3,3.5,4];
c=[65,170,350,660,1000];

fun_andy002=inline('ab(1)*r.^ab(2)','ab','r');

[A,res]=lsqcurvefit(fun_andy002,[65,1],r,c)
cfit1=fun_andy002(A,r);
plot(r,c,'r*',r,cfit1)

%法二
r=[2,2.5,3,3.5,4];
c=[65,170,350,660,1000];
K=[ones(size(r')),log(r')];
y=log(c');
ab=K\y;
a=exp(ab(1))
b=ab(2)

cfit2=a*r.^b;
plot(r,c,'r*',r,cfit2)

%%%%%%%%%
两个结果并不是完全相同的。
但个人觉得法二更好。
法二是有技巧的。两边取对数,变成
log(c)=log(a)+b*log(r)
对于log(c)与log(r)来说,它们是直线关系
你把那几个点都代进去,写成矩阵的形式。就是K*ab=y
求这个矩阵就OK了。

matlab 非线性的拟合有两个命令lsqcurvefit和lsqnonlin。这里用lsqcurvefit(lsqnonlin一样做),先介绍下lsqcurvefit(原理是最小二乘法)
已知数据点:xdata=(xdata1,xdata2,…,xdatan)
ydata=(ydata1,ydata2,…,ydatan)
lsqcurvefit用以求含参量x(向量)的向量值函数
F(x,xdata)=(F(x,xdata1),…,F(x,xdatan))T
中的参变量x(向量),使得1/2*∑[a+b*exp(-0.02*k*t(i