Python上的线性代数

5
我想使用numpy.linalg.solve来解决一个线性代数方程,但是我得到了一个错误消息,说“数组的最后两个维度必须是正方形”。请帮我解决一下,谢谢!这是我的代码:
import numpy as np
from numpy. linalg import solve

A = np.array([[3,-1,-1,0,0,0], [-1,4,-1,-1,0,0], [0,0,-1,-1,4,-1], [0,0,0,-1,-1,3]],float)

w = np.array([5,5,0,0],float)

v = solve(A,w)

print(v)

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - castle-bravo
3
他可以使用numpy.linalg.lstsq(A, w) - jandob
@jandob,我正准备为他/她实现一个伪逆函数,但我看到这已经为我完成了。 :) - castle-bravo
@castle-bravo 最好避免显式计算伪逆,因为它的计算成本更高,数值稳定性也比lstsq使用的基于SVD的方法差。 - ali_m
@jandob,你可以把你的评论发布为答案... - Saullo G. P. Castro
3个回答

6

如igavriil所述,numpy.linalg.solve只能用于找到(精确的)解决方案,适用于确定性良好的系统(即正方形系数矩阵)。

如果您的系统是欠定或超定的,则通常没有精确解。如果您想找到近似解,可以使用numpy.linalg.lstsq。它使用一种称为“最小二乘拟合”的方法来找到最小化总体误差的解决方案。


3

这个错误的基本意思是线性系统不能被明确地解决。这是因为您有6个变量和只有4个方程。换句话说,系数矩阵必须是一个方阵。 当以下情况发生时会引发此错误:

max(a.shape[-2:]) != min(a.shape[-2:]):

-1

所以如果你想要解决 A x = b 但是 A 不是方阵,你可以简单地这样做:

A_pseudoinverse = np.linalg.pinv(A)
x = A_pseudoinverse @ b

这与@jandjob的答案相同,或者至少非常接近。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接