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

Sympy函数求值异常:代入参数后仍输出表达式而非数值

问题分析与解决

你的代码核心问题在于:过早将符号表达式转换为lambda函数,导致后续对U01、U02的数值赋值无法同步到函数内部。当你用sp.lambdify(s, expr.subs(C1,U01))创建u1时,U01和U02还是符号变量,lambda函数内部固化了对这些符号的引用。后续你虽然把全局的U01、U02赋值为浮点数,但lambda函数不会自动更新依赖,调用时依然会保留符号表达式。

方法一:基于符号表达式直接求值(推荐)

先保留符号表达式,解出U01、U02的数值后再代入求值,避免过早转换为lambda函数:

import sympy as sp

E1=72500
A1=15

U01,s,C1,U02 = sp.symbols("U01,s,C1,U02")

u1 = sp.symbols("u1", cls=sp.Function)
eqs=sp.Eq(E1*A1*u1(s).diff(s)+180+U02,0)
sol=sp.dsolve(eqs,dict=True)
expr=sol.args[1]

# 保留符号表达式,暂不转换为lambda
u1_expr = expr.subs(C1, U01)

# 用符号表达式构建方程
expression1 = u1_expr.subs(s, 10) - 54
expression2 = u1_expr.subs(s, 7) - 99

eq1=sp.Eq(expression1,0)
eq2=sp.Eq(expression2,0)

solution = sp.solve([eq1,eq2],[U01,U02])
U01_val = float(solution[U01])
U02_val = float(solution[U02])

# 代入所有变量求值
u1_55 = u1_expr.subs({s:55, U01: U01_val, U02: U02_val})
print(float(u1_55))
# 输出:-621.0000000000018

方法二:调整lambda函数参数

如果需要保留lambda函数,将U01、U02也作为函数参数,调用时传入数值:

import sympy as sp

E1=72500
A1=15

U01,s,C1,U02 = sp.symbols("U01,s,C1,U02")

u1 = sp.symbols("u1", cls=sp.Function)
eqs=sp.Eq(E1*A1*u1(s).diff(s)+180+U02,0)
sol=sp.dsolve(eqs,dict=True)
expr=sol.args[1]

# 将U01、U02也设为lambda函数的参数
u1 = sp.lambdify((s, U01, U02), expr.subs(C1,U01))

# 用符号构建方程
expression1 = u1(10, U01, U02) - 54
expression2 = u1(7, U01, U02) - 99

eq1=sp.Eq(expression1,0)
eq2=sp.Eq(expression2,0)

solution = sp.solve([eq1,eq2],[U01,U02])
U01_val = float(solution[U01])
U02_val = float(solution[U02])

# 调用时传入所有参数
print(u1(55, U01_val, U02_val))
# 输出:-621.0000000000018

内容的提问来源于stack exchange,提问作者Rasit Er

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:39