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

How do I use SymPy to simplify by substitution a number of equations to get to a single simplified equation?

提问人:Data Lark 提问时间:9/15/2023 最后编辑:Amirhossein TaheriData Lark 更新时间:9/19/2023 访问量:66

问:

我的问题和我帖子的标题一模一样。附上一张图片,上面有我想要实现的示例。

问题描述我在原始帖子和问题解决后更新了此文件以纠正错别字。

注意图片中的描述为零。Vref

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

Python sympy 替换 简化

评论

1赞 jjramsey 9/15/2023
不要发布代码图像。另外,详细说明您之前尝试过的内容。请参阅此处:stackoverflow.com/help/how-to-ask
0赞 Friedrich 9/15/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

0赞 Davide_sd 9/15/2023 #1

找到您正在寻找的解决方案非常容易。首先,你找到 from ,将其代入并求解为:Vxeq1eq2Vo

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

enter image description here

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

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

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

enter image description here

现在,我想看看大加法的论点顺序:

Vo_expr.args[1].args

enter image description here

我选择需要修改的术语:

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

enter image description here

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

enter image description here

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

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

enter image description here

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

Vo_final.equals(Vo_expr)
# out: True

评论

0赞 Data Lark 9/15/2023
stackoverflow.com/users/2329968/davide-sd 提供的解决方案是正确的。谢谢你的努力。我将在未来几年使用它。
0赞 Davide_sd 9/15/2023
将回复标记为问题的解决方案。:)