📜  高斯-赛德尔法

📅  最后修改于: 2022-05-13 01:56:56.508000             🧑  作者: Mango

高斯-赛德尔法


这是使雅可比方法更进一步。更好的解是 x = (x1, x2, ... , xn),如果 x1(k+1) 比 x1(k) 更接近 x1 的值,那么我们最好找到新的值 x1(k+1) 以使用它(而不是旧值 isx1(k))来查找 x2(k+1)、...、xn(k+1)。所以 x1(k+1) 是在 Jacobi 方法中找到的,但是在找到 x2(k+1) 时,不是使用 x1(k) 的旧值和 x3(k) 的旧值,...,xn(k) ,然后我们使用新值 x1(k+1) 和旧值 x3(k)、…、xn(k),并类似地找到 x3(k+1)、…、xn(k+1)。这个求解给定线性方程的过程称为高斯-赛德尔方法

Gauss-Seidel 方法是一种迭代技术,用于求解具有未知 x 的 n (n=3) 线性方程组。
给定

Ax=B

, 找到满足这个条件的方程 x 的系统。
更详细地说,它们的组件中的 A、x 和 b 是:

然后将 A Matrix 分解为其下三角分量和上三角分量由下式给出:

线性方程组改写为:

Gauss-Seidel 方法现在求解此表达式的左侧的 x,使用右侧的 x 的先前值。更正式地说,这可以写成:

但是,通过 L* 的三角形形式,x(k+1) 的元素可以使用前向替换顺序计算:

这个过程不断重复,直到我们找到误差最小的更好的近似解。
例子:

Input :
3
4x+ y+ 2z= 4
3x+ 5y+ 1z= 7
x+ y+ 3z= 3

Output :
[0, 0, 0]
[1.0, 0.8, 0.39999999999999997]
[0.6000000000000001, 0.9599999999999997, 0.48000000000000004]
[0.52, 0.9919999999999998, 0.49600000000000005]
[0.504, 0.9983999999999998, 0.4992000000000001]
[0.5008, 0.99968, 0.49984]
[0.5001599999999999, 0.9999360000000002, 0.4999679999999999]
[0.500032, 0.9999872, 0.4999936]
[0.5000064, 0.9999974400000001, 0.49999871999999995]
[0.50000128, 0.999999488, 0.4999997439999999]
[0.500000256, 0.9999998976000001, 0.49999994880000004]
[0.5000000512, 0.9999999795199999, 0.4999999897600001]
[0.50000001024, 0.999999995904, 0.499999997952]
[0.500000002048, 0.9999999991808, 0.49999999959040003]
[0.5000000004095999, 0.9999999998361601, 0.49999999991808003]
[0.50000000008192, 0.9999999999672321, 0.49999999998361594]
[0.500000000016384, 0.9999999999934465, 0.49999999999672307]
[0.5000000000032768, 0.9999999999986894, 0.4999999999993445]
[0.5000000000006554, 0.9999999999997378, 0.49999999999986894]
[0.500000000000131, 0.9999999999999478, 0.49999999999997374]
[0.5000000000000262, 0.9999999999999897, 0.49999999999999467]
[0.5000000000000052, 0.9999999999999979, 0.49999999999999895]
[0.5000000000000011, 0.9999999999999994, 0.49999999999999983]
[0.5000000000000002, 0.9999999999999998, 0.5000000000000001]
[0.49999999999999994, 1.0, 0.5]
[0.5, 1.0, 0.5]

给定三个等式:

4x + y + 2z = 4
3x + 5y + z = 7
x + y + 3z = 3

首先我们假设给定方程的解是

(0,0,0)

然后首先我们将 y 和 z 的值放入等式 1 并得到 x 的值并将 x 的值更新为

(x1,0,0)

现在,将 x 的更新值即 x1 和 z=0 放入等式 2 以获得 y1,然后将我们的解决方案更新为

(x1,y1,0)

然后,最后将 x1 和 y1 放入等式 3 中得到 z1 并将我们的解决方案更新为

(x1,y1,z1)

现在重复相同的过程 24 次以上,以获得具有最小误差的近似解。

# Defining our function as seidel which takes 3 arguments
# as A matrix, Solution and B matrix
   
def seidel(a, x ,b):
    #Finding length of a(3)       
    n = len(a)                   
    # for loop for 3 times as to calculate x, y , z
    for j in range(0, n):        
        # temp variable d to store b[j]
        d = b[j]                  
          
        # to calculate respective xi, yi, zi
        for i in range(0, n):     
            if(j != i):
                d-=a[j][i] * x[i]
        # updating the value of our solution        
        x[j] = d / a[j][j]
    # returning our updated solution           
    return x    
   
# int(input())input as number of variable to be solved                
n = 3                              
a = []                            
b = []        
# initial solution depending on n(here n=3)                     
x = [0, 0, 0]                        
a = [[4, 1, 2],[3, 5, 1],[1, 1, 3]]
b = [4,7,3]
print(x)
  
#loop run for m times depending on m the error value
for i in range(0, 25):            
    x = seidel(a, x, b)
    #print each time the updated solution
    print(x)                     

矩阵版本的示例
显示为 Ax=b 的线性系统由下式给出:

我们想使用方程

在哪里:

我们必须将 A 分解为下三角分量 L* 和严格上三角分量 U 的和:

L* 的倒数是:

现在我们可以找到剩余的东西:

现在我们有了 T 和 C,我们可以使用它们迭代地获得向量 x。

首先,我们必须选择我们只能猜测的 x{0}。猜测越好,算法执行得越快。

我们假设:

然后我们可以迭代计算其他 x{i's}:

现在我们知道了与上面计算的答案相匹配的精确解。

事实上,矩阵 A 是严格对角占优的(但不是正定的)。