Python线性方程求解-矩阵左除“\“、右除“/“

这篇具有很好参考价值的文章主要介绍了Python线性方程求解-矩阵左除“\“、右除“/“。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 线性方程组求解方法

2 左除“\”→Ax=B

3 右除"/"→xA=B

4 其它说明


1 线性方程组求解方法

  • 如果Ax=B,则x=A\B,称为左除;
  • 如果xA=B,则x=B/A,称为右除。

        式中x为未知数。一般情况下,左除用的系比较多一些。在matlab里面实现左除或者右除会比较简单,直接有运算符号"\"和"/"。但是在Python里面就不能直接采用运算符号:

  • Python里面"\"不是一个运算符号;
  • Python直接采用B/A,表示的是矩阵B的每个元素除以矩阵A的每个元素,这并不是矩阵运算。

那在Python里面该如何实现矩阵的除法运算呢?

2 左除“\”→Ax=B

(1)当矩阵A是方阵,注:A的行和B的行相等

① 采用inv()函数,即:

② 采用solve()函数,即:

举例:

import numpy as np
A=np.array([[1,5,3],[4,8,6],[7,10,9]])
B=np.array([[6],[8],[10]])
inv_A=np.linalg.inv(A)
x_1=np.dot(inv_A,B)
x_2=np.linalg.solve(A,B)
print(f'A={A}')
print(f'B={B}')
print(f'x_1={x_1}')
print(f'x_2={x_2}')

运行结果:

A=[[ 1  5  3]
 [ 4  8  6]
 [ 7 10  9]]
B=[[ 6]
 [ 8]
 [10]]
x_1=[[-2.00000000e+00]
 [-1.77635684e-15]
 [ 2.66666667e+00]]
x_2=[[-2.00000000e+00]
 [ 1.49213975e-15]
 [ 2.66666667e+00]]

注:当A并不是方阵时,采用inv()和solve()会报错,无法求解。

(2)当A不是方阵,注:A的行和B的行相等

① 采用pinv()函数求解,即:

② 采用lstsq()函数求解:

语法:numpy.linalg.lstsq(A,B,rcond=“warn”)

  • A是一个M行N列的系数矩阵;
  • B是一个(M,)或者(M,K),如果b是一个M行K列的二维矩阵,函数会逐个计算每一列的最小二乘法;
  • rcond这个参数是可选的,是用于奇异矩阵的处理的,官方推荐我们一般用 rcond=None;
  • 返回值:返回值的第一个元素即为我们想要的结果,所以一般的用法是lstsq()[0];

举例说明:

import numpy as np
A=np.array([[1,8,5,6],[4,6,7,8],[9,10,12,14]])
B=np.array([[6],[8],[10]])
x_1=np.dot(np.linalg.pinv(A),B)
x_2=np.linalg.lstsq(A,B,rcond=None)[0]
print(f'A={A}')
print(f'B={B}')
print(f'x_1={x_1}')
print(f'x_2={x_2}')

运行结果:

A=[[ 1  8  5]
 [ 4  6  7]
 [ 9 10 12]
 [ 4 10 14]]
B=[[ 6]
 [ 8]
 [10]
 [ 9]]
x_1=[[0.32212839]
 [0.68526414]
 [0.08256129]]
x_2=[[0.32212839]
 [0.68526414]
 [0.08256129]]

3 右除"/"→xA=B

(1)B是方阵,注:A的列和B的列相等。

① 采用inv()函数实现,即:

② 采用solve()函数,即

举例:

import numpy as np
B=np.array([[1,5,3],[4,8,6],[7,10,9]])
A=np.array([6,8,10])
inv_B=np.linalg.inv(B)
x_1=np.dot(A,inv_B)
x_2=np.linalg.solve(B.T,A.T).T
print(f'A={A}')
print(f'B={B}')
print(f'x_1={x_1}')
print(f'x_2={x_2}')

运行结果:

A=[ 6  8 10]
B=[[ 1  5  3]
 [ 4  8  6]
 [ 7 10  9]]
x_1=[  6.66666667 -10.66666667   6.        ]
x_2=[  6.66666667 -10.66666667   6.        ]

(2)B不是方阵,注:A的列和B的列相等。

采用pinv()函数实现,即

举例:

import numpy as np
B=np.array([[1,5],[4,8],[7,10]])
A=np.array([6,8])      #此时的A是(3,),是一维
A=A[:,np.newaxis].T    #此时的A是(3,1),是二维,必须是二维的才能用pinv()计算
print(f'A={A}')
print(f'B={B}')
x_1=np.dot(B,np.linalg.pinv(A))
print(f'A={A}')
print(f'B={B}')
print(f'x_1={x_1}')

运行结果(和matlab运行结果一样):

A=[[6 8]]
B=[[ 1  5]
 [ 4  8]
 [ 7 10]]
x_1=[[0.46]
 [0.88]
 [1.22]]

4 其它说明

① pinv能够求解方阵,只是运算代价更大一点;

② 设矩阵的行数为m列数为n,对于左除(A\B),当m≥n时,Python的求解结果和Matlab的求解结果一样;但是当m<n时,Python的求解结果不一样,原因是Matlab返回的解是尽可能多0值的解,Python返回得解是最小二乘解(范数最小)。不过这对于算法的应用区别不大,想返回何种解取决于实际问题,结果是否满足精度需求。文章来源地址https://www.toymoban.com/news/detail-455319.html

到了这里,关于Python线性方程求解-矩阵左除“\“、右除“/“的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性方程组的求解

    克莱姆法则 求解线性方程组有一种比较简单易行的方法就是用克莱姆法则 通过行列式的计算 以解出方程,下面给出行列式解方程的代码并分析优缺点; 对于一个n元一次方程组,如果可以将其化为n阶行列式就能使用克莱姆法则;例如: 有 D=    用(b1,b2,...bn)T替换D的第一列

    2024年02月05日
    浏览(30)
  • MATLAB-线性方程组求解

    线性方程组是线性代数中的重要内容之一,其理论发展的最为完善。MATLAB中包含多种处理线性方程组的命令,下面进行详细介绍。 对于形如AX=B的方程组来说,假设其系数矩阵A是m×n的矩阵,根据其维数可以将方程组分以下3种情况。 1)若m=n,则为恰定方程组,即方程数等于未知

    2023年04月16日
    浏览(36)
  • 数值分析——线性方程组求解

    清理磁盘的时候偶然发现大二下数值分析的实验作业还在,本着在丢弃之前可以放在网上以备不时之需的原则,我便发了上来。 分别用直接法、Jacobi迭代法、Gauss-Seidel迭代法求解下列线性方程组AX = b,其中A为五对角矩阵(n=20),b是除第一个分量是1外,其他分量都是0的列向量

    2024年02月05日
    浏览(31)
  • 线性代数代码实现(七)求解线性方程组(C++)

    前言:         上次博客,我写了一篇关于定义矩阵除法并且代码的文章。矩阵除法或许用处不大,不过在那一篇文章中,我认为比较好的一点是告诉了大家一种计算方法,即:若矩阵  已知且可逆,矩阵  已知,并且  ,求解矩阵 B 。我认为这种初等行变换的方法还是挺

    2023年04月23日
    浏览(40)
  • MATLAB 之 线性方程组求解

    在 MATLAB 中,关于线性方程组的解法一般分为两类:一类是直接法,就是在没有舍入误差的情况下,通过有限步的矩阵初等运算来求得方程组的解;另一类是迭代法,就是先给定一个解的初始值,然后按照一定的迭代算法进行逐步逼近,求出更精确的近似解。 线性方程组的直

    2024年02月08日
    浏览(38)
  • MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

    非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一

    2024年02月08日
    浏览(42)
  • matlab使用教程(6)—线性方程组的求解

            进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax = b 或 xA = b?         考虑一维示例具有指导意义。例如,方程         7x = 21         是否具

    2024年02月14日
    浏览(31)
  • 牛顿(Newton)迭代法求解非线性方程以及方程组的Matlab实现

    必做题目比较简单,写得有些随意,主要还是第二个拓展题目的难度比较高 传入题设数据有: 另附运行截图  

    2024年02月11日
    浏览(32)
  • 解线性方程组(一)——克拉默法则求解(C++)

    解线性方程组最基础的方法就是使用克拉默法则,需要注意的是,该方程组必须是线性方程组。 假设有方程组如下: { a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋯ ⋯ ⋯ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n begin{cases} a_{11}x_1+a_{12}x_2+cdots+a_{1n}x_n=b_1\\\\

    2024年02月20日
    浏览(31)
  • 牛顿-拉普森法求解线性方程组原理及matlab程序

      在多变量微积分和矩阵理论的交叉点是求解非线性代数方程的迭代方法。设是的 n n n 个未知向量 x ,有 F ( x ) = 0 ∈ R n mathbf{F}left( mathbf{x} right) =0in text{R}^{text{n}} F ( x ) = 0 ∈ R n 就是求解 x 的 n n n 个非线性方程组,其中向量函数具有连续导数,并且雅可比矩阵 F x ( x

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包