MATLAB GUI设计入门与实战
上QQ阅读APP看书,第一时间看更新

1.8 非线性方程组求解

方程组求解包括线性方程组求解和非线性方程组求解,非线性方程组求解包括线性规划求解和非线性规划求解方法。

1.8.1 线性规划求解

线性规划问题是目标函数和约束条件均为线性函数的问题,在MATLAB 2014a版中,线性规划问题解决函数为linprog,程序代码如下。

    >> help linprog
    linprog - Solve linear programming problems
    
        This MATLAB function solves min f'*x such that A*x ≤ b.
    
        x = linprog(f,A,b)           % 求min f'x,xRn
        x = linprog(f,A,b,Aeq,beq)   % 等式约束Aeq·x=beq,若没有不等式约束A·xb,
                                       则A=[ ],b=[ ]。
        x = linprog(f,A,b,Aeq,beq,lb,ub) % 指定x的范围lbxub,若没有等式约束
                                           Aeq·x=beq,则Aeq=[ ],beq=[ ]
        x = linprog(f,A,b,Aeq,beq,lb,ub,x0)  %设置初值x0
        x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) % options为指定的优化参数

求解下面的优化问题:

其中:

编写MATLAB程序如下;

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all          % 清理命令区、清理工作区、关闭显示图形
    warning off                   % 消除警告
    feature jit off              % 加速代码运行
    format shortE
    tic                          % 运算计时
    f=[-25,-40,-61];              % 目标方程系数
    A =[1 -1  1;                  % 不等式约束左侧系数
        3  2  4;
        3  2  0];
    b = [20; 42; 30];              % b
    lb = zeros(3,1);               % 下限大于等于0
    [x,object] = linprog(f,A,b,[],[],lb,[])
    toc  % 计时结束

运行程序结果如下:

    Optimization terminated.
    x =
       9.2721e-11
       1.5000e+01
       3.0000e+00
    
    object =
      -7.8300e+02
    
    时间已过 0.072996 秒。
    >>

1.8.2 非线性规划求解

在MATLAB中使用fminbnd函数求单变量函数最小值。

    >>  help fminbnd
    fminbnd - Find minimum of single-variable function on fixed interval
    
        This MATLAB function returns a value x that is a local minimizer of the function
        that is described in fun in the interval x1 < x < x2.
    
    x = fminbnd(fun,x1,x2)    %返回自变量x在区间x1<x<x2上函数fun取最小值时的x值
    x = fminbnd(fun,x1,x2,options)             % options为指定优化参数选项
    [x,fval] = fminbnd(…)                    % fval为目标函数的最小值
    [x,fval,exitflag] = fminbnd(…)           % xitflag为终止迭代的条件
    [x,fval,exitflag,output] = fminbnd(…)    % output为优化信息

计算下面函数在区间(0,1)内的最小值:

编写MATLAB程序如下:

    clc,clear,close all      % 清理命令区、清理工作区、关闭显示图形
    warning off               % 消除警告
    feature jit off          % 加速代码运行
    format short
    tic  % 运算计时
    [x,fval,exitflag,output]=fminbnd('(4*x^3+2*cos(x)+3*x*log(x))/(2*exp(x))',0,1)
    toc  % 计时结束
    
    x =
        0.3719
    fval =
        0.3328
    exitflag =
         1
    output = 
        iterations: 8
        funcCount: 9
        algorithm: 'golden section search, parabolic inte...'
        message: '优化已终止:
        当前的 x 满足使用 1.000000e-04 的 OPT...'
    时间已过 0.198718 秒。

MATLAB还提供了求解非线性有约束的多元函数的最小值函数fmincon。

    >> help fmincon
    fmincon - Find minimum of constrained nonlinear multivariable function
    
        This MATLAB function starts at x0 and attempts to find a minimizer x of the
        function described in fun subject to the linear inequalities A*x ≤ b.
    
        x = fmincon(fun,x0,A,b)
        x = fmincon(fun,x0,A,b,Aeq,beq)
        x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
        x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
        x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
        x = fmincon(problem)

求下面函数在初始点(0,1)处的最优解:

其中:

先在MATLAB编辑器中建立非线性约束函数文件:

    function  [c, ceq] = non_constraint(x)
    c=(x(1)-1)^2-x(2);     % 不等式约束
    ceq=[0];               % 无等式约束
    end

编写MATLAB主程序如下:

    % Designed by Yu Shengwei From SWJTU University
    % 2014年12月29日
    clc,clear,close all      % 清理命令区、清理工作区、关闭显示图形
    warning off               % 消除警告
    feature jit off          % 加速代码运行
    format short
    tic                      % 运算计时
    fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)';     %目标函数
    x0=[0 1];                   % 初值
    A=[-2 3];                   % 线性不等式约束
    b=6;                       % 线性不等式约束
    Aeq=[ ];                    % 无线性等式约束
    beq=[ ];                    % 无线性等式约束
    lb=[ ];                  % x没有下界
    ub=[ ];                     % x没有上界
    [x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@non_constraint)
    toc  % 计时结束

运行程序结果如下:

    x =
        2.9994    3.9992
    
    fval =
      -13.0000
    
    时间已过 0.127847 秒。