scipy.optimize.minimize()设置0<T<1边界时触发运行警告问题排查
问题产生原因
- 初始值设置违规:优化初始点设为
1,恰好落在约束边界上,此时目标函数内的分母项(T-1)**2计算结果为0,直接触发除零运算。 - 边界设置不符合开区间约束:传入的
bounds=[(0,1)]在scipy中为闭区间,允许算法在迭代时取到T=0、T=1两个端点,这两个点都会让目标函数出现无意义的计算结果。 - 目标函数注释与实现不匹配:注释中给出的U项公式存在括号不匹配的语法错误,且和代码中实际计算的U表达式不一致,存在公式写错导致优化结果失效的风险。
警告信息具体含义
RuntimeWarning: divide by zero encountered in true_divide:执行除法运算时出现了分母为0的情况,对应代码中计算U的分式步骤,当T=1时分母为0,运算结果为无穷大inf。RuntimeWarning: overflow encountered in multiply:乘法运算时出现数值溢出,即计算得到的数值超出了浮点数可表示的最大范围,这是除零得到inf后,无穷大值参与后续幂运算、乘法运算引发的连锁错误。
对应解决方法
- 更换合理初始点:不要选择边界值作为迭代起点,在(0,1)区间内选取初始值,例如0.5,避免第一步迭代就触发非法运算。
- 收紧边界避开奇点:由于约束是
0<T<1开区间,将边界设置为避开两端奇点的微小偏移值,例如[(1e-8, 1-1e-8)],从参数范围上杜绝T取0或1的可能。 - 核对目标函数公式:先修正注释中U项的公式错误,对照理论推导确认代码中U的表达式完全正确,避免逻辑错误导致优化结果无效。
- 兼容scipy的数组传参:将
math库的运算替换为numpy对应运算,适配scipy优化时传入数组参数的调用逻辑,减少运算兼容问题。
修正后的可运行参考代码:
import scipy.optimize import numpy as np def function(T): # 注意:请先核对U的表达式是否符合你的理论推导,此处保留原代码的计算逻辑 U = (T + 1 + 2 * np.sqrt(T)) / (T - 1) ** 2 return 1 - T**3 * (1 - T - U) ** 5 * U**10 # 初始点选区间内值,边界收紧避开0、1端点 res = scipy.optimize.minimize(function, x0=0.5, bounds=[(1e-8, 1 - 1e-8)]) w = res.x
内容的提问来源于stack exchange,提问作者bibols
相关产品推荐
相关产品推荐

