主要内容

fsolve

求解非线性方程组

描述

非线性系统解算器

解决指定的问题

Fx) = 0

对于x,在那里Fx)是一个返回向量值的函数。

x是向量或矩阵;看见矩阵参数

例子

x= fsolve (享乐x0开始于x0试着解方程有趣的(x) =0,一个零数组。

请注意

传递额外的参数说明如何向向量函数传递额外参数乐趣(x),如有需要。看见求解参数化方程

例子

x= fsolve (享乐x0选项用中指定的优化选项求解方程选项.使用optimoptions设置这些选项。

例子

x= fsolve (问题解决了问题,中描述的结构问题

例子

x未来值) = fsolve (___,对于任何语法,返回目标函数的值享乐在解决方案x

例子

x未来值exitflag输出) = fsolve (___另外返回一个值exitflag的退出条件fsolve,以及一个结构输出关于优化过程的信息。

x未来值exitflag输出雅可比) = fsolve (___返回的雅可比矩阵享乐在解决方案x

例子

全部崩溃

这个例子展示了如何在两个变量中求解两个非线性方程。方程是

c数组$ $ \开始{}{}& # xA; {e ^ {- {e ^ {({x_1} + {x_2 })}}}} = { 左(x_2} \ {1 + x_1 ^ 2} \) \ \ & # xA; {x_1} \因为\离开({{x_2}} \右)+ {x_2} \罪\离开({{x_1}} \右)= \压裂{1}{2}# xA;公司\{数组}$ $

把方程转换成这种形式$F(x)=\bf{0}$

$$\begin{array}{c}
;{e^{-{e^{-({x_1}+{x_2}}}}-{x_2}\左({1+x_1^2}\右)=0\\
;{x_1}\cos\left({x_2}\right)+{x_2}\sin\left({x_1}\right)
;-\分形{1}{2}=0\结束{array}$$

写一个函数来计算这两个方程的左边。

函数F=root2d(x)F(1)=exp(-exp(-(x(1)+x(2)))-x(2)*(1+x(1)^2);2(x)(x)x(x)x(x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x(x)x)x(x)x)x(x)x)x(x);

将此代码保存为一个名为root2d.m在您的MATLAB®路径上。

从点开始解方程组[0,0]

有趣= @root2d;x0 = (0,0);x0, x = fsolve(有趣)
方程解决。Fsolve完成了,因为函数值的向量接近零(通过函数容差值测量),并且问题出现了规则(通过梯度测量)。X = 0.3532 0.6061

考察一个非线性系统的解过程。

设置选项为不显示,并设置显示一阶最优性的plot函数,该函数在算法迭代时应收敛为0。

选择= optimoptions (“fsolve”“显示”“没有”“PlotFcn”, @optimplotfirstorderopt);

非线性方程组的方程为

c数组$ $ \开始{}{}& # xA; {e ^ {- {e ^ {({x_1} + {x_2 })}}}} = { 左(x_2} \ {1 + x_1 ^ 2} \) \ \ & # xA; {x_1} \因为\离开({{x_2}} \右)+ {x_2} \罪\离开({{x_1}} \右)= \压裂{1}{2}# xA;公司\{数组}$ $

把方程转换成这种形式$F(x)=\bf{0}$

$$\begin{array}{c}
;{e^{-{e^{-({x_1}+{x_2}}}}-{x_2}\左({1+x_1^2}\右)=0\\
;{x_1}\cos\left({x_2}\right)+{x_2}\sin\left({x_1}\right)
;-\分形{1}{2}=0\结束{array}$$

写一个函数来计算这两个方程的左边。

函数F=root2d(x)F(1)=exp(-exp(-(x(1)+x(2)))-x(2)*(1+x(1)^2);2(x)(x)x(x)x(x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x(x)x)x(x)x)x(x)x)x(x);

将此代码保存为一个名为root2d.m在您的MATLAB®路径上。

从这一点开始求解非线性方程组[0,0]并观察解决过程。

有趣= @root2d;x0 = (0,0);x = fsolve(有趣,x0,选项)
X = 0.3532 0.6061

您可以按照主题中描述的方式对方程进行参数化传递额外的参数. 例如paramfun辅助函数在这个例子到此结束创建以下由参数化的方程式系统 c

2 x 1 + x 2 经验值 c x 1 - x 1 + 2 x 2 经验值 c x 2

在这种情况下,要解决系统的特定值 c - 1 ,设置 c 并在中创建匿名函数xparamfun

c = 1;有趣= @ (x) paramfun (x, c);

从根本上解决系统问题X0 = [0 1]

x0=[01];x=F解(乐趣,x0)
方程解决。Fsolve完成了,因为函数值的向量接近零(通过函数容差值测量),并且问题出现了规则(通过梯度测量)。
x=1×20.1976 0.4255

求解的不同值 c ,输入 c ,并创建享乐函数,所以它有新的 c 价值。

c = 2;有趣= @ (x) paramfun (x, c);% fun现在有了新的c值x0, x = fsolve(有趣)
方程解决。Fsolve完成了,因为函数值的向量接近零(通过函数容差值测量),并且问题出现了规则(通过梯度测量)。
x=1×20.1788 - 0.3418

Helper函数

此代码创建paramfunhelper函数。

函数F=paramfun(x,c)F=[2*x(1)+x(2)-exp(c*x(1))-x(1)+2*x(2)-exp(c*x(2))];结束

创建一个问题结构fsolve解决问题。

解决相同的问题带有非默认选项的解决方案,而是用问题结构来表述问题。

设置不显示问题的选项和显示一阶最优性的绘图函数,该函数应在算法迭代时收敛为0。

problem.options=options(“fsolve”“显示”“没有”“PlotFcn”, @optimplotfirstorderopt);

非线性方程组的方程为

c数组$ $ \开始{}{}& # xA; {e ^ {- {e ^ {({x_1} + {x_2 })}}}} = { 左(x_2} \ {1 + x_1 ^ 2} \) \ \ & # xA; {x_1} \因为\离开({{x_2}} \右)+ {x_2} \罪\离开({{x_1}} \右)= \压裂{1}{2}# xA;公司\{数组}$ $

把方程转换成这种形式$F(x)=\bf{0}$

$$\begin{array}{c}
;{e^{-{e^{-({x_1}+{x_2}}}}-{x_2}\左({1+x_1^2}\右)=0\\
;{x_1}\cos\left({x_2}\right)+{x_2}\sin\left({x_1}\right)
;-\分形{1}{2}=0\结束{array}$$

写一个函数来计算这两个方程的左边。

函数F=root2d(x)F(1)=exp(-exp(-(x(1)+x(2)))-x(2)*(1+x(1)^2);2(x)(x)x(x)x(x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x)x(x)x(x)x(x)x)x(x)x)x(x)x)x(x);

将此代码保存为一个名为root2d.m在您的MATLAB®路径上。

在问题结构中创建其余字段。

problem.objective=@root2d;problem.x0=[0,0];problem.solver=“fsolve”

解决这个问题。

x=F解决(问题)
X = 0.3532 0.6061

此示例返回迭代显示,显示两个方程和两个未知数组成的系统的求解过程

2 x 1 - x 2 e - x 1 - x 1 + 2 x 2 e - x 2

将方程式改写为 F x 0

2 x 1 - x 2 - e - x 1 0 - x 1 + 2 x 2 - e - x 2 0

从以下位置开始搜索解决方案:X0 = [-5 -5]

首先,编写一个计算函数F,在x

F = @(x) [2*x(1) -x(2) - exp(-x(1));-x(1) + 2*x(2) - exp(-x(2))];

创建初始点x0

x0 = (5; 5);

设置选项以返回迭代显示。

选择= optimoptions (“fsolve”“显示”“通路”);

解的方程。

[x,fval]=fsolve(F,x0,选项)
一阶规范信赖域迭代Func-count f (x)最优步半径0 3 47071.2 - 2.29 e + 04年1 1 6 12003.4 - 1 5.75 e + 03年1 2 9 3147.02 1.47 e + 03 1 3 12 239.527 854.452 1 388 1 4 15 1 107 1 5 18 67.0412 30.8 1 6 21 16.7042 9.05 1 7 24 0.032658 2.42788 2.26 1 8 27 e-06 0.111927 0.00294 2.5 7.03149 0.759511 0.206 2.5 9 30 10 332.5方程已解。Fsolve完成了,因为函数值的向量接近零(通过函数容差值测量),并且问题出现了规则(通过梯度测量)。
x=2×10.5671 0.5671
fval =2×110-6× -0.4059 -0.4059

迭代显示显示f (x),即函数范数的平方F(x). 随着迭代的进行,该值减小到接近零。随着迭代的进行,一阶最优性度量同样会减少到接近零。这些条目显示迭代收敛到解决方案。有关其他条目的含义,请参见迭代显示

未来值输出给出函数值F(x),它在一个解(到功能公差公差)。

找到一个矩阵 X 满足

X X X 1 2 3. 4

从点开始x0=[1,1;1,1].创建一个匿名函数,用于计算矩阵方程并创建点x0

乐趣=@(x)x*x*x-[1,2;3,4];x0=一(2);

将选项设置为没有显示。

选择= optimoptions (“fsolve”“显示”“关闭”);

检查fsolve输出以查看解决方案的质量和过程。

[x, fval exitflag、输出]= fsolve(有趣,x0,选项)
x=2×20.1291 0.8602 1.2903 1.1612
fval =2×210-9× -0.1618 0.0778 0.1160 -0.0474
exitflag=1
输出=结构体字段:firstderopt: 2.4095e-10 message: '…'

exit标志值为1表示该解决方案是可靠的。为了手动验证这一点,计算残差(fval的平方和),看看它离零有多近。

sum (sum (fval。* fval))
ans=4.7957e-20

这个小的残差证实了这一点x这是一个解决办法。

你可以在地图上看到输出构造多少次迭代和函数求值fsolve执行以找到解决方案。

输入参数

全部崩溃

要解的非线性方程,指定为函数句柄或函数名。享乐是一个接受向量的函数吗x返回一个向量F时,非线性方程在x.要解的方程是F= 0的所有组件F.这个函数享乐可以指定为一个文件的函数句柄

x = fsolve (x0 @myfun)

在哪里我的乐趣MATLAB是一种®等功能

函数F = myfun(x...%计算函数在x处的值

享乐也可以是匿名函数的函数句柄。

x = fsolve (@ (x) sin (x) * x), x0);

fsolve通行证x以目标函数的形式x0论点。例如,如果x0是5乘3的数组吗fsolve通行证x享乐作为一个5乘3的数组。

如果还可以计算雅可比矩阵“SpecificyObjectiveGradient”选择是符合事实的设定的,

选择= optimoptions (“fsolve”“SpecificyObjectiveGradient”,对)

这个函数享乐必须在第二个输出参数中返回雅可比矩阵值J,矩阵,atx

如果享乐返回的向量(矩阵)组件和x长度n,在那里n为长度x0雅可比矩阵J是一个——- - - - - -n矩阵在哪里J (i, J)的偏导数是什么F(i)关于x (j).(雅可比矩阵J是梯度的转置F.)

例子:有趣= @ (x) x * * x - [1, 2, 3, 4)

数据类型:字符|function_handle|字符串

初始点,指定为实向量或实数组。fsolve使用中的元素数量和大小x0要确定享乐接受。

例子:x0 =(1、2、3、4)

数据类型:

优化选项,指定为optimoptions或者一个结构优化集的回报。

有些选项适用于所有算法,而另一些则与特定算法相关。看见优化选择参考有关详细信息。

控件中缺少一些选项optimoptions陈列下表中以斜体显示这些选项。有关详细信息,请参阅查看选项

所有的算法
算法

之间做出选择“trust-region-dogleg”(默认),“信任区”“levenberg-marquardt”

算法选项指定要使用的算法的首选项。这只是一种偏好,因为对于信任域算法,非线性方程组不能欠定;即方程的个数(元素的个数)F返回的享乐)的长度必须至少与x.同样地,对于信任区域狗腿算法,方程的数量必须与长度相等xfsolve当所选算法不可用时,使用Levenberg-Marquardt算法。有关选择算法的更多信息,请参见选择算法

使用来设置一些算法选项优化集而不是optimoptions

  • 算法-将算法设置为“trust-region-reflective”而不是“信任区”

  • InitDamping—设置初始Levenberg-Marquardt参数λ通过设置算法到单元格数组,例如{levenberg-marquardt, .005}

CheckGradients

将用户提供的导数(目标或约束的梯度)与有限差分导数进行比较。选择是符合事实的还是默认值错误的

对于优化集,名字是DerivativeCheck这些值是“上”“关闭”.看到当前和遗留选项名称

诊断学

显示有关要最小化或解决的功能的诊断信息。选项如下“上”还是默认值“关闭”

DiffMaxChange

有限差分梯度(正标量)变量的最大变化量。默认值是

DiffMinChange

有限差分梯度(正标量)变量的最小变化。默认值为0

陈列

显示水平(见迭代显示):

  • “关闭”“没有”显示没有输出。

  • “通路”在每次迭代时显示输出,并给出默认退出消息。

  • “iter-detailed”显示每次迭代的输出,并给出技术退出消息。

  • “决赛”(默认)仅显示最终输出,并给出默认退出消息。

  • 最后详细的仅显示最终输出,并给出技术退出消息。

FiniteDifferenceStepSize

有限差分的标量或向量步长因子。当您设置FiniteDifferenceStepSize一个向量v前向有限差分法希腊字母表的第4个字母

δ= v *标志的(x) *马克斯(abs (x)、TypicalX);

在哪里符号“(x) =符号(x)除了标志' (0)= 1.中心有限差分是

delta=v.*max(绝对值x,典型值x);

标量FiniteDifferenceStepSize展开为向量。默认值是sqrt(每股收益)对于正向有限差分,以及eps ^ (1/3)对于中心有限差分。

对于优化集,名字是FinDiffRelStep.看到当前和遗留选项名称

FiniteDifferenceType

用于估计梯度的有限差分是“前进”(默认),或“中央”(居中)。“中央”需要两倍的函数求值,但应该更精确。

当估计这两种类型的有限差分时,该算法小心地遵守边界。因此,举例来说,它可能需要一个向后的差异,而不是向前的差异,以避免在边界之外的点上求值。

对于优化集,名字是FinDiffType.看到当前和遗留选项名称

功能公差

函数值的终止容限,一个正标量。默认值是1e-6.看到公差和停止标准

对于优化集,名字是托尔芬.看到当前和遗留选项名称

FunValCheck

检查目标函数值是否有效。“上”当目标函数返回的值为复杂的. 默认情况下,“关闭”,则不显示任何错误。

MaxFunctionEvaluations

允许的最大函数求值数,为正整数。默认值为100 * numberOfVariables.看到公差和停止标准迭代和功能计数

对于优化集,名字是MaxFunEvals.看到当前和遗留选项名称

MaxIterations

允许的最大迭代次数,一个正整数。默认值是400.看到公差和停止标准迭代和功能计数

对于优化集,名字是麦克斯特.看到当前和遗留选项名称

最佳耐受性

一阶最优性的终止容限(正标量)。默认值是1e-6.看到一阶最优性测量

在内部,“levenberg-marquardt”算法采用最优容差(停止准则)1e-4功能公差而且不使用最佳耐受性

OutputFcn

指定优化函数在每次迭代时调用的一个或多个用户定义函数。传递一个函数句柄或函数句柄的单元格数组。默认为none ([]).看到输出函数和绘图函数语法

PlotFcn

绘制算法执行时的各种进度度量;从预定义的情节中选择或编写您自己的。传递内置绘图函数名、函数句柄或内置绘图函数名或函数句柄的单元格数组。对于定制的绘图函数,传递函数句柄。默认为none ([]):

  • “optimplotx”绘制当前点。

  • “optimplotfunccount”绘制函数计数。

  • “optimplotfval”绘制函数值。

  • “最佳步长”绘制步长。

  • “optimplotfirstorderopt”绘制一阶最优测度。

自定义绘图函数使用与输出函数相同的语法。看到优化工具箱的输出函数™输出函数和绘图函数语法

对于优化集,名字是PlotFcns.看到当前和遗留选项名称

SpecifyObjectiveGradient

如果符合事实的fsolve使用用户定义的雅可比矩阵(在中定义)享乐),或雅可比矩阵信息(当使用JacobianMultiplyFcn),用于目标函数。如果错误的(默认),fsolve用有限差分近似雅可比矩阵。

对于优化集,名字是雅可比这些值是“上”“关闭”.看到当前和遗留选项名称

StepTolerance

端接公差x,一个正标量。默认值是1e-6.看到公差和停止标准

对于优化集,名字是收费.看到当前和遗留选项名称

典型的

典型的x值。中的元素数典型的等于元素的个数x0,起点。默认值为的(numberofvariables, 1)fsolve使用典型的为梯度估计缩放有限差分。

trust-region-dogleg算法使用典型的作为缩放矩阵的对角项。

使用并行

符合事实的fsolve并行地估计梯度。通过设置为默认值禁用,错误的.看到并行计算

信赖域算法
JacobianMultiplyFcn

雅可比乘函数,指定为函数句柄。对于大规模的结构化问题,这个函数计算雅可比矩阵乘积J * YJ ' * YJ”* (J * Y)没有真正形成J.功能在于形式

W = jmfun(动力系统,Y,标志)

在哪里动力系统包含用于计算的矩阵J * Y(或J ' * YJ”* (J * Y)).第一个参数动力系统必须与目标函数返回的第二个参数相同吗享乐,例如

(F,动力系统)(x) =乐趣

Y是一个矩阵,其行数与问题中的维度数相同。旗帜确定要计算的产品:

  • 如果标志==0W = J ' * (J * Y)

  • 如果国旗> 0W = J * Y

  • 如果国旗< 0W=J'*Y

在每种情况下,J不是明确形成的。fsolve使用动力系统计算前置条件。看到传递额外的参数有关如何为任何其他参数提供值的信息jmfun的需求。

请注意

“SpecificyObjectiveGradient”必须设置为符合事实的对于fsolve通过动力系统享乐jmfun

看到稠密结构Hessian的最小化,线性等式举一个类似的例子。

对于优化集,名字是JacobMult.看到当前和遗留选项名称

JacobPattern

有限差分雅可比矩阵的稀疏模式。设置JacobPattern (i, j) = 1乐趣(一)取决于x (j).否则,设置JacobPattern (i, j) = 0.换句话说,JacobPattern (i, j) = 1你什么时候可以∂乐趣(一)/∂x (j)≠0。

使用JacobPattern当计算雅可比矩阵不方便时J在里面享乐,尽管你可以确定(比如通过检查)何时乐趣(一)取决于x (j)fsolve可以近似J通过稀疏有限差分,当你给出JacobPattern

在最坏的情况下,如果结构未知,则不要设置JacobPattern.默认的行为是JacobPattern是1的密集矩阵。然后fsolve在每次迭代中计算完全有限差分近似值。对于大型问题,这可能非常昂贵,因此通常最好确定稀疏结构。

MaxPCGIter

PCG(预处理共轭梯度)迭代的最大次数,正标量。默认值是马克斯(1楼(numberOfVariables / 2)).有关更多信息,请参见方程求解算法

预带宽

PCG预处理器的上限带宽,一个非负整数。默认值预带宽,这意味着使用直接因子分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但能产生更高质量的求解步骤。设置预带宽0对于对角线预处理(上限带宽为0)。对于某些问题,中间带宽可以减少PCG迭代次数。

子问题算法

确定如何计算迭代步骤。默认的,“因式分解”,比“重心”.看到信赖域算法

TolPCG

PCG迭代上的终止公差,正标量。默认值是0.1

Levenberg-Marquardt算法
InitDamping

Levenberg-Marquardt参数的初值,一个正标量。默认是1e-2.有关详细信息,请参见Levenberg-Marquardt方法

ScaleProblem

的雅可比矩阵有时可以提高一个规模不大的问题的收敛性。默认值是“没有”

例子:options=optimoptions('fsolve','FiniteDifferenceType','central')

问题结构,指定为具有以下字段的结构:

字段名 条目

客观的

目标函数

x0

初始点x

解算器

“fsolve”

选项

选择创建optimoptions

数据类型:结构体

输出参数

全部崩溃

解,返回实向量或实数组。的大小x和尺寸一样吗x0.通常情况下,x什么时候能解决局部问题exitflag这是积极的。有关解决方案质量的信息,请参阅当求解成功时

目标函数在解处的值,作为实向量返回。一般来说,未来值乐趣(x)

原因fsolve已停止,返回为整数。

1

方程解决。一阶最优性很小。

2

方程解决。的变化x小于指定公差或雅可比矩阵的x是未定义的。

3.

方程解决。残余变化小于规定的公差。

4

方程解决。搜索方向小于指定公差的幅度。

0

超过迭代次数options.MaxIterations或超过函数求值次数选项。MaxFunctionEvaluations

-1

输出函数或绘图函数停止算法。

-2

方程没有解决。退出消息可以包含更多信息。

-3

方程没有解决。信任区域半径变小(trust-region-dogleg算法)。

关于优化过程的信息,作为带有字段的结构返回:

迭代

迭代次数

funcCount

函数计算次数

算法

使用的优化算法

CG迭代

PCG迭代总次数(“信任区”算法只)

步长

最终位移x(不是“trust-region-dogleg”

firstorderopt

一阶最优性的度量

消息

退出消息

解的雅可比矩阵,返回实矩阵。雅可比(i,j)的偏导数是什么乐趣(一)关于x (j)在解决方案x

限制

  • 要求解的函数必须是连续的。

  • 一旦成功,fsolve只给出一个根。

  • 默认的信赖域折线法只能在方程组为正方形时使用,即方程组的数量等于未知数的数量。对于Levenberg-Marquardt方法,方程组不必是平方的。

提示

  • 对于大的问题,意味着那些有数千个或更多的变量,通过设置算法选项“信任区”子问题算法选项“重心”

算法

Levenberg-Marquardt方法和信赖域方法基于非线性最小二乘算法,也用于解非线性最小二乘问题.如果系统可能没有零,请使用其中一种方法。算法仍然返回一个残差很小的点。然而,如果系统的雅可比矩阵是奇异的,算法可能会收敛到一个点,而这个点不是方程组的解限制).

  • 默认情况下fsolve选择信任区域的狗腿算法。该算法是Powell狗腿法的一种变体[8]. 它在本质上类似于在中实现的算法[7].看到Trust-Region-Dogleg算法

  • 信赖域算法是一种子空间信赖域方法,基于中描述的内部反射牛顿法[1][2].每次迭代都涉及到使用预条件共轭梯度(PCG)方法求解一个大线性系统的近似解。看到信赖域算法

  • 参考文献中描述了Levenberg-Marquardt方法[4][5][6].看到Levenberg-Marquardt方法

选择功能

应用程序

优化活动编辑器任务为fsolve

参考文献

[1] Coleman, T.F.和Y. Li,“有界非线性极小化的内部信赖域方法”,SIAM优化学报, 1996年第6卷,第418-445页。

[2] Coleman,T.F.和Y.Li,“关于有界的大规模非线性极小化的反射牛顿方法的收敛性,”数学规划,第67卷,第2号,第189-224页,1994年。

[3]丹尼斯,J. E. Jr.,《非线性最小二乘》数值分析的最新进展, D.雅各布斯,学术出版社,269-312页。

[4] Levenberg,《求解最小二乘某些问题的方法》,应用数学季刊2,页164-168,1944。

《非线性参数的最小二乘估计算法》,作者:Marquardt, D。暹罗应用数学杂志,第11卷,第431-4411963页。

[6] Moré, J. J., " Levenberg-Marquardt算法:实现和理论"数值分析,ed.G.A.Watson,《数学课堂讲稿630》,斯普林格·维拉格,第105-116页,1977年。

[7] Moré, J. J., B. S. Garbow, K. E. Hillstrom,MINPACK 1用户指南,阿贡国家实验室,报告。ANL-80-741980年。

[8] Powell, M. J. D.,“求解非线性代数方程组的Fortran子程序”,非线性代数方程的数值方法, P. Rabinowitz,编,ch7, 1970。

扩展能力

在R2006a之前引入