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
设置优化选项off
或none
不显示输出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. ⎩ ⎨ ⎧3x1−cos(x2⋅x3)−0.5=0x12−81⋅(x2+0.1)2+sinx3=0e(−x1⋅x2)+20x3+10π/3−1=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
希望能给大家一些帮助!!!