Numpy与线性方程组(Python与高等代数01)

1.求矩阵的秩

import numpy as np
A = np.mat([
    [1,2,1],
    [2,4,6],
    [3,3,2]],int)

rank = np.linalg.matrix_rank(A)

2.求解齐次线性方程组

齐次线性方程组要么有无穷多解,要么只有零解

对于AX=0,对A做SVD分解可得 A_{m*n}=U_{m*m}S_{m*n}V_{n*n}^{T}

由高等代数知识得,求解齐次线性方程组就是对系数矩阵A做SVD分解后,从V_{n*n}^{T}最后一行向上选取出的n-r行向量的线性组合

这里的r是系数矩阵A的秩

如果没有记错的话,这个程序得自己写。。。

import numpy as np


def simplify(ans):
    try:
        q = eval(input("decimal digit"))
        type(q) == type(5)
    except:
        q = 5
    for i in ans:
        Min = min([abs(c) for c in i])
        ans[ans.index(i)] = [round(d/Min,q) for d in i]
    return ans

def homogeneous_linequationsolve(A):
    ans = []
    rank = np.linalg.matrix_rank(A)
    u,s,vt = np.linalg.svd(A)
    A = np.array(A)
    n = len(A[0])
    vt = np.array(vt)[::-1]
    if n-rank > 0:
        for i in range(0,n-rank):
            ans.append(vt[i])
    else:
        return("only null solution")

    ans = simplify(ans)
    return ans
    
A = np.mat([[2,1,3,7],[0,7,1,4],[0,0,1,3]])
print(homogeneous_linequationsolve(A))
print("over")

得到输出:

[[7.5, -1.0, -21.0, 7.0]]

那么:

方程的解就是

x = k1 * |7.5 -1 -21 7|

3.求解非齐次线性方程组

这个倒是很有现用的方法

为了解方程组

\left\{\begin{matrix} 2x_{1}+4x_{2}=1\\ x_{1}+3x_{2}=1 \end{matrix}\right.

a = np.mat([[2, 4], [1, 3]])
b = np.mat([1, 1]).T    
x = np.linalg.solve(a, b)        
print(x)

4.下期吧

你可能感兴趣的:(线性代数,python)