我有一些变量的方程。我想求出这些变量的值。我该怎么做?方程式就像-
a + B = 25,a + c = 20,b + d = 17,c + d = 12
现在我想求出a,B,c,d的值。
我已经尝试使用下面的代码,但我得到一个异常。
代码:
import numpy as np
A = np.array([[1,1,0,0], [1,0,1,0], [0,1,0,1], [0,0,1,1]])
B = np.array([25, 20, 17, 12])
x = np.linalg.solve(A, B)
print x
例外情况:
Traceback (most recent call last):
File "C:/Users/achilles/Desktop/Desktop/python/nump.py", line 8, in
x = np.linalg.solve(A, B)
File "C:\Python27\lib\site-packages\numpy\linalg\linalg.py", line 375, in
solve
r = gufunc(a, b, signature=signature, extobj=extobj)
File "C:\Python27\lib\site-packages\numpy\linalg\linalg.py", line 90, in
_raise_linalgerror_singular
raise LinAlgError("Singular matrix")
LinAlgError: Singular matrix
我想这是因为我用'0'(零)代替了方程中缺失的变量。就像第一个等式一样,缺少'c'和'd ',所以我对它们都使用了0。那么,找到这些变量的值的解决方案是什么呢?谢谢
4条答案
按热度按时间vd2z7a6w1#
这里的问题不是代码问题,而是数学问题--你在这里得到线性代数错误的原因是因为这是不可解的。如果你把你输入到wolframAlpha中,你可以看到:
https://www.wolframalpha.com/input/?i=a+%2B+b+%3D+25,+a+%2B+c+%3D+20,+b+%2B+d+%3D+17,+c+%2B+d+%3D+12
给出了输出
b = 25 - a, c = 20 - a, d = a - 8
,这意味着尽管你可以找到变量的相对值,但这些值定义了一个可能的解的曲面(想想你的唯一解是图上x=1,y=2的一个点,这就像说解是y = x + 3这条线沿着的任何地方--但是如果没有帮助,就忽略它!)将其与最终方程为c + d + a = 12时的输出进行比较:
https://www.wolframalpha.com/input/?i=a+%2B+b+%3D+25,+a+%2B+c+%3D+20,+b+%2B+d+%3D+17,+c+%2B+d+%2B+a%3D+12
a = 0, b = 25, c = 20, d = -8
(by顺便说一句,你的方法是正确的,并且适用于可解方程)
这是一个单一的定义的解决方案。因此,问题是你的方程并没有约束一个单一的解决方案,所以你不能“解决”他们。
kyxcudwk2#
你的方程没有唯一解;如果你为其中一个变量选择一个值,你就可以确定其余的值。
例如:如果a=0,那么0+B=25,0+c=20,这导致20+d=12,所以d=-8。
jbose2ul3#
矩阵的行列式决定了你可以有多少个解。一个正行列式意味着一个唯一解,一个负行列式意味着没有解,如果
这意味着你的矩阵是“奇异的”,解位于一个平面上,没有唯一的解。
798qvoo84#