如何强制sympy提取特定的子表达式?

2024-10-01 04:59:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个结论是这样的:

from sympy import *
Vin,Vc,C1,Cs,R1,Rs,t=symbols(r'V_{in},V_{C},C_1,C_S,R_1,R_S,t')
k1=Symbol('k_1')
eqVc=Eq(Vc(t),(Rs*(exp(t*(R1+Rs)/(R1*Rs*(C1+Cs))) - 1)*Heaviside(t) + 
                     k1*(R1+Rs))*exp(-t*(R1+Rs)/(R1*Rs*(C1+Cs)))/(R1+Rs))

表达式eqVc如下所示:

我知道这个函数的形式是:

我的目标是获得Vcinit、Vcfinal和tau的值,但特别是tau。在

有没有办法让Sympy提取这些值?cse()并不是我想要的那样——我可以让它代替C1+Cs,例如通过使用cse([C1+Cs,eqVc]),它确实认识到e的指数是一个公共子表达式,但它倾向于在子表达式中包含t。在


Tags: fromimport表达式k1cssympyrsc1
1条回答
网友
1楼 · 发布于 2024-10-01 04:59:11

一种简单的方法是求解参数,这些参数将导致表达式在若干时间点上相等。鉴于表格实际上是相同的,这将很好地发挥作用:

^{1}$

我得到的答案是

^{pr2}$

由于变量的定义方式,log(exp())没有被简化。将所有内容都定义为实的(V_Ci, tau, V_Cf = symbols('V_Ci, tau, V_Cf', real=True)以及在代码中进行类似的修改)可以简化解决方案

[{V_Ci: k_1, 
  V_Cf: R_S/(R_1 + R_S), 
   tau: R_1*R_S*(C_1 + C_S)/(R_1 + R_S)}]

相关问题 更多 >