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是浮点数,会干扰符号运算的精确性,触发无终止的递归调用。
解决步骤
- 替换浮点数为精确有理数:用SymPy的
Rational()或分数形式表示所有小数,确保符号运算的精确性。 - 明确变量定义域:由于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
相关产品推荐
相关产品推荐

