使用scipy.optimize.minimize时如何排除指定参数不参与优化过程
实现方案
完全可以实现该需求,核心逻辑是:不需要参与优化的参数通过scipy.optimize.minimize的args参数传入即可,不会被识别为待优化变量;遍历c2的所有取值分别执行优化,就能得到一一对应的最小值数组。
步骤1 改造目标函数
scipy.optimize.minimize要求待优化变量必须合并为一维数组作为目标函数的第一个入参,固定参数放在后续入参位置:
import numpy as np from scipy.optimize import minimize # 先定义你代码中未赋值的常量c1,替换为你实际的取值 c1 = 0.5 def func(opt_vars, c2): # 拆分待优化的四个角度参数 thet1, phai1, thet2, phai2 = opt_vars RhoABC = np.array([ [1,0,thet1,0,0,0,0,c1], [0,1,0,0,phai2,0,c2,0], [0,0,1,0,0,c2,thet2,0], [0,0,0,1,c2,0,0,0], [0,phai1,0,c2,1,0,0,0], [0,0,c2,0,0,1,0,thet2], [0,c2,0,0,0,0,1,0], [c1,0,0,phai1,0,0,0,1] ]) # 仅需特征值用eigvals效率更高,默认特征值不排序,如果要取最小特征值可替换为np.min(w.real) w = np.linalg.eigvals(RhoABC) return w[1].real
步骤2 定义优化配置
# 四个角度的取值范围都是(0, 2pi) bounds = [(0, 2*np.pi) for _ in range(4)] # 优化初始值,可随机生成多组初始值避免局部最优 x0 = np.array([np.pi, np.pi, np.pi, np.pi]) # 你的c2取值序列 c2_list = np.linspace(-1, 1, 10)
步骤3 遍历c2执行优化
min_value_list = [] optimal_params_list = [] for current_c2 in c2_list: res = minimize( fun = func, x0 = x0, args = (current_c2,), # 固定参数传入args,不参与优化 bounds = bounds ) # 存储当前c2对应的最小函数值、最优参数 min_value_list.append(res.fun) optimal_params_list.append(res.x) # 转换为数组,和c2_list一一对应 min_value_array = np.array(min_value_list) optimal_params_array = np.array(optimal_params_list)
注意事项
np.linalg.eig返回的特征值默认不会按大小排序,如果你要优化的是最小特征值,建议把返回值改为np.min(w.real),避免索引取值不符合预期。- 该非线性优化问题大概率存在局部最优,建议每个
c2迭代时用多组不同的初始值x0计算,取最小的结果作为最终输出。 - 如果你有多个不需要优化的固定参数,全部按顺序放到
args的元组中即可。
内容的提问来源于stack exchange,提问作者Bekaso
相关产品推荐
相关产品推荐

