我正在用Octave编写一个定点迭代脚本,需要检查该方法是否收敛。目前,我唯一想到的就是对g(x)在x0中求值的导数做一个非常基本的检查。
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%
>>有没有一种方法可以让程序读取结果,然后让它判断是否收敛?而不是在应用该方法之前只说是否保证收敛。
发布于 2020-05-12 00:18:16
解决方案最终变得非常简单。我做了一个向量,它存储了绝对误差的所有值。然后将第一个值与最后一个值进行比较,以检查该方法是否收敛。
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,你的第一个评论让我意识到这是多么简单。
https://stackoverflow.com/questions/61732795
复制相似问题