晚上好,我也是python的新手,但我想通过解决日常问题来提高我的技能。今天的任务是创建一个python程序,该程序可以计算线性应用程序,例如:
50x1 - 15x2 - 25x3 + 48x4 = 22
- 13x1 - 4x2 + 9x3 - 4x4 = -25
- 14x1 + 38x2 - 26x3 - 32x4 = -8*u-38
29x1 - 13x2 - 4x3 + 26x4 = 41
通常我会通过以下方式来解决这个问题:
import numpy as np
a = np.array([[50,-15,-25,48],[-13,-4,9,-4],[-14,38,26,-32],[29,-13,-4,26]])
b = np.array([22,-25,-8*u-38,41])
print(np.linalg.solve(a,b))
这会因为数组B中的字母"u"而引发错误,我该如何使其工作?谢谢你的建议。
仅用3个方程无法求解4个未知数。我唯一可能的建议是放弃u
。
编辑
通常,像np.linalg.solve
这样的线性系统解算器通常遵循相同的刚性约定:第一个输入值应该是x
的系数矩阵,第二个输入值应是表示单个方程左侧的常数值向量。如果你的系统不是这样的,你必须首先手动重构它,使其符合标准约定。否则,您将不得不考虑使用更灵活的求解系统,例如Sympy中的solveset
。
以下是如何使用Sympy:根据u
求解方程组
import sympy as sym
x_0,x_1,x_2,x_3 = sym.symbols('x_:4')
u = sym.symbols('u')
lhs = [
50*x_0 - 15*x_1 - 25*x_2 + 48*x_3,
-13*x_0 - 4*x_1 + 9*x_2 - 4*x_3,
-14*x_0 + 38*x_1 + 26*x_2 - 32*x_3,
29*x_0 - 13*x_1 - 4*x_2 + 26*x_3
]
rhs = [22,-25,-8*u-38,41]
eqs = [l - r for l,r in zip(lhs, rhs)]
sym.nonlinsolve(eqs, [*xs])
输出:
{((1572*u + 176197)/34925, -4*(2341*u + 37266)/34925, -204*(u + 1)/1397, -2*(722*u + 21677)/6985)}
您可以将等式设置为u的函数,在最简单的情况下:
a = np.array([[50,-15,-25,48],[-13,-4,9,-4],[-14,38,26,-32],[29,-13,-4,26]])
def solve(u):
b = np.array([22,-25,-8*u-38,41])
return np.linalg.solve(a,b)
您的u
不在矩阵中,这意味着系统对于不同的u
值没有一个、多个或无解决方案。使用行列式(np.linalg.det(a)
(可以看到。