首页 > 解决方案 > Scipy 最小化和步长约束

问题描述

我使用该scipy.optimize.minimize函数,并且我有一个一维数组,x0其中包含不同的参数。由于我使用不同的物理参数,例如,我不想对 2500K 数量级的温度进行 0.1 的迭代。所以我想对每个输入的函数迭代施加约束。我已经尝试过了:

x0 = [0.1, 10.0, 0.90,1200] #tau,star_diam,amC,Td
bounds = [ [0.005,1],[7,13],[0.05,1], [800,1500] ]

cons = []
for factor in range(len(bounds)):
    lower, upper = bounds[factor]
    l = {'type': 'ineq',
         'fun': lambda x, lb=lower, i=factor: x[i] - lb}
    u = {'type': 'ineq',
         'fun': lambda x, ub=upper, i=factor: ub - x[i]}
    cons.append(l)
    cons.append(u)


res = minimize(DUSTY_RUN,x0,args=(data_charac,lambda_max,lambda_min,DATA_DIR,INPUT_DIR), constraints=cons, method='COBYLA', options={'rhobeg': [0.01,0.01,0.01,100], 'maxiter': 5000, 'disp': False, 'catol': 1e-6})

在函数的选项中,该rhoberg选项被视为float,我尝试将其更改为列表/数组,但这并没有像我们猜测的那样改变任何东西。

标签: pythonpython-3.xscipyminimizescipy-optimize

解决方案


rhoberg是初始步骤,因此它不直接控制后续步骤。您可以在DUSTY_RUN函数中添加参数缩放 - 因为您编写了[0.01,0.01,0.01,100]可以将前三个乘以1e4.


推荐阅读