計算機數值方法——LU分解法

算法流程

首先,LU分解法就是在高斯消元法的基礎上,把矩陣AA分解爲一個上三角矩陣UU與一個單位下三角矩陣LL的乘積。

懶得敲LaTeX公式了,書上由具體的推導過程,這裏我們重點介紹代碼吧

主要就是在高斯消元的過程中標記單位下三角矩陣LL,算法複雜度O(N3)O(N^3),沒有變化。

C++代碼

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define int long long
const int N = 1e2 + 10;
int a[N][N], b[N][N];
int n;
void LU_Factorization()
{
    for (int i = 0; i < n; i++)
        b[i][i] = 1;

    for (int k = 0; k < n; k++)
        for (int i = k + 1; i < n; i++)
        {
            double t = a[i][k] / a[k][k];
            b[i][k] = t;
            for (int j = 0; j < n; j++)
            {
                a[i][j] -= a[k][j] * t;
            }
        }
    printf("L矩陣爲:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d ", b[i][j]);
        puts("");
    }
    printf("U矩陣爲:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d ", a[i][j]);
        puts("");
    }
}
signed main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];
    LU_Factorization();
    return 0;
}

python代碼

老師同意調庫了,,試一下numpy(雖然本質上沒改變什麼,但是在學習中成長)

# LU分解
import numpy as np
def LU_Factorization(A):
    n = A.shape[0]
    L = np.zeros([n, n])
    U = np.zeros([n, n])
    for i in range(n):
        L[i][i] = 1
        if i == 0:
            U[0][0] = A[0][0]
            for j in range(1, n):
                U[0][j] = A[0][j]
                L[j][0] = A[j][0] / U[0][0]
        else:
            for j in range(i, n):
                temp = 0
                for k in range(0, i):
                    temp = temp + L[i][k] * U[k][j]
                U[i][j] = A[i][j] - temp
            for j in range(i + 1, n):
                temp = 0
                for k in range(0, i):
                    temp = temp + L[j][k] * U[k][i]
                L[j][i] = (A[j][i] - temp) / U[i][i]
    return L, U
def main():
    A = np.array([[1, 1, 1], [0, 4, -1], [2, -2, -1]])
    L, U = LU_Factorization(A)
    print('L矩陣爲:\n',L, '\nU矩陣爲:\n', U)
main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章