You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:21:03