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

Python求解不等式遇RecursionError:如何获取x的可行区间?

解决SymPy求解不等式时的RecursionError问题

问题场景

需要求解不等式 12/300 < 0.45*sympy.sqrt(Ro/(2*f*x)) 的x可行区间,其中Ro通过代码计算,但运行SymPy代码时触发递归深度超限错误。

原代码

# 定义变量
P = 50
Vin = 300
Vout = 12
f = 50000
DVout = 0.05
D = 0.45
Ts = 1/f

# 求解程序
import numpy as np
import sympy
from sympy import *

Ro = Vout**2/P
a = Vout/Vin

x = Symbol('x')
q = solve_univariate_inequality(a <= D*sympy.sqrt(Ro/(2*f*x)), x, S.Reals)

错误信息

RecursionError                            Traceback (most recent call last)
<ipython-input-53-6eeaca6392d4> in <module>
     19 # # var('x')
     20 x = Symbol('x')
---> 21 q = solve_univariate_inequality(a <= D*sympy.sqrt(Ro/(2*f*x)), x, S.Reals)
     22 # solvify(D*sympy.sqrt(Ro/(2*f*x)), x, S.Reals)
     23 # # solvify(D*sympy.sqrt(Ro/(2*f*x), x))

12 frames
... last 9 frames repeated, from the frame below ...

/usr/local/lib/python3.7/dist-packages/sympy/solvers/solveset.py in _solveset(f, symbol, domain, _check)
   1060                         result += _solve_radical(equation,
   1061                                                  symbol,
-> 1062                                                  solver)
   1063                     elif equation.has(Abs):
   1064                         result += _solve_abs(f, symbol, domain)

RecursionError: maximum recursion depth exceeded while getting the str of an object

错误原因

SymPy在处理包含浮点数的根式不等式时,内部递归逻辑容易出现循环,导致递归深度超限。原代码中的0.45是浮点数,会干扰符号运算的精确性,触发无终止的递归调用。

解决步骤

  1. 替换浮点数为精确有理数:用SymPy的Rational()或分数形式表示所有小数,确保符号运算的精确性。
  2. 明确变量定义域:由于x出现在根号内且作为分母,x必须为正实数,定义Symbol时添加positive=True约束,减少不必要的分支计算。

修正后的代码

# 定义变量
P = 50
Vin = 300
Vout = 12
f = 50000
DVout = Rational(5, 100)  # 替换0.05为有理数
D = Rational(9, 20)       # 替换0.45为有理数9/20
Ts = 1/f

# 求解程序
import sympy
from sympy import *

Ro = Vout**2 / P
a = Rational(Vout, Vin)   # 用有理数表示12/300

# 定义x为正实数,避免无效定义域分支
x = Symbol('x', positive=True)
# 求解不等式
q = solve_univariate_inequality(a <= D*sympy.sqrt(Ro/(2*f*x)), x, S.Reals)

print(q)

运行结果

执行后会得到x的可行区间:

(0, 675/64]

转换为小数即 0 < x ≤ 10.546875。

内容的提问来源于stack exchange,提问作者Gustavo Wohlers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:55:17