如何用SymPy符号求解传递函数e₀/eᵢ?返回空列表问题处理
SymPy求解传递函数返回空列表的解决方法
你遇到的问题是因为SymPy的solve函数无法直接对e_0/e_i这种复合表达式求解——它需要针对单个符号进行运算。下面给出两种修正方案:
方案一:先解出e₀,再计算传递函数
import sympy as smp e_0, e_i, z_1, z_2, R_1, R_2, C_1, C_2, s = smp.symbols('e_0,e_i,z_1,z_2,R_1,R_2,C_1,C_2,s') # 定义分压方程 Eq1 = smp.Eq(e_0, z_2 * e_i / (z_1 + z_2)) # 代入Z1和Z2的阻抗表达式 Eq2 = Eq1.subs(z_1, R_1 + 1/(s*C_1)) Eq3 = Eq2.subs(z_2, R_2 + 1/(s*C_2)) # 解出e₀的表达式 sol_e0 = smp.solve(Eq3, e_0)[0] # 计算传递函数e₀/e_i并化简 transfer_function = smp.simplify(sol_e0 / e_i) display(transfer_function)
方案二:直接定义传递函数为独立符号求解
import sympy as smp e_i, z_1, z_2, R_1, R_2, C_1, C_2, s, TF = smp.symbols('e_i,z_1,z_2,R_1,R_2,C_1,C_2,s,TF') # 直接用TF表示e₀/e_i,改写分压方程 Eq1 = smp.Eq(TF, z_2 / (z_1 + z_2)) # 代入阻抗表达式 Eq2 = Eq1.subs(z_1, R_1 + 1/(s*C_1)) Eq3 = Eq2.subs(z_2, R_2 + 1/(s*C_2)) # 求解传递函数TF并化简 transfer_function = smp.simplify(smp.solve(Eq3, TF)[0]) display(transfer_function)
关键说明
原代码中smp.solve(Eq3, e_0/e_i)返回空列表的核心原因是:e_0/e_i是一个复合表达式,并非SymPy识别的独立符号。通过上述两种方式,要么先解出e₀再推导比值,要么提前将传递函数设为独立符号,就能让SymPy正确求解并返回化简后的传递函数结果。
内容的提问来源于stack exchange,提问作者remusconnor
相关产品推荐
相关产品推荐

