python实现LU分解

Python实现LU分解

数学原理

对线性方程组

A n × n X n × 1 = b n × 1 A_{n\times n}X_{n\times 1}=b_{n\times 1} An×nXn×1=bn×1

求解思路为进行 n n n次迭代,在第 k k k次迭代中计算U的第 k k k行,L的第 k k k列。
于是编程思路为两个for循环嵌套,外层循环控制迭代次数,内层循环计算L,U矩阵行列具体值。

U k , i = A k , i − ( L k , 0 U 0 , i + ⋯ + L k , k − 1 U k − 1 , i ) , i = k , k + 1 , ⋯   , n . U_{k,i}=A_{k,i}-(L_{k,0}U_{0,i}+\cdots + L_{k,k-1}U_{k-1,i}) , i=k,k+1,\cdots,n. Uk,i=Ak,i(Lk,0U0,i++Lk,k1Uk1,i),i=k,k+1,,n.
L j , k = ( A j , k − L j , 0 U 0 , k − ⋯ − L j , k − 1 U k − 1 , k ) / U k , k , j = k + 1 , ⋯ n . L_{j,k}=(A_{j,k}-L_{j,0}U_{0,k}-\cdots - L_{j,k-1}U_{k-1,k})/U_{k,k},j=k+1,\cdots n. Lj,k=(Aj,kLj,0U0,kLj,k1Uk1,k)/Uk,k,j=k+1,n.

注:为了便于编程,公式中矩阵第一个元素索引为0。

Python代码

/'''
功能:使用LU分解求解线性方程组                                      |符号
输入:线性方程组的系数矩阵和常数阵                                   |A,b
输出:系数矩阵A经分解后得到的L,U矩阵,以及线性方程组的解向量x          |L,U,x
'''
import numpy as np

A = np.array([[4, 2, 1, 5],
              [8, 7, 2, 10],
              [4, 8, 3, 6],
              [6, 8, 4, 9]])
b = np.array([[7, 4, 6, 8]])
n = np.shape(A)[0]
L = np.zeros((n, n)) + np.eye(n)
U = np.zeros((n, n))
for k in range(n):
    for i in range(k, n):
        U[k, i] = A[k, i] - L[k, 0:k].dot(U[0:k, i])
    for j in range(k + 1, n):
        L[j, k] = (A[j, k] - L[j, 0:k].dot(U[0:k, k])) / U[k, k]
 A_inv = np.linalg.inv(U).dot(np.linalg.inv(L))
x = A_inv.dot(b.T)
print("L:\n{}".format(L))
print("U:\n{}".format(U))
print("x:{}".format(x))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值