用参数解析线性方程

时间:2018-12-19 13:26:17

标签: python numpy math sympy linear

晚上好,我也是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”,将引发错误,我该如何使其工作?感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

仅凭3个方程式就不能解决4个未知数。我唯一可能的建议是删除u

编辑

通常,像np.linalg.solve这样的线性系统求解器通常遵循相同的严格约定:第一个输入值应为x s系数的矩阵,第二个输入值应为一个常数值的矢量,代表各个方程式的左侧。如果您的系统不是这样,则必须首先手动对其进行重构,以使其符合标准约定。否则,您将不得不考虑使用更灵活的求解系统,例如solveset in Sympy

以下是使用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)}

答案 1 :(得分:0)

在最简单的情况下,您可以将方程式设置为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))看到这一点。