求解 Python 中的线性方程组
Solve system of linear equations in Python
我有一个符号线性方程组
i1 = id2 - u1/zg
i2 = (C+D*Y)*u1 + D* i1
i2 = u2/zl
u2 = (A+B*Y)*u1 + B*i1
我的目标是 u2 的解决方案,其中 u1 和 i1 被替换为上面声明的相应解决方案。 u2 的解是这个巨大的方程,现在手工计算
u2 = (A+B*Y)*(id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl)) + B * (id1 - (id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl))/zg)
我确定有办法让 Python 为我计算这个,因为它需要很长时间,而且手动执行此操作很容易出错。
基本上我希望 Python 为我消除所有未知变量(除了一个,然后我可以计算)。在上面的示例方程组中,i1 i2 u1 和 u2 是未知的。其他的都知道了。
感谢您的帮助。
好的,我是这样解决的:
equations = [
sym.Eq( (C+D*Y)*u1 + D* i1 , i2 ),
sym.Eq( id2 - u1/zg, i1),
sym.Eq(u2/zl, i2),
sym.Eq( (A+B*Y)*u1 + B*i1, u2 )
]
eq = sym.solve(equations, u2)
我之前确实试过了,但一定是哪里打错了。
结果是
id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl)
它比我手算的结果短很多,但它似乎是正确的。
from sympy import *
# unkowns
i1, i2, u1, u2 = symbols("i1, i2, u1, u2")
# knows quantities
id2, zg, zl, A, B, C, D, Y = symbols("id_2, z_g, z_l, A, B, C, D, Y")
# define equations:
# one way to do that is to write them as:
# (Left Hand Side) - (Right Hand Side) = 0
eq1 = i1 - (id2 - u1/zg)
eq2 = i2 - ((C+D*Y)*u1 + D* i1)
eq3 = i2 - (u2/zl)
eq4 = u2 - ((A+B*Y)*u1 + B*i1)
# solve the system of equation
sol = solve([eq1, eq2, eq3, eq4], [i1, i2, u1, u2])
# retrieve the solution of u2
sol[u2]
# out: (A*D*id_2*z_g*z_l - B*C*id_2*z_g*z_l)/(A*z_g + B*Y*z_g - B - C*z_g*z_l - D*Y*z_g*z_l + D*z_l)
我有一个符号线性方程组
i1 = id2 - u1/zg
i2 = (C+D*Y)*u1 + D* i1
i2 = u2/zl
u2 = (A+B*Y)*u1 + B*i1
我的目标是 u2 的解决方案,其中 u1 和 i1 被替换为上面声明的相应解决方案。 u2 的解是这个巨大的方程,现在手工计算
u2 = (A+B*Y)*(id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl)) + B * (id1 - (id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl))/zg)
我确定有办法让 Python 为我计算这个,因为它需要很长时间,而且手动执行此操作很容易出错。
基本上我希望 Python 为我消除所有未知变量(除了一个,然后我可以计算)。在上面的示例方程组中,i1 i2 u1 和 u2 是未知的。其他的都知道了。
感谢您的帮助。
好的,我是这样解决的:
equations = [
sym.Eq( (C+D*Y)*u1 + D* i1 , i2 ),
sym.Eq( id2 - u1/zg, i1),
sym.Eq(u2/zl, i2),
sym.Eq( (A+B*Y)*u1 + B*i1, u2 )
]
eq = sym.solve(equations, u2)
我之前确实试过了,但一定是哪里打错了。
结果是
id1*zg*(-B + D*zl)/(A*zg + B*Y*zg - B - C*zg*zl - D*Y*zg*zl + D*zl)
它比我手算的结果短很多,但它似乎是正确的。
from sympy import *
# unkowns
i1, i2, u1, u2 = symbols("i1, i2, u1, u2")
# knows quantities
id2, zg, zl, A, B, C, D, Y = symbols("id_2, z_g, z_l, A, B, C, D, Y")
# define equations:
# one way to do that is to write them as:
# (Left Hand Side) - (Right Hand Side) = 0
eq1 = i1 - (id2 - u1/zg)
eq2 = i2 - ((C+D*Y)*u1 + D* i1)
eq3 = i2 - (u2/zl)
eq4 = u2 - ((A+B*Y)*u1 + B*i1)
# solve the system of equation
sol = solve([eq1, eq2, eq3, eq4], [i1, i2, u1, u2])
# retrieve the solution of u2
sol[u2]
# out: (A*D*id_2*z_g*z_l - B*C*id_2*z_g*z_l)/(A*z_g + B*Y*z_g - B - C*z_g*z_l - D*Y*z_g*z_l + D*z_l)