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)
。
有趣= @root2d;x0 = (0,0);x0, x = fsolve(有趣)
方程解决。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)
并观察解决方案的过程。
有趣= @root2d;x0 = (0,0);x = fsolve(有趣,x0,选项)
x = 0.3532 - 0.6061
求解参数化方程
可以参数化方程所描述的主题传递额外的参数。例如,paramfun
辅助函数在这个例子创建以下参数化方程系统
:
解决系统为特定值,在这种情况下
,设置
在工作区中创建一个匿名函数x
从paramfun
。
c = 1;有趣= @ (x) paramfun (x, c);
解决系统从点0 x0 = [1]
。
0 x0 = [1];x0, x = fsolve(有趣)
方程解决。fsolve完成因为函数值接近于零的向量的值函数的宽容,问题出现普通的梯度。
x =1×20.1976 - 0.4255
要求一个不同的值
,输入
在工作区中创建有趣的
函数,所以它有新的
价值。
c = 2;有趣= @ (x) paramfun (x, c);现在有新的c值%有趣x0, x = fsolve(有趣)
方程解决。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) - (2) - exp (- x (1));x - x (1) + 2 * (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 2.42788 2.26 1 8 27 7.03149 0.032658 0.759511 0.206 2.5 9 30 e-06 10 33 e-13 3.29525 0.00169132 6.36 0.111927 0.00294 2.5 2.5 e-07方程解决。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
。
有趣= @ (x) x * * x - [1, 2, 3, 4);x0 = 1 (2);
选项设置为不显示。
选择= optimoptions (“fsolve”,“显示”,“关闭”);
检查fsolve
质量和过程输出的解决方案。
[x, fval exitflag、输出]= fsolve(有趣,x0,选项)
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.7719 e-09消息:“方程解决....”
出口标志值1表示解决方案是可靠的。来验证这个手动,计算剩余(fval平方和)几乎是零。
sum (sum (fval。* fval))
ans = 6.3961 e-18
这个小剩余确认x
是一个解决方案。
你可以看到的输出
结构进行了多少次迭代和功能评价fsolve
找到了解决方案。
输入参数
有趣的
- - - - - -非线性方程组来解决
函数处理|函数名
非线性方程组来解决,指定为一个函数处理或函数名。有趣的
是一个函数,它接受一个向量x
并返回一个向量F
,非线性方程计算x
。方程来解决F
= 0的所有组件F
。这个函数有趣的
可以指定一个函数处理文件
x = fsolve (x0 @myfun)
在哪里myfun
MATLAB是一种®等功能
函数F = myfun F (x) =…在x %计算函数值
有趣的
也可以是一个函数处理为一个匿名函数。
x = fsolve (@ (x) sin (x) * x), x0);
fsolve
通过x
你的目标函数的形状x0
论点。例如,如果x0
是5-by-3数组,那么fsolve
通过x
来有趣的
作为一个5-by-3数组。
如果还可以计算雅可比矩阵和的“SpecifyObjectiveGradient”
选择是真正的
设定的,
选择= optimoptions (“fsolve”,“SpecifyObjectiveGradient”,真正的)
这个函数有趣的
必须返回,在第二个输出参数,雅可比矩阵值J
一个矩阵,x
。
如果有趣的
返回一个向量(矩阵)米
组件和x
长度n
,在那里n
的长度是x0
,雅可比矩阵J
是一个米
——- - - - - -n
矩阵J (i, J)
的偏导数是吗F(我)
关于x (j)
。(雅可比矩阵J
的梯度的转置F
。)
例子:有趣= @ (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 |
指定一个或多个用户定义的函数,每个迭代的优化函数调用。通过一个函数处理或处理单元阵列的功能。默认是没有( |
PlotFcn |
情节在算法执行时进步的各种措施;从预定义的情节或编写自己的选择。通过一个内置的函数名,函数处理,或单元阵列的内置函数名或函数处理。自定义绘制函数,通过函数处理。默认是没有(
自定义函数使用相同的语法作为输出函数。看到输出函数优化工具箱和输出函数和情节函数的语法。 为 |
SpecifyObjectiveGradient |
如果 为 |
StepTolerance |
终止上公差 为 |
TypicalX |
典型的 的 |
UseParallel |
当 |
信赖域算法 | |
JacobianMultiplyFcn |
雅可比矩阵乘法函数,指定为一个函数处理。大规模的结构性问题,这个函数计算雅可比矩阵产品 W = jmfun(动力系统,Y,标志) 在哪里 (F,动力系统)(x) =乐趣
在每种情况下, 请注意
看到最小化茂密的结构化的麻绳,线性等式类似的例子。 为 |
JacobPattern | 雅可比矩阵的稀疏模式有限差分。集 使用 在最坏的情况下,如果结构未知的,不确定 |
MaxPCGIter | 最大数量的首选条件共轭梯度迭代,一个积极的标量。默认值是 |
PrecondBandWidth | 上的带宽预调节器PCG,一个非负整数。默认的 |
SubproblemAlgorithm |
确定迭代步骤是如何计算的。默认的, |
TolPCG | 在PCG迭代终止宽容,积极的标量。默认值是 |
Levenberg-Marquardt算法 | |
InitDamping | Levenberg-Marquardt参数的初始值,一个积极的标量。默认是 |
ScaleProblem |
|
例子:选择= optimoptions (“fsolve”、“FiniteDifferenceType”,“中央”)
问题
- - - - - -问题的结构
结构
输出参数
fval
——目标函数值的解决方案
真正的向量
目标函数值的解决方案,作为一个真正的返回向量。一般来说,fval
=有趣的(x)
。
exitflag
- - -原因fsolve
停止
整数
原因fsolve
停止,返回一个整数。
|
方程解决。一阶最优性很小。 |
|
方程解决。的变化 |
|
方程解决。剩余的变化小于指定的公差。 |
|
方程解决。大小的搜索方向小于指定的公差。 |
|
迭代次数超过 |
|
输出函数或函数停止算法的阴谋。 |
|
方程没有解决。退出消息可以有更多的信息。 |
|
方程没有解决。信赖域半径太小( |
输出
——优化过程的信息
结构
优化过程的信息,作为结构返回字段:
迭代 |
采取的迭代次数 |
funcCount |
数量的功能评估 |
算法 |
优化算法 |
cgiterations |
PCG迭代(总数 |
stepsize |
最终位移 |
firstorderopt |
的一阶最优性 |
消息 |
退出消息 |
雅可比矩阵
解决方案-雅可比矩阵
真正的矩阵
雅可比矩阵的解决方案,作为一个真正的返回矩阵。雅可比矩阵(i, j)
的偏导数是吗有趣的(我)
关于x (j)
在解决方案x
。
限制
要解决必须连续的函数。
一旦成功,
fsolve
只给了一个根。默认的信赖域狗腿的方法只能用于当方程组广场,即。方程的数量等于未知数的数目。Levenberg-Marquardt法、方程组不需要广场。
提示
对于大型问题,这意味着那些成千上万的变量或更多,节省内存(并可能节省时间)通过设置
算法
选项“信赖域”
和SubproblemAlgorithm
选项“重心”
。
算法
Levenberg-Marquardt和信赖域方法是基于非线性最小二乘算法用于lsqnonlin
。如果系统使用其中一种方法可能没有一个零。该算法仍然返回剩余很小。然而,如果系统的雅可比矩阵奇异,算法可能会收敛到一个点,并不是一个解决方程组(见限制)。
默认情况下
fsolve
选择信赖域算法狗腿。该算法的一种变体鲍威尔狗腿中描述的方法[8]。它在本质上是类似的算法实现[7]。看到Trust-Region-Dogleg算法。信赖域算法是一个子空间信赖域方法和基于interior-reflective牛顿方法中描述[1]和[2]。每个迭代都包括近似解大型线性系统使用条件共轭梯度法(PCG)。看到信赖域算法。
Levenberg-Marquardt方法中描述的引用[4],[5],[6]。看到Levenberg-Marquardt方法。
选择功能
应用程序
的优化住编辑任务提供了一个可视化界面fsolve
。
引用
李[1]科尔曼,T.F.和y”内部,信赖域方法对非线性最小化界限,”暹罗杂志上优化》第六卷,第445 - 418页,1996年。
[2]科尔曼,T.F.和y,“在大规模非线性最小化的反光牛顿方法的收敛范围,“数学规划2号,卷。67年,第224 - 189页,1994年。
[3]丹尼斯,j·e·Jr .)“非线性最小二乘,”先进的数值分析艾德。d . Jacobs学术出版社,页269 - 312。
[4]Levenberg, K。,“A Method for the Solution of Certain Problems in Least-Squares,”2季度应用数学,第168 - 164页,1944年。
[5]马夸特,D。,“An Algorithm for Least-squares Estimation of Nonlinear Parameters,”暹罗《应用数学11卷,第441 - 431页,1963年。
[6],J·J。,“The Levenberg-Marquardt Algorithm: Implementation and Theory,”数值分析,艾德。g·a·沃森在630年数学课堂讲稿,施普林格-,105 - 116年,1977页。
[7],J·J。,B. S. Garbow, and K. E. Hillstrom,用户指南MINPACK 1阿贡国家实验室报告。退火- 80 - 74,1980。
[8]鲍威尔,m . j . D。,“A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations,”非线性代数方程的数值方法,艾德。p . Rabinowitz Ch.7, 1970年。
扩展功能
C / c++代码生成
生成C和c++代码使用MATLAB®编码器™。
fsolve
金宝app支持使用生成代码codegen
(MATLAB编码器)函数或MATLAB编码器™应用程序,你必须有一个MATLAB编码器许可来生成代码。目标硬件必须支持标准的双精度浮点计算。金宝app你不能为单精度或定点计算生成代码。
代码生成目标不使用MATLAB解决数学内核库一样。因此,代码生成解决方案可以解决不同的解决方案,特别是对金宝搏官方网站条件不佳的问题。
所有代码必须MATLAB生成的代码。特别是,您不能使用一个定制的黑盒函数作为目标函数
fsolve
。您可以使用coder.ceval
评估一个自定义函数在C或c++代码。然而,自定义函数必须在调用MATLAB函数。fsolve
不支持金宝app问题
理由代码生成。[x, fval] = fsolve(问题)%不支持金宝app
您必须指定目标函数,利用函数处理,而不是字符串或字符的名字。
x = fsolve (x0, @fun选项)%的金宝app支持%不支持:f金宝appsolve(‘有趣的’,…)或fsolve(“有趣”,…)
对于高级代码优化包括嵌入式处理器,您还需要嵌入式编码器®许可证。
你必须包括选项
fsolve
并指定使用optimoptions
。必须包括的选项算法
选项,设置为“levenberg-marquardt”
。选择= optimoptions (“fsolve”,“算法”,“levenberg-marquardt”);[x, fval exitflag] = fsolve(有趣,x0,选项);
代码生成支持这些选项:金宝app
算法
——必须“levenberg-marquardt”
FiniteDifferenceStepSize
FiniteDifferenceType
FunctionTolerance
MaxFunctionEvaluations
MaxIterations
SpecifyObjectiveGradient
StepTolerance
TypicalX
生成的代码错误检查选项有限。推荐的方式来更新一个选项是使用
optimoptions
,而不是点符号。选择= optimoptions (“fsolve”,“算法”,“levenberg-marquardt”);选择= optimoptions(选择,“MaxIterations”1 e4);%推荐选择。MaxIterations = 1 e4;%不推荐
不从文件加载选项。这样做会导致代码生成失败。相反,在代码中创建选项。
通常,如果您指定一个选项不支持,在代码生成选项是默默地忽略。金宝app然而,如果你指定一个情节或输出函数通过使用点符号,代码生成可以发出一个错误。对于可靠性、指定仅支持选项。金宝app
因为输出函数和情节功能不支持,解决不返回退出标志1。金宝app
例如,看到的为fsolve生成代码。
自动并行支持金宝app
加速代码通过自动运行并行计算使用并行计算工具箱™。
版本历史
打开举例
你们possedez一个版本modifiee de cet(中央东部东京)为例。Souhaitez-vous打开cet(中央东部东京)为例用vos修改吗?
对MATLAB
你们有派对在联合国留置权,对应这个对MATLAB:
倒实行la对saisissez-la在fenetre德对MATLAB。Les navigateurs web不sup金宝appportent Les MATLAB命令。
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。