提问人:Data Lark 提问时间:9/15/2023 最后编辑:Amirhossein TaheriData Lark 更新时间:9/19/2023 访问量:66
如何使用 SymPy 通过替换多个方程来简化以获得单个简化方程?
How do I use SymPy to simplify by substitution a number of equations to get to a single simplified equation?
问:
我的问题和我帖子的标题一模一样。附上一张图片,上面有我想要实现的示例。
问题描述我在原始帖子和问题解决后更新了此文件以纠正错别字。
注意图片中的描述为零。Vref
尝试使提到的 SymPy 函数工作失败。
答:
0赞
Davide_sd
9/15/2023
#1
找到您正在寻找的解决方案非常容易。首先,你找到 from ,将其代入并求解为: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
评论
0赞
Data Lark
9/15/2023
stackoverflow.com/users/2329968/davide-sd 提供的解决方案是正确的。谢谢你的努力。我将在未来几年使用它。
0赞
Davide_sd
9/15/2023
将回复标记为问题的解决方案。:)
评论