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
相关产品推荐
相关产品推荐

