【问题标题】:How can I check convergence of a numerical method based on the results? (Octave)如何根据结果检查数值方法的收敛性? (八度)
【发布时间】:2020-05-11 15:00:01
【问题描述】:

我正在用 Octave 编写定点迭代脚本,需要检查方法是否收敛。目前我唯一想到的是对在 x0 中评估的 g(x) 的导数进行非常基本的检查。

if (conv_x<=1)
  fprintf("\nThe method guarantees convergence:\n|g'(x0)| <= 1\n%d <= 1\n", conv_x)
else
  fprintf("\nThe method does not guarantee convergence:\n|g'(x0)| > 1\n%d > 1\n", conv_x) 
endif

尽管在某些情况下它确实会收敛,即使它并不能保证。 示例(命令窗口):

The method does not guarantee convergence:
|g'(x0)| > 1
2.48318 > 1

 i       x_i             Ea              Er              Er%
0        1.000000
1        3.623970        0.292484        0.080708        8.07081%
2        3.277427        0.346543        0.105736        10.5736%
3        2.929255        0.348173        0.118860        11.886%
4        2.663926        0.265329        0.099601        9.96007%
5        2.531185        0.132741        0.052442        5.24424%
6        2.490991        0.040194        0.016136        1.61356%
7        2.482583        0.008408        0.003387        0.338681%
8        2.481053        0.001530        0.000617        0.0616501%
9        2.480784        0.000270        0.000109        0.0108692%
10       2.480736        0.000047        0.000019        0.00190502%
11       2.480728        0.000008        0.000003        0.000333541%
>>

有没有一种方法可以让程序读取结果,然后让它说出它是否收敛?而不是在应用方法之前只说是否保证收敛。

【问题讨论】:

  • 不清楚你在问什么。要查看一个方法是否收敛,您可以查看错误并检查它是否在连续迭代步骤中变小。这就是收敛的定义。
  • @Cris Luengo 问题是我知道这个例子中的误差越来越小,即使由于选择了 x0 而不能保证收敛。我想知道是否有办法显示一条消息,指出该方法正在收敛,尽管 |g'(x0)| > 1.
  • 数值方法通常将当前结果与上一步中的结果进行比较。如果差值小于某个选定值,则认为过程已经收敛并停止迭代。如果你达到这一点,你写出“方法收敛”。如果您没有达到这一点(在运行固定数量的步骤后退出迭代),您会写出“方法没有收敛”。你问的是这个吗?

标签: octave fixed point convergence


【解决方案1】:

解决方案最终变得非常简单。我制作了一个向量,它存储了绝对误差的所有值。然后将第一个值与最后一个值进行比较,以检查该方法是否收敛。

err_v = [err_v, err_abs]

err_v 在定点方法循环中,所以它存储了每个值。

然后我将第一个值与最后一个值进行比较,如下所示:

我将第一个和最后一个值存储在单独的变量中:

err_v_i = err_v(1);
err_v_f = err_v(:,end);

最后我只是用 if 语句比较了两者。

if(err_v_i > err_v_f)
  fprintf("\nMethod is converging\n")
else
  fprintf("\nMethod is NOT converging\n")
endif

这使得指出该方法收敛的情况成为可能,即使 |g'(x0)| > 1

感谢 Cris Luengo,您的第一条评论让我意识到这是多么简单。

【讨论】:

  • 因此您已将收敛定义为“当前步骤的错误小于步骤 1 的错误”。通常收敛被定义为 - 计算的总/绝对误差低于 some_value,或者两个步骤之间的误差变得始终很小(相对误差)。在这种情况下,将其与“步骤 1 的错误”进行比较似乎是一个相当随意的选择,可能主要受您的起始条件的影响,而不管解决方案是否实际收敛。你的错误保证是单调的吗?它会围绕小于 err_v_i 的值非收敛地振荡吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2022-10-12
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多