python - 如何根据伪代码正确实现求和和数组迭代。 PYTHON松弛法

标签 python iteration numerical-methods

我正在尝试为一个项目实现松弛迭代求解器。我们创建的函数应该接受两个输入:矩阵 A 和向量 B,并且应该返回近似解 Ax = b 的迭代向量 X。

书中的伪代码在这里: enter image description here

我是Python新手,所以我在实现这个方法时遇到了很大的困难。这是我的代码:

def SOR_1(A,b):
k=1
n = len(A)
xo = np.zeros_like(b)
x = np.zeros_like(b)
omega = 1.25
while (k <= N):
    for i in range(n-1):
        x[i] = (1.0-omega)*xo[i] + (1.0/A[i][i])[omega(-np.sum(A[i][j]*x[j]))
        -np.sum(A[i][j]*xo[j] + b[i])]
        if ( np.linalg.norm(x - xo) < 1e-9):
                print (x)

        k = k + 1.0
            for i in range(n-1):
                xo[i] = x[i]

return x

我的问题是如何实现 for 循环并根据伪代码正确生成数组。

最佳答案

欢迎使用Python!

Python 中的变量区分大小写,因此定义了 n,但未定义 N。如果它们应该是不同的变量,我看不出您的 N 值是什么。

您有了一个良好的开端,但以下行大部分仍然是伪代码:

x[i] = (1.0-omega)*xo[i] + (1.0/A[i][i])[omega(-np.sum(A[i][j]*x[j]))
    -np.sum(A[i][j]*xo[j] + b[i])]

在教科书的伪代码中,方括号被用作分组符号,但在Python中,它们被保留用于创建和访问列表(这就是Python所说的数组)。另外,Python 中没有隐式乘法,因此您必须编写类似 (1 + 2)*(3*(4+5)) 而不是 (1 + 2)[3 (4+5)]

另一个主要问题是您没有定义 j。您可能需要一个看起来像这样的 for 循环:

for j in range(1, i):

或者如果你想内联进行

sum(A[i][j]*x[j] for j in range(1, i))

请注意,range 有两个参数,从哪里开始以及在什么值之前停止,因此 range(1, i) 相当于从 1 到 i - 1 的总和

我认为您正在为该行而苦苦挣扎,因为该行发生了太多事情。看看您是否可以使用单独的变量来计算出其中的一部分,或者将一些工作转移到单独的函数中。

类似于:x[i] =a + b * c * d() - e(),但给出 a、b、c、d 和 e 有意义的名称。然后,您必须正确设置每个变量并定义每个函数,但至少您正在尝试解决单独的问题,而不是解决一个巨大的复杂问题。

此外,请确保您的选项卡正确无误。 k = k + 1.0 不应位于 for 循环内,而应位于 while 循环内。

编码是一个迭代过程。首先让 while 循环工作。不要尝试在其中执行任何操作(除了打印出变量以便您可以看到它正在工作)。接下来让 for 循环在 while 循环内工作(同样,只是打印变量)。接下来让 (1.0-omega)*xo[i] 工作。在此过程中,您将发现并解决诸如 (1.0-omega)*xo[i] 计算结果为 0 之类的问题,因为 xo 是一个以全零开头的 NumPy 列表。

您可以从以下内容开始:

k = 1
N = 3
n = 3
xo = [1, 2, 3]
while (k <= N):
    for i in range(n):
      print(k, i)
      omega = 1.25
      print((1.0-omega)*xo[i])
    k += 1

慢慢地使用越来越多的松弛解算器,直到一切正常。

关于python - 如何根据伪代码正确实现求和和数组迭代。 PYTHON松弛法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49808783/

相关文章:

python - 一个子类化 abc 的 django 模型,给出了元类冲突

我们可以将这个嵌套循环finding_indice 转换为递归吗?

c++ - 遍历可能从容器中移除的对象

python - 合并 numpy 数组的值

python - 将 VSCode 更新到 1.56.1 后,出现错误 : "Cannot activate the ' Python' extension because it depends on the 'Jupyter' extension. .."

python - pandas 数据透视表,其值来自两个不重叠的列

python - 将数据从 .data 文件转换为 .csv 文件并使用 Pandas 将数据放入列中

java - java中的欧拉方法

matlab - MATLAB-自适应步长Runge-Kutta

r - 如何评估R中的样条函数的导数?