非线性方程组的求解

非线性方程组的数学模型为

\[F(x)=0\]

式中,x为一矢量,F(x)为一函数,返回矢量值。

在MATLAB中,用fsolve函数求解非线性方程组。其算法基于最小二乘法。fsolve函数的调用格式为:

x = fsolve(fun, x0) 初值为x0,试图求解由fun函数描述的等式系统。

x = fsolve(fun, x0, options) 用options结构指定的优化参数进行最小化。

x = fsolve(fun, x0, options, P1, P2,...) 将问题参数P1、P2等直接传递给fun函数。

[x, fval] = fsolve(fun, x0) 返回解x处的目标函数fun的值。

[x, fval, exitflag] = fsolve(...) 返回exitflag参数,描述函数的退出条件。

[x, fval, exitflag, output] = fsolve(...) 返回包含优化信息的结构输出output。

[x, fval, exitflag, output, jacobian] = fsolve(...) 返回解x处的fun函数的雅可比(Jacob)矩阵。

【例25】 求解下列方程组:

\[\begin{matrix} 2{x}_{1}-{x}_{2}={e}^{-{x}_{2}} \\ -{x}_{1}+2{x}_{2}={e}^{-{x}_{2}} \end{matrix}\]

假设初值为x0 = [-5, -5]。

首先编写一个M文件fsolveo.m,计算x处等式的值F。

code.matlab
function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
      -x(1) + 2*x(2) - exp(-x(2))];

下一步调用优化函数:

code.matlab
>> x0 = [-5; -5];                          	% 初值
>> options=optimset('Display', 'iter');        	% 输出显示的选项
>> [x, fval] = fsolve(@fsolveo, x0, options) 	% 调用优化函数

计算结果为:

code.matlab
x =
    0.5671
    0.5671
fval =
  1.0e-006 *
   -0.4059
   -0.4059

【例26】求矩阵x,使其满足方程

\[X*X*X=\left[ \begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix} \right]\]

初值为x = [1, 1; 1, 1]

首先编写一待求等式的M文件fsolve2o.m。

code.matlab
function F = myfun(x)
F = x*x*x-[1, 2; 3, 4];

然后调用优化过程:

code.matlab
>> x0 = ones(2, 2);                 % 设初值
>> options = optimset('Display', 'off');  % 取消显示
>> [x, Fval, exitflag] = fsolve(@fsolve2o, x0, options)

计算结果为:

code.matlab
x =
   -0.1291    0.8602
    1.2903    1.1612
Fval =
   1.0e-11 *
   -0.3505    0.1633
    0.2417   -0.1111
exitflag =
     1