我的问题和我帖子的标题一模一样。附件是一张图片,其中包含我想要实现的目标的示例。我是 python 新手,所以感谢您的帮助。
注意说明图片中的 Vref = 0。
使提到的 SymPy 函数正常工作的尝试失败了。
找到您正在寻找的解决方案非常简单。首先,从
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