未使用Sympy运算却报cannot determine truth value of Relational错误求助
问题成因
你遇到的报错本质是abs(Yp-Yn)的计算结果是SymPy的符号数值类型,不是Python原生的浮点型,直接用于if判断时,Python无法直接判断这种SymPy表达式的布尔值,就会抛出cannot determine truth value of Relational错误。
具体到你的代码里,有两个点导致变量携带SymPy类型:
Fice函数直接调用了SymPy的log函数,所有计算结果都会被自动转为SymPy的Expr类型drvFice返回的是evalf得到的SymPy Float类型,而非Python原生float
修复方案
你只要在所有SymPy计算完成后,强制转为Python原生浮点类型即可,有两种修改方式可选:
方法1:修改函数返回值,自动转float
修改Fice函数,返回结果时套一层float():
def Fice(Y_s, L, y): res = (((y**2)/2) - (Y_s - L)*y + Y_s*(Y_s - L)*log(abs(y + Y_s))) return float(res)
修改drvFice函数,返回结果时套一层float():
def drvFice(Y_s, L, y): y0, Y_s0, L0 = symbols("y Y_s L") deriv = diff((((y0**2)/2) - (Y_s0 - L0)*y0 + Y_s0*(Y_s0 - L0)*log(abs(y0 + Y_s0))), y0) return float(deriv.evalf(subs={y0: y, Y_s0: Y_s, L0: L}))
方法2:在比较前转float
如果不想修改原有函数逻辑,也可以直接在if判断的位置做类型转换:
if float(abs(Yp - Yn)) < epsilon:
额外优化建议
你当前的代码每次调用drvFice都会重新定义符号、重新求导,执行效率很低,可以提前预计算导数表达式,避免循环中重复计算:
# 导数全局预计算,整个程序生命周期只执行一次 y0, Y_s0, L0 = symbols("y Y_s L") f_ice_expr = (((y0**2)/2) - (Y_s0 - L0)*y0 + Y_s0*(Y_s0 - L0)*log(abs(y0 + Y_s0))) drv_f_ice_expr = diff(f_ice_expr, y0) def drvFice(Y_s, L, y): return float(drv_f_ice_expr.evalf(subs={y0: y, Y_s0: Y_s, L0: L}))
内容的提问来源于stack exchange,提问作者user14336952
相关产品推荐
相关产品推荐

