最小化SymPy表达式时SciPy报错无法将表达式转换为浮点数如何解决
错误原因
调用scipy.optimize.minimize时传入的初始猜测值是SymPy定义的符号变量x,scipy优化接口要求初始值必须为数值类型,无法直接处理符号对象,因此触发了can't convert expression to float的类型转换错误。
额外说明:你当前定义的f是均值为p的正态分布概率密度函数,该函数不存在全局最小值(当x趋向±∞时函数值无限趋近于0),仅在x=p处取得全局最大值。如果你实际需求是求函数最大值,需要对目标函数取反后再做最小化。
解决方法
1. 基础报错修复(仅解决类型转换问题)
将scipy_min的第二个参数替换为数值类型的初始猜测值即可:
import numpy as np from sympy import * from scipy.optimize import minimize as scipy_min x = Symbol('x') p = Symbol('p') f = exp(-(x-p)**2/2)/sqrt(2*pi) func = lambdify([x,p], f) def func_np(x): return func(x,2.2) # 初始值替换为数值,例如0 res = scipy_min(func_np, x0=0, method='Nelder-Mead', tol=1e-6) print(res)
运行该代码会返回趋近于±∞的x值,符合该函数无全局最小值的特性。
2. 求函数最大值的修正方案
如果你的实际需求是找函数的最大值,只需修改目标函数返回值为原函数的相反数即可:
import numpy as np from sympy import * from scipy.optimize import minimize as scipy_min x = Symbol('x') p = Symbol('p') f = exp(-(x-p)**2/2)/sqrt(2*pi) func = lambdify([x,p], f) def func_np(x): # 取反后最小化等价于原函数最大化 return -func(x,2.2) res = scipy_min(func_np, x0=0, method='Nelder-Mead', tol=1e-6) print("最优x值:", res.x)
运行后返回的x值会非常接近2.2,和正态分布密度函数最大值在均值处的理论特性一致。
内容的提问来源于stack exchange,提问作者JohnDoe122
相关产品推荐
相关产品推荐

