作业帮 > 综合 > 作业

matlab非线性优化的求解

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/10/02 03:28:33
matlab非线性优化的求解
function f=curvefun1(x,tdata)
f=x(1)*x(3)/(x(1)-x(2))*(exp(-x(2)*tdata)-exp(-x(1)*tdata))
tdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16];
cdata=[15 32 38 41 41 40 35 35 28 25 24 20 20 18 17 14 11 10 9 6 6 4 3];
x0=[]
x=lsqcurvefit('curvefun1',x0,tdata,cdata)
f=curvefun1(x,tdata)
x0中应该填什么?我这个程序还有错误吗?
求指导啊
参考代码如下:function zd
tdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16];
cdata=[15 32 38 41 41 40 35 35 28 25 24 20 20 18 17 14 11 10 9 6 6 4 3];
x0=[1 2 3];
opt=optimset('MaxFunEvals',1e5,'MaxIter',1e5);
x=lsqcurvefit(@curvefun1,x0,tdata,cdata,[],[],opt);
f=curvefun1(x,tdata);
plot(tdata,cdata,'b.-',tdata,f,'r:x')
legend('原始数据','拟合数据')

function f=curvefun1(x,tdata)
f=x(1)*x(3)/(x(1)-x(2))*(exp(-x(2)*tdata)-exp(-x(1)*tdata)); 拟合结果如下图所示:说明:这是一个拟合问题,也算是非线性优化的一种情况;根据拟合函数的形式看,有三个拟合参数,所以初值x0应该有三个元素,原则上可以任意选取,但不同的初值有可能会影响到结果.另外,从表达式看,x(1)和x(2)不能相同.这里取x0=[1 2 3],拟合成功,从图中看效果还不错,结果为[2.0852  0.1655  50.0662].函数curvefun1中的表达式有错,其中有一个全角括号.代码分成两部分,一部分用于定义拟合函数,另一部分是主程序.为了方便保存到同一个文件中,把主程序也定义为函数,并且放在代码的最前面.按照优化的默认参数设置,得到的结果不足以满足精度要求,所以,用optimset更改优化的设置.其它一些小的细节,比如是否在语句后加分号,不是大问题,稍微注意点就好.写了不少,希望能帮到楼主.