numpy 解多元线性方程组

c8ib6hqw  于 2023-06-23  发布在  其他
关注(0)|答案(4)|浏览(95)

我有一些变量的方程。我想求出这些变量的值。我该怎么做?方程式就像-
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。那么,找到这些变量的值的解决方案是什么呢?谢谢

vd2z7a6w

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顺便说一句,你的方法是正确的,并且适用于可解方程)
这是一个单一的定义的解决方案。因此,问题是你的方程并没有约束一个单一的解决方案,所以你不能“解决”他们。

kyxcudwk

kyxcudwk2#

你的方程没有唯一解;如果你为其中一个变量选择一个值,你就可以确定其余的值。
例如:如果a=0,那么0+B=25,0+c=20,这导致20+d=12,所以d=-8。

jbose2ul

jbose2ul3#

矩阵的行列式决定了你可以有多少个解。一个正行列式意味着一个唯一解,一个负行列式意味着没有解,如果

np.linalg.det(A)

0.0

这意味着你的矩阵是“奇异的”,解位于一个平面上,没有唯一的解。

798qvoo8

798qvoo84#

class equ:  # Creating Class
def equation(self,x1,y1,z1,x2,y2,z2): # Entering Variable in Function
    # x + y = C Write variable in these form, Variable is always +ve , make constant -ve.
    # a = f'{x1}x + {y1}y = {z1}'
    # b = f'{x2}x + {y2}y = {z2}'
    y =(z1*x2 - z2*x1)/(y1*x2 - y2*x1)
    x = (z1 - (y*y1))/x1
    # print(f'First Equation is : {a} \nSecond Equation is : {b}')
    print(f"x = {x} \ny = {y}")
    return x, y    

eq =equ()
# First Equation is : 2x + 2y = 5  
# Second Equation is : 5x + 4y = 14
eq.equation(2,2,5,5,4,14)

相关问题