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

计算传递函数相角时触发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内部处理逻辑陷入了无限递归。

解决步骤

  1. 导入sympy原生的atan2函数,替换lcapy的版本:
    在导入部分添加from sympy import atan2,确保用sympy的atan2处理符号表达式。
  2. 修改相角计算代码,明确调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:10