栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

numpy实现高等代数矩阵的求解过程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

numpy实现高等代数矩阵的求解过程

1 矩阵秩

代数中求矩阵的秩


不为0的维数为2,则秩为2

下面我们看下numpy实现

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

rank = np.linalg.matrix_rank(A)
print(rank)

同样结果是rank=2
利用A.shape[0]>rank 来判断方程组有多少解

求解线性方程组

用矩阵表示方程组

上面一个是系数矩阵,一个是曾广矩阵

答案很明显了,解方程也就是对矩阵的变换
这类方程组分明显是非齐次线性方程组

非齐次线性方程组唯一解

非齐次线性方程组是常数项不全为零的线性方程组
非齐次线性方程组有解的条件是秩相同,也就是rankA=n(阶数)
numpy实现如下

import numpy as np

A = np.mat([
    [1, -2, 1],
    [0, 2, -8],
    [-4, 5, 9]], int)
B = np.array([[[0], [8], [-9]]], int)

rank = np.linalg.matrix_rank(A)
print(rank)  
print(A.shape[0])
print(np.linalg.solve(A,B))

结果输出如下

其中A.shape[0]就是n

无限多解的非齐次线性方程组

有结果我们可以看到rank=n-1,那么矩阵对应的方程组有无穷多解,如果在实战中出现这种情况就说明其中一个因子是无效的,与结果不相关的
如下线性方程组

这个矩阵同样是3阶4列,其中x3可以任意值,就造成了多解的情况。

矩阵分解如下



numpy实现如下

import numpy as np

A = np.mat([
    [1, -1, 1, -1],
    [0, 0, 2, -4]], int)
B = np.array([[[0], [1]]])

rank = np.linalg.matrix_rank(A)
print(rank)
print(A.shape[0])
print(np.linalg.pinv(A).dot(B))

最终输出如下

输出为方程组的最小范数解为 K* [-0.13636364 0.13636364 0.04545455 -0.22727273] ,其中K为任意常数
注意为了满足矩阵满秩的要求,我们只用到了[ [1, -1, 1, -1],[0, 0, 2, -4]] 和[[0], [1]],其他的舍弃

无解非齐次线性方程组的线性拟合

方程组AX=b无解,说明由矩阵A的列向量进行线性组合,无法得到b,有时候我们退而求其次,欲把A的列向量线性组合到最接近b的值,记作b。这时候的解称为变形解X,AX=b,b^ <> b但接近b。

此方程组矩阵的秩R(A)=2,R(A,b)=3,因此无解。但可以输入计算机求变形解X^:

numpy实现如下

import numpy as np

A = np.mat([
    [4, 2, -1],
    [3, -1, 2],
    [11, 3, 0]], int)
B = np.array([[2], [10], [8]])

rank = np.linalg.matrix_rank(A)
print(rank)
print(A.shape[0])
print(np.linalg.pinv(A).dot(B))


显示[b-b^]的绝对值总和为4,具体到3个式子,一个式子的误差在1.3左右。

n元齐次线性方程组求解

齐次线性方程组是常数项全为零的线性方程组


求解如下4元齐次线性方程组

numpy实现如下

import numpy as np

A= np.mat([[1,-1,-1,1],
           [1,-1,1,-3],
           [1,-1,-2,3]],int)
print(np.linalg.svd(A))

输出如下

其中第2个矩阵只列出A的奇异值,本例中有3个数,但最后的数很小e-16)应视为0。这样可以确定R(A)=2, (n-r}=2,我们从第3个矩阵截取下面的2个行向量即可。

我们还可以直接求解Ax=0

import numpy as np

A = np.mat([[1, -1, -1, 1],
            [1, -1, 1, -3],
            [1, -1, -2, 3]], int)


def derx(A, eps=1e-15):
    u, s, vt = np.linalg.svd(A)
    n_space = np.compress(s <= eps, vt, axis=0)
    return n_space.T


print(derx(A).T)

输出如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号