主要内容

fsolve

解非线性方程组

描述

非线性系统求解器

解决指定的问题

Fx) = 0

x,在那里Fx)是一个返回vector值的函数。

x是向量或矩阵;看到矩阵的参数

例子

x= fsolve (有趣的x0起价x0试着解这些方程有趣的(x) =0,一个由0组成的数组。

例子

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

例子

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

例子

xfval= fsolve(___,对于任何语法,返回目标函数的值有趣的在解决方案中x

例子

xfvalexitflag输出= fsolve(___另外返回一个值exitflag的退出条件fsolve,和结构输出有关优化过程的信息。

xfvalexitflag输出雅可比矩阵= 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}$

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

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

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

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

从这个点开始解方程组(0,0)

Fun = @root2d;X0 = [0,0];X = fsolve(fun,x0)
方程解决。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。X = 0.3532 0.6061

检验一个非线性系统的解的过程。

将选项设置为不显示,并设置一个显示一阶最优性的绘图函数,该函数应在算法迭代时收敛于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}$

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

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

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

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

从这一点出发求解非线性系统(0,0)观察解的过程。

Fun = @root2d;X0 = [0,0];X = fsolve(fun,x0,options)
X = 0.3532 0.6061

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

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

将问题的选项设置为不显示,并设置一个显示一阶最优性的绘图函数,该函数应在算法迭代时收敛于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}$

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

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

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

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

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

问题。目标= @root2d;问题。x0=(0,0);问题。解算器=“fsolve”

解决问题。

X = fsolve(问题)
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,options)
一阶信赖域迭代函数函数数f(x)步进最优半径03 47071.2 2.29e+04 11 6 12003.4 1 5.75e+03 12 9 3147.02 1 1.47e+03 13 12 854.452 1 388 14 15 239.527 1 107 15 18 67.0412 1 30.8 16 21 16.7042 1 9.05 1 7 24 2.42788 1 2.26 18 27 0.032658 0.759511 0.206 2.5 9 30 7.03149e-06 0.111927 0.00294 2.5 10 33 3.29525e-13 0.00169132 6.36e-07 2.5方程求解。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。
x =2×10.5671 - 0.5671
fval =2×1106× -0.4059 -0.4059

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

fval输出给出函数值F (x),在解(到FunctionTolerance公差)。

找到一个矩阵 X 满足

X X X 1 2 3. 4

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

Fun = @(x)x*x*x - [1,2;3,4];X0 = ones(2);

将选项设置为不显示。

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

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

[x,fval,exitflag,output] = fsolve(fun,x0,options)
x =2×2-0.1291 0.8602 1.2903 1.1612
fval =2×2109× -0.1618 0.0778 0.1160 -0.0474
Exitflag = 1
输出=带字段的结构:迭代:6 funcCount: 35算法:'trust-region-dogleg' firstorderopt: 2.4095e-10 message: '…'

退出标志值为1表示解决方案可靠。要手动验证这一点,请计算残差(fval的平方和),看看它有多接近零。

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

这个小残差证实了这一点x是一个解。

你可以看到输出结构有多少迭代和函数计算fsolve执行以找到解决方案。

输入参数

全部折叠

要求解的非线性方程,指定为函数句柄或函数名。有趣的一个函数接受一个向量吗x并返回一个向量F,求值为的非线性方程x.要解的方程是F的所有分量= 0F.这个函数有趣的是否可以指定为文件的函数句柄

X = fsolve(@myfun,x0)

在哪里myfun是一个MATLAB®函数如

函数F = myfun(x) F =…计算x处的函数值

有趣的也可以是匿名函数的函数句柄。

X = fsolve(@(X)sin(X .* X),x0);

如果用户定义的值为x而且F是数组,它们使用线性索引转换为向量(参见数组索引).

如果雅可比矩阵也可以计算而且“SpecifyObjectiveGradient”选择是真正的,由

options = optimoptions('fsolve',' speciyobjectivegradient ',true)

这个函数有趣的必须在第二个输出参数中返回雅可比矩阵值J,一个矩阵,在x

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

例子:Fun = @(x)x*x*x-[1,2;3,4]

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

初始点,指定为实向量或实数组。fsolve的元素数量和大小x0确定变量的数量和大小即有趣的接受。

例子:X0 = [1,2,3,4]

数据类型:

的优化选项,指定为的输出optimoptions或者一个结构,比如optimset的回报。

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

中缺少一些选项optimoptions显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项

所有的算法
算法

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

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

来设置一些算法选项optimset而不是optimoptions

  • 算法—设置算法为“trust-region-reflective”而不是“信赖域”

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

CheckGradients

比较用户提供的导数(目标或约束的梯度)与有限差分导数。选项是真正的或者默认值

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

诊断

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

DiffMaxChange

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

DiffMinChange

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

显示

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

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

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

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

  • “最后一次”(default)只显示最终输出,并给出默认的退出消息。

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

FiniteDifferenceStepSize

有限差分的标量或矢量步长因子。当你设置FiniteDifferenceStepSize到一个向量v,正向有限差分δ

delta = v *符号' (x).*max(abs(x),TypicalX);

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

delta = v.*max(abs(x),TypicalX);

标量FiniteDifferenceStepSize展开成一个向量。默认为sqrt (eps)对于正向有限差分,和eps ^ (1/3)对于中心有限差分。

optimset,名字是FinDiffRelStep.看到当前和遗留选项名称

FiniteDifferenceType

有限差分,用来估计梯度,是“前进”(默认),或“中央”(中心)。“中央”需要两倍的函数计算,但应该更准确。

该算法在估计这两种类型的有限差分时谨慎地服从边界。例如,它可以取一个后向差分,而不是前向差分,来避免在边界外求值。

optimset,名字是FinDiffType.看到当前和遗留选项名称

FunctionTolerance

函数值上的终止公差为正标量。默认为1 e-6.看到公差和停止标准

optimset,名字是TolFun.看到当前和遗留选项名称

FunValCheck

检查目标函数值是否有效。“上”当目标函数返回值为时,显示错误复杂的,或.默认的,“关闭”,显示无错误。

MaxFunctionEvaluations

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

optimset,名字是MaxFunEvals.看到当前和遗留选项名称

MaxIterations

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

optimset,名字是麦克斯特.看到当前和遗留选项名称

OptimalityTolerance

一阶最优性(正标量)上的终止容差。默认为1 e-6.看到一阶最优测度

在内部,“levenberg-marquardt”算法采用的最优公差(停止准则)为1的军医FunctionTolerance并且不使用OptimalityTolerance

OutputFcn

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

PlotFcn

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

  • “optimplotx”绘制当前点。

  • “optimplotfunccount”绘制函数计数。

  • “optimplotfval”绘制函数值。

  • “optimplotstepsize”绘制步长。

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

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

optimset,名字是PlotFcns.看到当前和遗留选项名称

SpecifyObjectiveGradient

如果真正的fsolve使用用户定义的雅可比矩阵(定义在有趣的),或雅可比矩阵信息(当使用JacobianMultiplyFcn),为目标函数。如果(默认),fsolve用有限差分近似雅可比矩阵。

optimset,名字是雅可比矩阵这些值是“上”“关闭”.看到当前和遗留选项名称

StepTolerance

终止公差x,为正标量。默认为1 e-6.看到公差和停止标准

optimset,名字是TolX.看到当前和遗留选项名称

TypicalX

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

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

UseParallel

真正的fsolve并行估计梯度。通过设置为默认值禁用,.看到并行计算

信赖域算法
JacobianMultiplyFcn

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

W = jmfun(Jinfo,Y,flag)

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

[F,Jinfo] = fun(x)

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

  • 如果标志== 0W = j '*(j * y)

  • 如果标志> 0W = j * y

  • 如果标志< 0W = j '* y

在每种情况下,J没有显式地形成。fsolve使用动力系统计算预条件。看到传递额外参数有关如何为任何附加参数提供值的信息jmfun的需求。

请注意

“SpecifyObjectiveGradient”必须设置为真正的fsolve通过动力系统有趣的jmfun

看到密结构黑森最小化,线性等式对于一个类似的例子。

optimset,名字是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.默认行为是ifJacobPattern是1的密集矩阵。然后fsolve在每次迭代中计算一个完整的有限差分近似。对于较大的问题,这可能代价非常大,因此通常最好确定稀疏性结构。

MaxPCGIter

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

PrecondBandWidth

PCG预调节器的上带宽,非负整数。默认的PrecondBandWidth,这意味着使用直接因式分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但产生了更好的解决方案。集PrecondBandWidth0对于某些问题,中间带宽可以减少PCG迭代次数。

SubproblemAlgorithm

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

TolPCG

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

Levenberg-Marquardt算法
InitDamping

Levenberg-Marquardt参数的初始值,一个正标量。默认是1)依照.详细信息请参见Levenberg-Marquardt方法

ScaleProblem

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

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

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

字段名 条目

客观的

目标函数

x0

起始点x

解算器

“fsolve”

选项

创建的选项optimoptions

数据类型:结构体

输出参数

全部折叠

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

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

原因fsolve停止,以整数形式返回。

1

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

2

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

3.

方程解决。残留量变化小于规定公差。

4

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

0

超过迭代次数选项。麦克斯特ations或者超出了函数求值的数量选项。MaxFunctionEvaluations

-1

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

-2

方程未解。退出消息可以包含更多信息。

3

方程未解。信任区域半径太小(trust-region-dogleg算法)。

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

迭代

迭代次数

funcCount

函数求值的数量

算法

所使用的优化算法

cgiterations

PCG的总迭代次数(“信赖域”算法只)

stepsize

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

firstorderopt

一阶最优性的度量

消息

退出消息

解处的雅可比矩阵,作为实矩阵返回。雅可比矩阵(i, j)的偏导数是有趣的(我)关于x (j)在解决方案中x

限制

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

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

  • 默认的信赖域狗腿方法只能在方程组是平方的情况下使用,即方程的数量等于未知量的数量。对于Levenberg-Marquardt方法,方程组不一定是平方的。

提示

  • 对于较大的问题,即具有数千个或更多变量的问题,可以通过设置算法选项“信赖域”SubproblemAlgorithm选项“重心”

算法

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

  • 默认情况下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优化期刊,第6卷,第418-445页,1996年。

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

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

[4] Levenberg, K.,“在最小二乘中解决某些问题的方法”应用数学季刊2,第164-168页,1944。

[5] Marquardt, D.,“非线性参数的最小二乘估计算法”,应用数学杂志,卷11,第431-441页,1963年。

[6] Moré, J. J.,“Levenberg-Marquardt算法:实现与理论”,数值分析华森主编,《数学讲稿》630,施普林格Verlag出版社,第105-116页,1977。

[7] Moré, J. J. B. S. Garbow和K. E. Hillstrom,MINPACK用户指南阿贡国家实验室,报告。退火- 80 - 74,1980。

[8] Powell, m.j.d.,“求解非线性代数方程组的Fortran子程序”,非线性代数方程的数值方法, P. Rabinowitz主编,Ch.7, 1970。

扩展功能

R2006a之前介绍