如何使用 SymPy 通过替换多个方程来简化以获得单个简化方程?

问题描述 投票:0回答:1

我的问题和我帖子的标题一模一样。附件是一张图片,其中包含我想要实现的目标的示例。我是 python 新手,所以感谢您的帮助。 Description of problem

注意说明图片中的 Vref = 0。

使提到的 SymPy 函数正常工作的尝试失败了。

sympy equation substitution simplify
1个回答
0
投票

找到您正在寻找的解决方案非常简单。首先,从

Vx
中找到
eq1
,将其代入
eq2
并求解
Vo

from sympy import *
Vi, Vo, Vx = symbols("Vi, Vo, Vx")
R1, R2, R3, R4 = symbols("R1:5")

eq1 = Eq((0 - Vi) / R1, (Vi - Vx) / R2)
eq2 = Eq((Vi - Vx) / R2, Vx / R4 + (Vx - Vo) / R3)
Vx_expr = solve(eq1, Vx)[0]
Vo_expr = solve(eq2.subs(Vx, Vx_expr), Vo)[0]
Vo_expr

现在,如果你想将其转换为你在屏幕截图中看到的输出,你必须使用表达式操作,这对于 SymPy 新手来说纯粹是受虐狂。我会告诉你我会怎么做。

在下面,您将看到几个正在运行的 sympy 函数。阅读他们的文档是你的工作。

Vo_expr = Vo_expr.expand().collect(Vi)
Vo_expr

现在,我想看看大加法的参数顺序:

Vo_expr.args[1].args

我选择需要修改的条款:

term1 = Add(*[t for i, t in enumerate(Vo_expr.args[1].args) if i in [3, 4]])
display(term1, term1.together())

term2 = Add(*[t for i, t in enumerate(Vo_expr.args[1].args) if i in [1, 2]])
display(term2, term2.together())

然后,我用修改后的形式替换这些术语:

Vo_final = Vo_expr.subs({term1: term1.together(), term2: term2.together()})
Vo_final

最后,我验证结果是否等于原始表达式:

Vo_final.equals(Vo_expr)
# out: True
© www.soinside.com 2019 - 2024. All rights reserved.