1、1/20,第 6 讲 Matlab 方程求解与优化问题,6.1 方程求解6.2 无约束优化问题6.3 有约束优化问题6.4 线性规划问题,2/20,6.1 方程数值求解,6.1.1 单变量非线性方程求解在 Matlab 中提供了一个 fzero 函数, 可以用来求单变量非线性方程的根。该函数的调用格式为: z=fzero(filename, x0)其中,filename 是待求根的函数文件名,x0 为搜索的起点。一个函数可能有多个根,但 fzero 函数只给出距离 x0 最近的那个根。,3/20,例 6-1 求 f(x)=x-10x+2=0 在 x0=0.5 附近的根。步骤如下:(1) 建立函
2、数文件 funx.m. function fx=funx(x) fx=x-10.x+2;(2) 调用 fzero 函数求根。 z=fzero(funx,0.5) z = 0.3758,Ex: 求方程 在 附近的根。,4/20,6.1.2 非线性方程组的求解对于非线性方程组 F(X)=0,用 fsolve 函数求其数值解。fsolve 函数的调用格式为: x=fsolve(filename, x0, option)其中 x 为返回的解,filename 是用于定义需求解的非线性方程组的函数文件名,x0 是求根过程的初值,option 为设定的最优化工具箱的选项。最优化工具箱提供了 20 多个优化
3、参数选项,用户可以使用optimset 命令将它们显示出来。如果想改变其中某个选项,则可以调用 optimset( ) 函数来完成。例如,Display 选项决定函数调用时中间结果的显示方式,其中off 为不显示,iter 表示每步都显示,final 只显示最终结果。optimset(Display, off) 将设定 Display 选项为 off.,5/20,例 6-2 求下列非线性方程组在 (0.5, 0.5) 附近的数值解。(1) 建立函数文件 myfun.m.function q=myfun(p)x=p(1);y=p(2);q(1)=x-0.6*sin(x)-0.3*cos(y);q
4、(2)=y-0.6*cos(x)+0.3*sin(y);(2) 在给定的初值 x0=0.5, y0=0.5 下, 调用 fsolve 函数求方程的根。x=fsolve(myfun,0.5,0.5,optimset(Display,off),6/20,x = 0.6354 0.3734将求得的解代回原方程,可以检验结果是否正确,命令如下:q=myfun(x)q = 1.0e-009 * 0.2375 0.2957可见得到了较高精度的结果。,7/20,6.2 无约束最优化问题求解,6.2.1 非线性一元函数的最小值Matlab 命令为 fminbnd, 其调用格式为X=fminbnd(fun, x
5、1, x2)X, fval, exitflag, output=fminbnd(fun, x1, x2)其中, fun 为目标函数, x1, x2 为变量的边界约束, 即 x1xx2, x 为最小值点,fval 为最小值。exitflag 返回算法的终止标志, exitflag0 表示计算收敛, exitflag=0 表示超过了最大的迭代次数, exitflag0 表示计算不收敛。output 返回优化算法信息的一个数据结构,其中包含三个分量: iterations: 优化过程中迭代次数, funcCount: 代入函数值的次数;algorithm: 优化所采用的算法。,8/20,例 6-3
6、求 f(x)=x3-2x-5 在 0, 5 内的最小值点与最大值点。(1) 建立函数文件 mymin.mfunction fx=mymin(x)fx=x.3-2*x-5;(2) 调用 fmin 函数求最小值点与最大值点。xmin=fminbnd(mymin,0,5)xmin= 0.8165,9/20,例 6-4 求函数 f(x) 在区间 -2, 2 上的最小值和相应的 x 值。,解:Matlab 程序为,fun=(x5+x3+x2-1)/(exp(x2)+sin(-x) ezplot(fun,-2,2) % 绘图X,fval,exitflag,output= fminbnd(fun,-2,2)
7、,X =0.2176 fval =-1.1312 exitflag =1output = iterations: 12 funcCount: 13 algorithm: golden section search, parabolic interpolation message: 1x112 char,10/20,6.2.2 非线性多元函数的最小值Matlab 提供了两个命令:fminsearch, fminunc, 前者适合处理阶次低但是间断点多的函数, 后者则对于高阶连续函数比较有效。fminsearch 的调用格式为:x=fminsearch(fun, x0)x, fval, exitf
8、lag, output=fminsearch(fun, x0, options)该命令可求解目标函数 fun 的极小值点 x 和相应的最小值 fval, x0 为 x 的初始值。其余参数同 fminbnd.options 是一个结构, 里面有控制优化过程的各种参数, 可以使用optimset 命令来设置, 一般情况下不必改动它,使用默认设置就可以了。,11/20,fminunc 的调用格式为:x=fminunc(fun, x0) x, fval, exitflag, output, grad, hessian=fminunc(fun, x0, options)该命令求解目标函数 fun 的极小
9、值点 x 和相应的最小值 fval, x0 为优化的初始值, grad 返回目标函数在最优解点的梯度, hessian 返回最优解点的 hessian 矩阵, 其它参数的意义同 fminsearch.,注意:1、当目标函数的阶数大于 2 时, fminunc 比 fminsearch 更有效。但当目标函数高度不连续时, 使用 fminsearch 效果更好.2、Matlab 没有专门求函数最大值的函数, 但只要注意到 f(x) 在 区间 (a, b) 上的最小值点就是函数 f(x) 在 (a, b) 的最大值点, 所以 fminsearch(-f, x1, x2) 返回函数 f(x) 在区间
10、(x1, x2)上的最大值点。,12/20,例 6-5 求如下函数的最小值。,解:Matlab 程序为,fun=exp(x(1)*(2*x(1)+3*x(2)2+2*x(1)*x(2)+3*x(2)+1);x0=0,0;options=optimset(largescale,off,display,iter,tolx,1e-8,tolfun,1e-8);x,fval,exitflag,output,grad,hessian=fminunc(fun,x0,options),本例的程序对参数 options 进行了设置:largescale, off , 关闭了大规模方式;display 用来控制
11、计算过程的显示;iter 表示显示优化过程的每次计算结果;off 表示不显示所有输出,final仅输出最后结果;tolx 用来控制输入变量 x 的允许误差精度,本例设置为1e-8,tolfun 是控制目标函数的允许误差精度,缺省值是1e-4,本例为1e-8.,13/20,6.3 有约束优化问题,有约束最优化问题一般描述为: min f(x) s.t. G(x) 0其中,x=x1,x2,xn,该数学表示的含义是求一组 x,使得目标函数 f(x) 为最小,且满足约束条件 G(x) 0.约束条件可以进一步细化为:,14/20,Matlab 最优化工具箱提供了一个 fmincon 函数,专门用于求解各
12、种约束下的最优化问题。该函数的调用格式为: x, fval=fmincon(fname, x0, A, b, Aeq, beq, Lbnd, Ubnd, NonF, option)其中,x、fval、filename、x0 和 option 的含义与求最小值函数相同。其余参数为约束条件,参数 NonF 为非线性约束函数的 m 文件名。如果某个约束不存在,则用空矩阵来表示。,15/20,(1) 首先编写目标函数 M 文件 fop.mfunction f=fop(x)f=0.4*x(2)+x(1)2+x(2)2-x(1)*x(2)+1/30*x(1)3;(2) 设定约束条件,并调用 fmincon 函数求解此约束最优化问题:x0=0.5;0.5;A=-1,-0.5;-0.5,-1;b=-0.4,-0.5;lb=0,0;option=optimset; option.LargeScale=off; option.Display=off;x,f=fmincon(fop,x0,A,b,lb,option),例 6-6 求解有约束最优化问题,16/20,6.4 线性规划,6.4.1 Matlab 标准形式及求解,17/20,18/20,19/20,20/20,