作业帮 > 综合 > 作业

Matlab多参数函数

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/07/22 03:29:10
Matlab多参数函数
小弟想用三个变量p、q、s拟合出一条关于y的曲线,已知p、q、s各自关于y的关系(都是二次函数),该如何实现呢?
大侠,好人做到底,送佛送上天,现在我告诉您y=x(1)*p.^2+x(2)*p+x(3)*q.^2+x(4)*q+x(5)*s.^2+x(6)*s+x(7);
p=[2500,2640,2700,2800,2850,2900,2950];
q=[360,600,500,500,600,600,500];
s=[0.038417,0.034986,0.0328752,0.031844,0.032493,0.034326,0.033605];
y=[1994,2080,1956,2055,1937,1750,1695];
请您赐教如何猜初值好吗?其他的我都搞定了.
Matlab多参数函数
用函数lsqnonlin
你应该己知p,q,s,y,对吧?拟合只是找他们的关系而己,实际上就是 y = f(p,q,s)
你需要先建一个y_fun.m的function,比如
function res = y_fun(x);
global p q s y;
ymodel = f(p,q,s,x) .你的p,q,s二次函数
res = y - ymodel;
然后运行
x = lsqnonline('y_fun',x0)
x0 是你猜的拟合系数的初始值
x 是拟合系数的解
补充:
我之前说得不是很对,我改一下.
不过,我以前写的就是代码啊.我哭.我哪知道你的p,q,s二次函数什么型啊?比如
ymodel = x(1)*p.^2 + x(2)*q.^2 + x(3)*s.^2 + x(4);
这里面x就是四个项的系数,是你想拟合的.
原来是这么回事,我哭倒了,你早说不得了?这用得着这么麻烦么?几行命令就解决了.看哥哥我教你.
y=x(1)*p.^2+x(2)*p+x(3)*q.^2+x(4)*q+x(5)*s.^2+x(6)*s+x(7);
y,p,q,s已知,为列向量(不要用行,不方便).
SysModel = [ones(length(p),1) p.^2 p q.^2 q s.^2 s]
x = pinv(SysModel)*y
这样就直接算出X了,没那些费劲的事情.
但是你这个SysModel非常不稳定,原因在于p,q,s的数量级不一致,所以如果你想有效地进行pinv逆运算,最好把p,q,s全部化到一个数量级上,比如p/3000,q/1000,s*100,再进行上面运算.算出来的X,再重新乘以相应的系数就可以复原了.比如p.^2*x,那么(p/3000).^2*xnew,这个xnew你现在知道了,那么x就等于xnew/3000/3000.
慢慢消化吧~