python求解线性方程组(高斯、列主元高斯、直接三角)

在这里插入图片描述
求解上述线性方程组

高斯消去法

消元
在这里插入图片描述
回带
在这里插入图片描述

#高斯消去法
import numpy as np
A = np.array([[10,-7,0,1],[-3,2.099999,6,2],[5,-1,5,-1],[2,1,0,2]])
b = np.array([8,5.900001,5,1])
for k in range(3) :
    for i in range(k+1,4) :
        mik = A[i,k]/A[k,k]
        for j in range(k+1,4) :
            A[i,j] -= mik * A[k,j]
        b[i] = b[i] - mik * b[k]
solution = [0,0,0,0]
solution[3] = b[3] / A[3,3]
for i in range(2,-1,-1) :
    for j in range(i+1,4) :
        solution[i] = solution[i] + A[i,j] * solution[j]
    solution[i] = (b[i] - solution[i]) / A[i,i]
print('高斯消去法,最终的解X_i(角标从小到大):{}'.format(solution))

列主元高斯消去法

#列主元高斯消去法
import numpy as np
A = np.array([[10,-7,0,1],[-3,2.099999,6,2],[5,-1,5,-1],[2,1,0,2]])
b = np.array([8,5.900001,5,1])
for k in range(3) :
    value = max(abs(A[k:4,k]))  #主元的值
    position = np.argmax(A[k:4,k])  #主元所在位置(相对位置)
    if position != k :  #若a(k,k)不是绝对值最大的,换位置
        A[k,k:4],A[position+k,k:4] = A[position+k,k:4],A[k,k:4]
        b[k],b[position+k] = b[position+k],b[k]
    for i in range(k+1,4) :
        mik = A[i,k]/A[k,k]
        for j in range(k+1,4) :
            A[i,j] -= mik * A[k,j]
        b[i] = b[i] - mik * b[k]
        
#回带过程不变
solution = [0,0,0,0]
solution[3] = b[3] / A[3,3]
for i in range(2,-1,-1) :
    for j in range(i+1,4) :
        solution[i] = solution[i] + A[i,j] * solution[j]
    solution[i] = (b[i] - solution[i]) / A[i,i]
print('列主元高斯消去法,最终的解X_i(角标从小到大):{}'.format(solution))

解析

position = np.argmax(A[k:4,k])  #主元所在位置(相对位置)

当k=2时,仅比较第三行和第四行中第三列的元素绝对值大小,若第四行第三列元素绝对值较大则为主元,此时position为1,是在比较序列中的相对位置,而在矩阵中的绝对位置(下标从0开始)为position+k=3

直接三角分解法

#直接三角分解法
import numpy as np
A = np.array([[10,-7,0,1],[-3,2.099999,6,2],[5,-1,5,-1],[2,1,0,2]])
b = np.array([8,5.900001,5,1])
y = np.zeros(4)
x = np.zeros(4)
L = np.zeros((4,4))
U = np.zeros((4,4))

# 分解A = LU
U[0,:] = A[0,:]
L[1:4,0] = A[1:4,0] / U[0,0]
for k in range(1,4) :
    for j in range(k,4) :
        U[k,j] = A[k,j] - L[k,0] * U[0,j]
        for m in range(1,k) :
            U[k,j] -= L[k,m] * U[m,j]
    for i in range(k+1,4) :
        L[i,k] = A[i,k] - L[i,0] * U[0,k]
        for m in range(1,k) :
            L[i,k] -= L[i,m] * U[m,k]
        L[i,k] = L[i,k] / U[k,k]
            
# 解Ly = b
y[0] = b[0]
for i in range(1,4) :
    y[i] = b[i] - L[i,0] * y[0].T
    for n in range(1,i) :
        y[i] -= L[i,n] * y[n].T
    
# 解Ux = y
x[3] = y[3] / U[3,3]
for i in range(2,-1,-1) :
    x[i] = (y[i] - U[i,i+1] * x[i+1].T) 
    for n in range(i+2,4) :
        x[i] -= U[i,n] * x[n].T
    x[i] = x[i] / U[i,i]
print('直接三角分解法,最终的解X_i(角标从小到大):{}'.format(x))

结果列表

方法/解高斯消去法列主元高斯消去法直接三角分解法
x1-6.033918253933735e-10-6.033918253933735e-10-6.0339177e-10
x2-1.0000000008881784-1.0000000008881784-1
x31.0000000000702771.0000000000702771
x40.99999999981666880.99999999981666881

结果截图

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值