fsolve
解非线性方程组
语法
描述
例子
二维非线性系统的解
这个例子展示了如何在两个变量中求解两个非线性方程。方程是
把方程转换成这个形式.
写一个函数来计算这两个方程的左边。
函数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);
非线性系统中的方程为
把方程转换成这个形式.
写一个函数来计算这两个方程的左边。
函数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
求解参数化方程
您可以按照主题中的描述对方程进行参数化传递额外参数.例如,paramfun
的辅助函数。本例结束创建参数化为的下列方程
:
在这种情况下,解方程组得到一个特定的值
,设置
中创建匿名函数x
从paramfun
.
C = -1;Fun = @(x)paramfun(x,c);
从这个点开始求解方程组X0 = [0 1]
.
X0 = [0 1];X = fsolve(fun,x0)
方程解决。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。
x =1×20.1976 - 0.4255
来求不同的值
,输入
,并创建有趣的
函数,所以它有新的
价值。
C = -2;Fun = @(x)paramfun(x,c);% fun现在有了新的c值X = fsolve(fun,x0)
方程解决。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。
x =1×20.1788 - 0.3418
Helper函数
此代码创建paramfun
helper函数。
函数F = paramfun (x, c) F = [2 * x(1) +(2)——exp (c * x (1)) * x - x (1) + 2 (2) - exp (c * x (2)));结束
解决问题结构
创建一个问题结构fsolve
解决问题。
解决同样的问题使用非默认选项的解决方案,而是用问题结构来表述问题。
将问题的选项设置为不显示,并设置一个显示一阶最优性的绘图函数,该函数应在算法迭代时收敛于0。
问题。选项=optimoptions(“fsolve”,“显示”,“没有”,“PlotFcn”, @optimplotfirstorderopt);
非线性系统中的方程为
把方程转换成这个形式.
写一个函数来计算这两个方程的左边。
函数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
非线性系统的求解过程
此示例返回迭代显示,显示了两个方程和两个未知数组成的系统的求解过程
把方程式改写成这个形式 :
开始寻找解决方案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
公差)。
检验矩阵方程解
找到一个矩阵 满足
,
从这一点开始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×2108× -0.1895 0.0868 0.1302 -0.0595
Exitflag = 1
输出=带字段的结构:迭代:10 funcCount: 47算法:'trust-region-dogleg' firstorderopt: 2.7719e-09消息:'方程解决....'
退出标志值为1表示解决方案可靠。要手动验证这一点,请计算残差(fval的平方和),看看它有多接近零。
sum (sum (fval。* fval))
Ans = 6.3961e-18
这个小残差证实了这一点x
是一个解。
你可以看到输出
结构有多少迭代和函数计算fsolve
执行以找到解决方案。
输入参数
有趣的
- - - - - -要解的非线性方程
函数处理|函数名
要求解的非线性方程,指定为函数句柄或函数名。有趣的
一个函数接受一个向量吗x
并返回一个向量F
,求值为的非线性方程x
.要解的方程是F
的所有分量= 0F
.这个函数有趣的
是否可以指定为文件的函数句柄
X = fsolve(@myfun,x0)
在哪里myfun
是一个MATLAB®函数如
函数F = myfun(x...计算x处的函数值
有趣的
也可以是匿名函数的函数句柄。
X = fsolve(@(X)sin(X .* X),x0);
fsolve
通过x
目标函数的形状x0
论点。例如,如果x0
是一个5乘3的数组吗fsolve
通过x
来有趣的
作为一个5 × 3的数组。
如果雅可比矩阵也可以计算而且的“SpecifyObjectiveGradient”
选择是真正的
,由
选项= optimoptions(“fsolve”,“SpecifyObjectiveGradient”,真正的)
这个函数有趣的
必须在第二个输出参数中返回雅可比矩阵值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
|字符串
x0
- - - - - -初始点
真正的向量|真正的数组
选项
- - - - - -优化选项
的输出optimoptions
|结构optimset
返回
的优化选项,指定为的输出optimoptions
或者一个结构,比如optimset
的回报。
一些选项适用于所有算法,而其他选项则与特定算法相关。看到优化选项参考有关详细信息。
中缺少一些选项optimoptions
显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项.
所有的算法 | |
算法 |
之间做出选择 的 来设置一些算法选项
|
CheckGradients |
比较用户提供的导数(目标或约束的梯度)与有限差分导数。选项是 为 |
诊断 | 显示有关要最小化或解决的功能的诊断信息。选项是 |
DiffMaxChange | 有限差梯度(正标量)变量的最大变化。默认为 |
DiffMinChange | 有限差分梯度(正标量)的最小变量变化。默认为 |
显示 |
显示水平(见迭代显示):
|
FiniteDifferenceStepSize |
有限差分的标量或矢量步长因子。当你设置
符号' (x) =符号(x) 除了符号' (0)= 1 .中心有限差分为
FiniteDifferenceStepSize 展开成一个向量。默认为sqrt (eps) 对于正向有限差分,和eps ^ (1/3) 对于中心有限差分。为 |
FiniteDifferenceType |
有限差分,用来估计梯度,是 该算法在估计这两种类型的有限差分时谨慎地服从边界。例如,它可以取一个后向差分,而不是前向差分,来避免在边界外求值。 为 |
FunctionTolerance |
函数值上的终止公差为正标量。默认为 为 |
FunValCheck | 检查目标函数值是否有效。 |
MaxFunctionEvaluations |
允许的最大函数求值数,一个正整数。默认为 为 |
MaxIterations |
允许的最大迭代次数,一个正整数。默认为 为 |
OptimalityTolerance |
一阶最优性(正标量)上的终止容差。默认为 在内部, |
OutputFcn |
指定优化函数在每次迭代时调用的一个或多个用户定义函数。传递一个函数句柄或函数句柄的单元格数组。默认值为none ( |
PlotFcn |
在算法执行时绘制各种进度度量;从预定义的情节中选择或编写自己的。传递内置绘图函数名、函数句柄或内置绘图函数名或函数句柄的单元格数组。对于自定义绘图函数,传递函数句柄。默认值为none (
自定义绘图函数使用与输出函数相同的语法。看到优化工具箱的输出函数而且输出函数和图函数语法. 为 |
SpecifyObjectiveGradient |
如果 为 |
StepTolerance |
终止公差 为 |
TypicalX |
典型的 的 |
UseParallel |
当 |
信赖域算法 | |
JacobianMultiplyFcn |
雅可比乘法函数,指定为函数句柄。对于大规模的结构化问题,这个函数计算雅可比矩阵的乘积 W = jmfun(Jinfo,Y,flag) 在哪里 [F,Jinfo] = fun(x)
在每种情况下, 请注意
看到密结构黑森最小化,线性等式对于一个类似的例子。 为 |
JacobPattern | 有限差分雅可比矩阵的稀疏模式。集 使用 在最坏的情况下,如果结构是未知的,不要设置 |
MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数,一个正标量。默认为 |
PrecondBandWidth | PCG预调节器的上带宽,非负整数。默认的 |
SubproblemAlgorithm |
确定如何计算迭代步骤。默认的, |
TolPCG | PCG迭代上的终止公差为正标量。默认为 |
Levenberg-Marquardt算法 | |
InitDamping | Levenberg-Marquardt参数的初始值,一个正标量。默认是 |
ScaleProblem |
|
例子:options = optimoptions('fsolve','FiniteDifferenceType','central')
问题
- - - - - -问题的结构
结构
输出参数
fval
-解处的目标函数值
真正的向量
目标函数在解处的值,作为实向量返回。一般来说,fval
=有趣的(x)
.
exitflag
- - -原因fsolve
停止
整数
原因fsolve
停止,以整数形式返回。
|
方程解决。一阶最优性很小。 |
|
方程解决。的变化 |
|
方程解决。残留量变化小于规定公差。 |
|
方程解决。搜索方向的幅度小于规定的公差。 |
|
超过迭代次数 |
|
输出函数或图函数停止算法。 |
|
方程未解。退出消息可以包含更多信息。 |
|
方程未解。信任区域半径太小( |
输出
—优化过程信息
结构
关于优化过程的信息,作为一个带字段的结构返回:
迭代 |
迭代次数 |
funcCount |
函数求值的数量 |
算法 |
所使用的优化算法 |
cgiterations |
PCG的总迭代次数( |
stepsize |
最终位移 |
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。
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
fsolve
金宝app方法支持代码生成codegen
(MATLAB编码器)函数或MATLAB编码器™你必须有一个MATLAB编码器生成代码的许可。目标硬件必须支持标准的双精度浮点计算。金宝app不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能与求解器解决方案不同,特别是金宝搏官方网站对于条件较差的问题。
所有用于生成的代码必须为MATLAB代码。特别是,不能使用自定义黑盒函数作为目标函数
fsolve
.你可以使用coder.ceval
计算用C或c++编写的自定义函数。然而,自定义函数必须在MATLAB函数中调用。fsolve
不支持金宝app问题
用于代码生成的参数。[x,fval] = fsolve(problem)%不支持金宝app
必须使用函数句柄来指定目标函数,而不是字符串或字符名。
X = fsolve(@fun,x0,options)%的金宝app支持%不支持:f金宝appsolve(‘有趣的’,…)或fsolve(“有趣”,…)
对于涉及嵌入式处理器的高级代码优化,还需要一个嵌入式编码器®许可证。
您必须包含的选项
fsolve
并使用optimoptions
.选项必须包括算法
选项,设置为“levenberg-marquardt”
.选项= optimoptions(“fsolve”,“算法”,“levenberg-marquardt”);[x,fval,exitflag] = fsolve(fun,x0,options);
代码生成支持以下选项:金宝app
算法
-肯定是“levenberg-marquardt”
FiniteDifferenceStepSize
FiniteDifferenceType
FunctionTolerance
MaxFunctionEvaluations
MaxIterations
SpecifyObjectiveGradient
StepTolerance
TypicalX
生成的代码具有有限的选项错误检查。更新选项的推荐方法是使用
optimoptions
,不是点表示法。Opts = optimoptions(“fsolve”,“算法”,“levenberg-marquardt”);Opts = optimoptions(Opts,“MaxIterations”1 e4);%推荐选择。MaxIterations = 1e4;%不推荐
不要从文件中加载选项。这样做会导致代码生成失败。相反,在代码中创建选项。
通常,如果您指定了一个不受支持的选项,那么在代码生成期间,该选项将被无声地忽略。金宝app但是,如果使用点表示法指定绘图函数或输出函数,则代码生成可能会产生错误。为了可靠性,请只指定支持的选项。金宝app
由于不支持输出函数和绘图函数,求解器不返回出口标志-1。金宝app
有关示例,请参见为fsolve生成代码.
自动平行支撑金宝app
通过使用并行计算工具箱™自动并行运行计算来加速代码。
要并行运行,请设置“UseParallel”
选项真正的
.
Options = optimoptions('
solvername
”、“UseParallel’,真的)
有关更多信息,请参见在优化工具箱中使用并行计算.
版本历史
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。