计算传递函数相角时触发RecursionError递归深度超限问题求助
问题描述
我正在推导传递函数分子与分母相角的通用表达式,计算分母相角时触发了RecursionError: maximum recursion depth exceeded while calling a Python object错误。注释最后一行den_phase = atan2(H_den_imag,H_den_real)程序可正常运行,取消注释则报错。我用atan2()函数期望得到明确的相角表达式。
相关代码
!pip install lcapy !pip install folium !pip instalpdflatex !sudo apt install texlive-latex-recommended !sudo apt install texlive-latex-extra !sudo apt install dvipng from lcapy import * import lcapy #from lcapy import s, expr #from IPython.display import display, Math from sympy import Symbol #from sympy import I, re, im cct = Circuit(""" R 1 2 C 2 0""") H = cct.transfer(1, 0, 2, 0) print("H =",H) H=H(jw).simplify() print("H(jw) =",H) H_num, H_den = H.as_numer_denom() # Extract numerator and denominator H_num_real = re(H_num) H_num_imag = im(H_num) print("num_real:",H_num_real) print("num_imag:", H_num_imag) H_den_real = re(H_den) H_den_imag = im(H_den) print("den_real:",H_den_real) print("den_imag:", H_den_imag) num_phase = atan2(H_num_imag, H_num_real) print("num_phase=",num_phase) den_phase = atan2(H_den_imag,H_den_real)
运行输出
H=((1/(C*R))/(s + 1/(C*R)))*1 H(jw)=1/(j*C*R*omega + 1) num_real:1 num_imag:0 den_real:1 den_imag:C*R*omega num_phase:0
问题分析与解决办法
错误原因
触发递归超限是因为你调用的atan2是lcapy封装的版本,而非sympy原生函数。当传入lcapy的符号表达式时,lcapy的atan2内部处理逻辑陷入了无限递归。
解决步骤
- 导入sympy原生的
atan2函数,替换lcapy的版本:
在导入部分添加from sympy import atan2,确保用sympy的atan2处理符号表达式。 - 修改相角计算代码,明确调用sympy的
atan2:
修改后的关键代码片段:
from sympy import Symbol, atan2 # 新增atan2的导入 # ... 其余代码保持不变 ... num_phase = atan2(H_num_imag, H_num_real) print("num_phase=",num_phase) den_phase = atan2(H_den_imag,H_den_real) print("den_phase=", den_phase)
效果说明
sympy的atan2可以直接处理符号表达式,对于atan2(C*R*omega, 1)会直接返回atan(C*R*omega),这正是你需要的清晰相角表达式,同时不会触发递归错误。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

