解释 Matlab 的 fsolve 算法的多变量求根结果

计算科学 优化 matlab 数字 非线性方程 寻根
2021-12-01 14:56:06

编辑:因此,当直接在脚本文件中而不是在命令行窗口中编码函数值的平方和时,我能够获得相同的 r 值。因此,手动执行可能存在舍入错误。谢谢。

我正在学习多变量求根,从几个变量中的一些简单的非线性方程组开始——求解 F = 0。我正在制作简单的方程,其中我知道一些明显的多变量根,我正在选择起点只是离根有点远,以便从 Matlab 的 fsolve 算法中获得解决方案。目前,我正在尝试学习如何解释算法的反馈,因为我的结果与 Matlab 的不同,这里是:

方程求解。

平方函数值的总和 r = 6.701089e-19 小于 sqrt(options.FunctionTolerance) = 1.000000e-03。r 梯度的相对范数 7.127651e-09 小于 options.OptimalityTolerance = 1.000000e-06。

优化指标

相对范数(grad r) = 7.13e-09
r = 6.70e-19

选项

OptimalityTolerance = 1e-06(默认)

sqrt(FunctionTolerance) = 1.0e-03 (默认)

当我在命令行窗口中手动计算平方函数值的总和时,我得到的结果大约为 1e-7,与它们的 r 值 6.7e-19 相差无几。这个值 r 是多少?Matlab 也将其称为“平方函数值之和”。他们还给出了 grad r 的“相对规范”。我知道通常的欧几里得范数、p 范数、无穷范数和 Frobenius 范数,但我从未听说过相对范数。因此,我怀疑 Matlab 的定义是专有的而不是标准的——或者,命令行窗口中的手动计算可能存在舍入错误。

1个回答

平方和应该加起来等于 MATLAB 所说的加起来,即对于F:RmRn

r(x)=i=1n(Fi(x))2

然后很容易将的梯度计算为 ,其中的雅可比行列式。r

r(x)=J(x)TF(x)
JF

现在让我们尝试逆向工程,如果这确实是 MATLAB 的意思。由于问题中没有具体说明什么是,因此我尝试Ffsolve

F=(ee(x1+x2)x2(1+x12)x1cos(x2)+x2sin(x1)12)
,

这是在 fsolve 的 MATLAB 文档页面中找到的示例:

https://se.mathworks.com/help/optim/ug/fsolve.html

下面的代码片段解决并打印出 r 的平方和和梯度的范数。F(x)=0

f = @(x) [exp(exp(-(x(1)+x(2))))-x(2)*(1+x(1)^2);x(1)*cos(x(2))+x(2)*sin(x(1))-0.5];

x_ = fsolve(f,[0 0]);

r = norm(f(x_))^2 %Sum of squares

%Estimate the gradient of r using finite differences
h = 1e-12;
J_t = (1/h)*[f(x_+[h,0])-f(x_),f(x_+[0,h])-f(x_)];%Transpose of Jacobian
norm_gradr = norm(J_t'*f(x_)) %Norm of gradient of r

理想情况下,您会通过手动微分找到雅可比行列式。这是使用有限差分的惰性估计,但它可以完成工作。输出是:

r =

   6.8935e-23


norm_gradr =

   9.8783e-12

Equation solved. The sum of squared function values, r = 6.893461e-23, is less than
sqrt(options.FunctionTolerance) = 1.000000e-03. The relative norm of the gradient of r,
9.832419e-12, is less than options.OptimalityTolerance = 1.000000e-06.

Optimization Metric                                         Options
relative norm(grad r) =   9.83e-12              OptimalityTolerance =   1e-06 (default)
r =   6.89e-23                              sqrt(FunctionTolerance) =  1.0e-03 (default)

这一简短的逆向工程证实,如果是 MATLAB 计算的解,那么当它说“平方和”时,” 当它说“相对规范(grad r)”时。xr(x)r(x)2=JT(x)F(x)

您应该再次检查平方和的计算。