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目标函数
    x0x 的初始点
    solver'fsolve'
    optionsoptimoptions 创建的选项

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

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

  • 17
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值