20.1解算器

Octave可以求解形式为的非线性方程组

F (x) = 0

使用函数fsolve,基于MINPACK子程序hybrd。这是一种迭代技术,因此必须提供一个起点。这也导致即使存在解决方案,也不能保证收敛性。

 
:x= fsolve (fcn,x0)
:x= fsolve (fcn,x0,options)
:[x,fval] = fsolve (…)
:[x,fval,info] = fsolve (…)
:[x,fval,info,output] = fsolve (…)
:[x,fval,info,output,fjac] = fsolve (…)

求解从函数定义的非线性方程组fcn.

fcn是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。fcn应接受定义未知变量的向量(数组),并返回方程左侧的向量。右侧被定义为零。换句话说,这个函数试图确定一个向量x使得fcn(x)给出(近似)全零。

x0是对解决方案的初步猜测。的形状x0ispreserved在对的所有调用中fcn,但在其他情况下被视为列向量。

options是指定控制算法的附加参数的结构体。目前,fsolve识别这些参数:"AutoScaling","ComplexEqn","FinDiffType","FunValCheck","Jacobian","MaxFunEvals","MaxIter","OutputFcn","TolFun","TolX","TypicalX""Updating".

如果"AutoScaling""on",变量将根据(估计的)雅可比矩阵的列范数进行自动缩放。因此"TolFun"变得与缩放无关。默认情况下,此参数为"off"因为它有时可能会返回意想不到的(尽管在数学上是正确的)结果。

如果"ComplexEqn""on",fsolve将试图求解复变量中的复方程,假设方程具有复导数(即全纯)。如果这不是你想要的,你应该打开系统的真实和想象部分,以获得一个真实的系统。

如果"Jacobian""on",它指定fcn--当使用2个输出参数调用时,也会在指定点返回右手边的雅可比矩阵。

"MaxFunEvals"禁止在停止优化之前进行最大数量的函数评估。默认值为100 * number_of_variables即。,100*长度(x0)。该值必须是正整数。

如果"Updating""on",该函数将尝试使用Broyden更新来更新Jacobian,以减少Jacobian计算的数量。如果您的用户函数总是计算雅可比(无论输出参数的数量如何),则此参数没有任何优势,应该禁用。

"TolX"指定未知变量中的终止公差,而"TolFun"是方程式的公差。默认为1e-6对于两者"TolX""TolFun".

有关其他参数的描述,详见optimset。使用的默认值初始化参数结构体fsolve使用options = optimset ("fsolve").

第一个输出x是解决方案,而第二个输出fval包含函数的值fcn评估于x(理想情况下是一个全零的向量)。

第三个输出info返回算法是否成功,并可能采用以下值之一:

1

聚合到解决方案点。相对残差小于规定的TolFun.

2

上次相对步长小于TolX.

广告
3

残差的上次相对减少小于TolFun.

广告
0

迭代限制(任一MaxIterMaxFunEvals)超过。

广告
-1

已被阻止OutputFcn.

广告
-2

Jacobian变得过小,搜索陷入停滞。

广告
-3

信任区域半径变得过小。

广告

output是一个结构体,包含有关的运行时信息fsolve算法。结构体中的字段为:

iterations

通过循环的迭代次数。

广告
successful

成功迭代的次数。

广告
funcCount

函数评估的数量。

广告

最终输出fjac包含Jacobian evaluatedat的值x.

注意:如果只有一个变量的非线性方程,则使用fzero通常是一个更好的主意。

关于用户提供的Jacobian的注意事项:作为算法的固有属性,对于残差向量已知的解向量,总是需要Jacobian,这是最后一个被接受的成功步骤。这通常是最后两次调用中的一次,但并不总是如此。如果在雅可比计算中重复使用残差计算的中间结果可以节省大量费用,那么最好的策略是使用OutputFcn:在评估向量的残差后,如果OutputFcn使用该向量调用,则中间结果应保存以供将来进行雅可比求值,并应保留到指定雅可比求值或直到OutputFcn被称为具有不同的向量,在这种情况下,它们应该被丢弃以支持这个最大向量。以下是如何实现这一目标的简短示例:

function [fval, fjac] = user_fcn (x, optimvalues, state)
persistent sav = [], sav0 = [];
if (nargin == 1)
  ## evaluation call
  if (nargout == 1)
    sav0.x = x; # mark saved vector
    ## calculate fval, save results to sav0.
  elseif (nargout == 2)
    ## calculate fjac using sav.
  endif
else
  ## outputfcn call.
  if (all (x == sav0.x))
    sav = sav0;
  endif
  ## maybe output iteration status, etc.
endif
endfunction

## ...

fsolve (@user_fcn, x0, optimset ("OutputFcn", @user_fcn, ...))

详见: fzero,optimset.

广告

以下是一个完整的示例。求解方程组

-2x^2 + 3xy   + 4 sin(y) = 6
 3x^2 - 2xy^2 + 3 cos(x) = -4

首先需要编写一个函数来计算给定函数的值。例如

function y = f (x)
  y = zeros (2, 1);
  y(1) = -2*x(1)^2 + 3*x(1)*x(2)   + 4*sin(x(2)) - 6;
  y(2) =  3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
endfunction

然后,调用fsolve在给定的初始条件下求出方程组的理论根。例如,给定函数f如上所定义,

[x, fval, info] = fsolve (@f, [1; 2])

解决方案中的结果

x =

  0.57983
  2.54621

fval =

  -5.7184e-10
   5.5460e-10

info = 1

的值info = 1表示解决方案已收敛。

当没有提供雅可比时(如上面的例子),它是近似的数字。这需要更多的函数评估,因此效率较低。在上面的例子中,我们可以计算雅可比分析为

function [y, jac] = f (x)
  y = zeros (2, 1);
  y(1) = -2*x(1)^2 + 3*x(1)*x(2)   + 4*sin(x(2)) - 6;
  y(2) =  3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
  if (nargout == 2)
    jac = zeros (2, 2);
    jac(1,1) =  3*x(2) - 4*x(1);
    jac(1,2) =  4*cos(x(2)) + 3*x(1);
    jac(2,1) = -2*x(2)^2 - 3*sin(x(1)) + 6*x(1);
    jac(2,2) = -4*x(1)*x(2);
  endif
endfunction

然后,Jacobian可以与以下调用一起使用fsolve:

[x, fval, info] = fsolve (@f, [1; 2], optimset ("jacobian", "on"));

这给出了与以前相同的解决方案。

 
:x= fzero (fcn,x0)
:x= fzero (fcn,x0,options)
:[x,fval] = fzero (…)
:[x,fval,info] = fzero (…)
:[x,fval,info,output] = fzero (…)

找到一个单变量函数的零。

fcn是一个函数句柄、内联函数或字符串,包含要计算的函数的名称。

x0应该是一个双元素向量,指定两个包含零的点。换句话说,在x0(1) 以及x02.从数学上讲,以下内容必须成立

签名fcn(x0(1) ))*符号(fcn(x0(2))) <= 0

如果x0如果是单个标量,则会探测几个附近和远处的值,试图获得有效的括号。如果不成功,则函数将失败。

options是一个指定附加参数的结构体。目前,fzero识别这些参数:"Display","FunValCheck","MaxFunEvals","MaxIter","OutputFcn""TolX".

"MaxFunEvals"禁止在停止搜索之前进行最大数量的函数评估。默认值为Inf。该值必须是正整数。

"MaxIter"禁止停止搜索之前的最大算法迭代次数。默认值为Inf。该值必须是正整数。

"TolX"指定解决方案的终止公差x。默认值为eps.

有关其他参数的描述,详见optimset。使用的默认值初始化参数结构体fzero使用options = optimset ("fzero").

退出时,函数返回x,近似零点,以及fval,处评估的函数x.

第三个输出info返回算法是否成功,并可能采用以下值之一:

output是一个结构体,包含有关的运行时信息fzero算法。结构体中的字段为:

详见: optimset,fsolve.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2