Python输出空列表问题求助:SymPy求解y关于p_s、p_h的方程
问题排查与解决方案
核心问题分析
你的代码返回空列表存在两个关键错误:
- 符号变量不统一:每个子函数(
s_r、c_r、c0_o)都重新定义了y、p_s、p_h,SymPy会将这些同名符号视为独立变量,导致最终表达式中的变量与func里定义的变量并非同一对象,求解时无法匹配。 - 错误混用
lambdify与solve:lambdify用于将符号表达式转为数值计算函数,而sympy.solve需要直接处理符号表达式,传入lambda函数会导致符号求解失效。
修正后的代码
统一符号定义,直接对符号表达式进行求解:
import sympy # 替换为你实际的HH类定义 class HH: α = sympy.symbols('α') π = sympy.symbols('π') τ = sympy.symbols('τ') θ = sympy.symbols('θ') h0 = sympy.symbols('h0') hh = HH() def s_r(y, p_s): α, π, τ = hh.α, hh.π, hh.τ return ((1-α)/p_s)*((y/(1+π))+τ) def c_r(y): α, π, τ = hh.α, hh.π, hh.τ return α*((y/(1+π))+τ) def c0_o(y, p_h): π, θ, h0, τ = hh.π, hh.θ, hh.h0, hh.τ return (y/(1+π)) - ((p_h*θ*h0**2)/(1+π)) + τ def func(): # 统一定义所有符号变量 y, p_h, p_s = sympy.symbols('y p_h p_s') # 传递统一符号到子函数 cr = c_r(y) sr = s_r(y, p_s) c0o = c0_o(y, p_h) # 构造符号方程 expression1 = ((cr**hh.α) * (sr**(1-hh.α))) - ((c0o**hh.α) * (hh.h0**(1-hh.α))) # 求解方程expression1=0,得到y关于p_s、p_h的表达式 y00 = sympy.solve(expression1, y, dict=True) return y00 # 执行并查看结果 print(func())
关键修正说明
- 统一符号传递:在主函数
func中定义所有符号变量,再传递给子函数,确保整个表达式使用同一组符号,避免变量冲突。 - 移除
lambdify:直接使用sympy.solve处理符号表达式,无需转为数值函数,保证符号求解的有效性。 - 明确参数依赖:子函数通过参数接收外部定义的符号,避免内部重复定义导致的变量隔离问题。
内容的提问来源于stack exchange,提问作者NaTa
相关产品推荐
相关产品推荐

