数学背景
设A为实数的N×N矩阵,N个实数的ba向量和xa个N个未知实数向量。矩阵方程为Ax = b。
Jacobi的方法如下:分解A = D + R,其中D是对角线矩阵,R是其余项。
如果您做出初始猜测解x0,则改进的解为x1 =逆(D)*(b-Rx),其中所有乘法都是矩阵矢量乘法,而逆(D)是矩阵逆。
问题规格
- 输入:完整的程序应接受以下数据作为输入:矩阵A,向量b,初始猜测x0和“错误”数e。
- 输出:程序必须输出最少的迭代次数,以使最新的解决方案与实际解决方案之间的差异最多为e。这意味着矢量的每个分量的绝对大小最多相差e。您必须使用Jacobi的方法进行迭代。
如何输入数据是您的选择 ; 它可以是您自己在命令行上的语法,也可以从文件中获取输入,无论您选择什么。
数据的输出方式是您的选择 ; 可以将其写入文件,在命令行中显示,以ASCII文字形式书写,并且只要人类可以阅读即可。
更多详情
您没有得到真正的解决方案:如何计算真正的解决方案完全取决于您自己。例如,您可以通过Cramer规则或直接计算逆来解决它。重要的是您拥有一个能够与迭代进行比较的真正解决方案。
精度是一个问题;有些人的“确切解决方案”可能会有所不同。出于该代码的目的,精确的解决方案必须为10个小数位。
绝对清楚地说,即使您当前迭代解决方案的一个组成部分比真实解决方案中的相应组成部分都增加了e,那么您需要保持迭代。
N的上限取决于您所使用的硬件以及您愿意花多少时间运行该程序。出于此代码高尔夫球的目的,假定最大值N = 50。
前提条件
调用程序时,您可以随时假设以下条件成立:
- N> 1且N <51,即您永远不会得到标量方程,而总是矩阵方程。
- 所有输入都在实数范围内,并且永远不会复杂。
- 矩阵A总是使方法收敛到真正的解,这样您总是可以找到许多迭代以最小化小于或等于e的误差(如上定义)。
- A 永远不是零矩阵或恒等矩阵,即有一个解。
测试用例
A = ((9, -2), (1, 3)), b = (3,4), x0 = (1,1), e = 0.04
真正的解决方案是(0.586,1.138)。第一次迭代得到x1 =(5/9,1),与真实解的差异至少为0.04,相差至少一个分量。再进行一次迭代,我们发现x2 =(0.555,1.148)与(0.586,1.138)相差不到0.04。因此输出是
2
A = ((2, 3), (1, 4)), b = (2, -1), x0 = (2.7, -0.7), e = 1.0
在这种情况下,真正的解决方案是(2.2,-0.8)并且初始猜测x0已经具有小于e = 1.0的误差,因此我们输出0。也就是说,每当不需要进行迭代时,您只需输出
0
提交评估
这是代码高尔夫球,此处不允许所有标准漏洞。最短的正确完整程序(或功能),即最少的字节数获胜。它鼓励要用的东西像数学其中包裹了很多必要的步骤为一体的功能,但使用任何你想要的语言。