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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:36