使用Python的SLSQP进行最小化时出现“float不可迭代”错误求助
问题原因与解决方法
错误根源
scipy.optimize.minimize的bounds参数要求传入可迭代的边界集合(比如列表、元组),每个元素对应一个优化变量的上下限。你当前直接传入了单个元组(0.0, p1),程序会把这个元组里的两个浮点数当成两个变量的边界,而你的优化函数是单变量的,因此触发“float is not iterable”错误。
修正方案
将单个边界元组包装成列表(或嵌套元组),明确告诉程序这是单变量的边界:
import math from scipy.optimize import minimize def func1(x): return (x-1)**2 def func2(x): return math.pow(x-0.5,2) # 假设a、b已定义在0.0~1.0之间 a = 0.3 b = 0.4 p1 = 1.0 - a p2 = 1.0 - b # 修正:将单个边界元组放入列表中 bound1 = [(0.0, p1)] bound2 = [(0.0, p2)] x0 = 0.5 result1 = minimize(func1, x0, method='SLSQP', bounds=bound1) result2 = minimize(func2, x0, method='SLSQP', bounds=bound2) newX = result1.x newY = result2.x
额外说明
- 若是多变量优化,
bounds需要为每个变量提供一个(lower, upper)元组,比如两个变量就传[(0,1), (0,2)] - 确保提前导入
scipy.optimize.minimize和math模块,避免其他潜在报错
内容的提问来源于stack exchange,提问作者kira
相关产品推荐
相关产品推荐

