本文主要分两部分:
第一部分介绍matlab中非线性方程求解,
第二部分将介绍如何用matlab去求解函数的极值。
+
一、非线性方程数值求解
1、单变量非线性方程求解
函数的调用格式为:x= fzero(filename,x0)其中,filename是待求根方程左端的函数表达式,x0是初始值。对于此函数,需要注意的是,迭代值初始值x0的选取,在使用该函数进行问题求解时,需要对问题进行多角度分析,大概确定出方程待求根所在范围,由于是单变量非线性方程,根所在范围还是易于确定,而不能机械地直接套用命令或程序。
例、求解方程x-1/x 5=0的根。
>> f=@(x)x-1./x 5;>> x1= fzero (f,-5)x1 = -5.1926>> x2= fzero(f,1)x2 = 0.1926>> x3= fzero(f,0.1)x3 = 3.7372e-16
本例所举的方程较为简单,但要说明一个问题,方程的前两个根都是经过分析,大致判断出方程会在-5和1两处有根,所以迭代初始值选了-5和1,对于x3,是随便取的一个迭代初始值,结果显然错误,因此该函数在使用时要注意先去判断根大概的范围,再进行编写代码,才能得出正确的结果。因此,在使用此函数求解方程的根时,若方程的根难以判断所在范围,不妨将方程左边写成函数形式,绘制出函数一定范围内的图像,找到根的大致区域后再去使用此函数,求解出方程的根。
2、非线性方程组的求解
在 MATLAB 的最优化工具箱中提供了非线性方程组的求解函数fsolve,其调用格式如下:
x= fsolve(filename,x0,option)
其中,x为返回的近似解,filename是待求根方程左端的函数表达式,x0是初值,option用于设置优化工具箱的优化参数,可以调用 optimset函数来完成。例如,Display参数设置为 ‘off’ 时不显示中间结果。
如果用fsolve函数去求解上一个例子的问题,会有什么不同,一起来看一下吧
>> x1=fsolve(f,-5,optimset(‘Display’,’off ‘))x1 = -5.1926>> x2=fsolve(f,1,optimset(‘Display’,’off ‘))x2 = 0.1926>> x3=fsolve(f,0.1,optimset(‘Display’,’off ‘))x3 = 0.1926
前两种结果x1和x2和fzero函数求解出的结果没有区别,但x3的结果确是正确结果,因为不同函数的实现方法不同,适用的场合也不同。总之,多角度选择和分析是很有必要的。
+
二、函数极值的计算
函数极值包括极大值和极小值,或者叫最大值和最小值。MATLAB 只考虑最小值问题的计算,如果要求 f(x) 的最大值,可以通过求- – f(x) 的最小值来解决。
1、无约束最优化问题
字面理解就是没有其它的限制条件,只是求出给定区间上函数的最值即可。求最小值的函数为:
[ xmin,fmin ]= fminbnd(filename,x1,x2,option)[ xmin,fmin ]= fminsearch(filename,x0,option)[ xmin,fmin ]= fminunc(filename,x0,option)
其中,xmin 表示极小值点,fmin 表示最小值,filename 是定义的目标函数。第一个函数的输入变量 xl 、x2分别表示被研究区间的左、右边界。后两个函数的输入变量x0是一个向量,表示极值点的初值。option为优化参数,可以通过optimset函数来设置(参见第一部分)。
关于 option优化参数,可以参考这篇文章(https://blog.csdn.net/listener51/article/details/25164847)
例、求函数f(x)=x-1/x 5,在区间(-10 ,-1) 和 (1 ,10) 上的最小值点。
>> f=@(x)x-1./x 5;>> [xmin,fmin]= fminbnd (f,-10,-1)xmin = -9.9999fmin = -4.8999
2、有约束最优化问题
即求取一组x,使得目标函数 f(x)为最小,且满足约束条件G(x)≤0 。约束条件可以进一步细化为:线性不等式约束、线性等式约束、非线性不等式约束、非线性等式约束以及x的下界和上界。求有约束条件下最小值的函数为:
[ xmin,fmin ]= fmincon (filename,x0,A,b,Aeq,beq,Lbnd,Ubnd,NonF,option)
其中,xmin 、fmin 、filename 、x0 和 option 的含义与求最小值函数相同。其余参数为约束条件:参数值的线性不等式约束A,b参数值的等式线性约束Aeq,beq,参数值的上界和下界Lbnd,Ubnd非线性约束NonF
例、求函数f(x)=0.4×2 x1(2) x2(2)-x1x2 1/30×1(3)在限制条件x1 0.5×2>=0.4;0.5×1 x2>=0.5;x1>=0;x2>=0下的最小值。
>> f=@(x)0.4*x(2) x(1)^2 x(2)^2-x(1)*x(2) 1/30*x(1)^3;x0=[0.5;0.5];A=[-1,-0.5;-0.5,-1];b=[-0.4;-0.5];lb=[0,0];option=optimset(‘Display’,’off’);>> [xmin,fmin ]= fmincon (f,x0,A,b,[],[], lb ,[],[],option)xmin = 0.3396 0.3302fmin = 0.2456
本节就先讲到这里,
下节将推出常微分方程数值求解,敬请期待!
https://zhuanlan.zhihu.com/c_1131568134137692160
欢迎大家加入我们的MATLAB学习交流群:
953314432
往期推荐
数学建模与MATLAB–层次分析法(评价类问题)
傅里叶变换在MATLAB中的应用(频域滤波)
MATLAB中的二维傅里叶变换