SymPy语法优化:避免不必要的数组嵌套问题
简化SymPy中复表达式幅度的计算代码
核心优化思路
你的代码里的嵌套问题源于不必要地将单个传递函数对象放进了列表,再通过列表推导式生成了嵌套列表。我们可以通过两种方式简化:
方式1:移除多余的列表嵌套
直接构造包含传递函数及其共轭的一维列表,避免嵌套:
from sympy import * s, omega = symbols('s omega', real=True, positive=True) # 直接生成传递函数并替换变量,无需包裹进列表 H = expand(prod(Butterworth(4))).subs(s, I*omega) # 直接传递[H, conjugate(H)]给prod,无嵌套 result = (-20 * ln(sqrt(expand(prod([H, conjugate(H)]))).subs(omega, 1.8), 10)).n()
合并为单行的版本:
(-20*ln(sqrt(expand(prod([expand(prod(Butterworth(4))).subs(s,I*omega), conjugate(expand(prod(Butterworth(4))).subs(s,I*omega))]))).subs(omega,1.8),10)).n()
方式2:利用SymPy内置的模函数(更简洁)
注意到公式 -20log₁₀(√(ℋ·ℋ*)) 等价于 -20log₁₀(|ℋ|)(因为复数的模 |ℋ| 本身就是 √(ℋ·ℋ*)),直接使用SymPy的Abs()函数求模,省去手动构造共轭乘积的步骤:
from sympy import * s, omega = symbols('s omega', real=True, positive=True) H = expand(prod(Butterworth(4))).subs(s, I*omega) result = (-20 * log(Abs(H).subs(omega, 1.8), 10)).n()
这个版本不仅完全消除了数组嵌套问题,代码逻辑也更贴合数学定义,可读性和效率都更高。
内容的提问来源于stack exchange,提问作者periblepsis
相关产品推荐
相关产品推荐

