You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:25:06