fsolve:对非线性方程组求解

fsolve

对非线性方程组求解

一:语法

x = fsolve (fun,x0)
x = fsolve (fun,x0,options)
x = fsolve (problem)
[ x,fval ] = flsolve ( ____ )
[ x,fval,exitflag,output ] = fsolve( ____ )
[ x,fval,exitflag,output,jacobian ] = fsolve( ____ )

二:说明

1:输入参数

  • fun:要求解的非线性方程组

  • x0:解的初值

  • options:指定优化选项求解方程。使用 optimoptions 设置优化选项

    • offnone不显示输出
    • iter显示每次迭代的输出
    • final(默认值)仅显示最终输出
  • problem:问题结构体。将输入的参数封装在一个problem结构体对象中

    字段名称 条目
    objective 目标函数
    x0 x 的初始点
    solver 'fsolve'
    options optimoptions 创建的选项

2:输出参数

  • x:解

  • fval:输出将求解的值代入方程组中的结果

  • exitflag - fsolve 停止的原因

    1 方程已解。一阶最优性很小。
    2 方程已解。x 的变化小于指定容差。
    3 方程已解。残差的变化小于指定容差。
    4 方程已解。搜索方向的模小于指定容差。
    0 迭代次数超出 options.MaxIterations 或函数计算次数超过 options.MaxFunctionEvaluations
    -1 输出函数或绘图函数使算法停止。
    -2 方程未得解。退出消息可能包含详细信息。
    -3 方程未得解。信赖域半径变得太小(trust-region-dogleg 算法)。
  • output - 有关优化过程的信息

  • jacobian - 解处的 Jacobian 矩阵

想要了解更多内容,可以访问matlab中关于fsolve文档

输出可以是多个也可是单个,或者指定哪些输出

三:示例

三维非线性方程组的求解

此示例说明如何求解含有三个变量的三个方程的非线性方程组。

{ 3 x 1 − c o s ( x 2 ⋅ x 3 ) − 0.5 = 0 x 1 2 − 81 ⋅ ( x 2 + 0.1 ) 2 + s i n x 3 = 0 e ( − x 1 ⋅ x 2 ) + 20 x 3 + 10 π / 3 − 1 = 0 \left\{ \begin{array}{c} 3x_1-cos(x_2\cdot x3)-0.5=0\\ x_1^2-81\cdot (x_2+0.1)^2+sinx_3=0\\ e^{(-x_1\cdot x_2)}+20x_3+10\pi/3-1=0 \end{array} \right. 3x1cos(x2x3)0.5=0x1281(x2+0.1)2+sinx3=0e(x1x2)+20x3+10π/31=0

1:输入参数求解

1):输入函数

编写一个函数保存上述方程组,并将其命名为root3d

function f = root3d(x)
f1=3*x(1)-cos(x(2)*x(3))-0.5;
f2=x(1)^2-81*(x(2)+0.1).^2+sin(x(3))+1.06;
f3=exp(-x(1).*x(2))+20*x(3)+10*pi/3-1;
f=[f1 f2 f3];
end
2):求解方程

取初值 x 0 = [ 0 , 0 , 0 ] x_0=[0,0,0] x0=[0,0,0]

% 调用 root3d.m 文件中的方程组
fun = @root.3d;
% 定义初始值
x0 = [0,0,0];
% 定义options
options = optimoptions('fsolve','Display','iter');
[x,fval,exitflag] = fsolve(fun,x0)
3):输出结果
Iteration  Func-count     f(x)        Norm of step   First-order optimality   Trust-region radius
     0          4         111.975                             210                   1
     1          8       0.0628196       0.724183             3.38                   1
     2         12     0.000786776      0.0186089            0.462                1.81
     3         16     5.55072e-08     0.00170612          0.00382                1.81
     4         20     2.96237e-16    1.45752e-05         2.79e-07                1.81
x =
	0.5000    0.0000   -0.5236
fval =  

   1.0e-07 *
   
    0.0003   -0.1721    0.0003
    % 从输出的fval来看,其值非常接近零,求解出来的x值是非常精确的
exitflag =

     1

2:使用problem结构体求解

依然使用上一步建立的root3d.m文件

1):在结构体中定义其他参数
problem.options=optimoptions('fsolve','Display','iter');
problem.objective = @root3d;
problem.x0 = [0,0,0];
problem.solver = 'fsolve';
2):求解
[x,fval] = fsolve(problem)
3)输出结果
Iteration  Func-count     f(x)        Norm of step   First-order optimality   Trust-region radius
     0          4         111.975                             210                   1
     1          8       0.0628196       0.724183             3.38                   1
     2         12     0.000786776      0.0186089            0.462                1.81
     3         16     5.55072e-08     0.00170612          0.00382                1.81
     4         20     2.96237e-16    1.45752e-05         2.79e-07                1.81
x =
    0.5000    0.0000   -0.5236

fval =

   1.0e-07 *

    0.0003   -0.1721    0.0003

希望能给大家一些帮助!!!

你可能感兴趣的:(matlab,算法,matlab,开发语言)