python - 在 Python 中使用两个变量优化非线性函数
问题描述
我正在尝试优化以下功能:
f(x,a+,a-,b) = a+*((1/(1+exp(-b*x)) - 1/2) if x>=0
= a-*((1/1+exp(-b*x)) -1/2) if x<0
constraints: a+ * b <=4, a-*b <=4
a+/2 <= max(if(x>0))
a-/2 <= -min(if(x<0))
我试图通过设置边界 [(0,2), (0,2), (1,None)] 和上面定义的约束来使用 scpiy 中的最小化函数,但是该函数没有提供正确的结果,特别是如果我使用 beta 作为约束中的参数。
from scipy.optimize import minimize
init_params=[0.0,0.0,20.0]
bnds = [(0.0,2.0), (0.0,2.0), (1.0,None)]
S_curve = pd.DataFrame()
S_curve['year'] = dfs2.index
S_curve['H_Change'] = np.array(dfs2.loc[:,'annualH_chg'])
S_curve['R_Change'] = np.array(dfs2.loc[:,'annualR_chg'])
S_curve['Weight'] = 1
S_curve.reset_index(drop=True)
weighted = S_curve[S_curve.Weight !=0]
minimum = -S_curve['R_Change'].min()
maximum = S_curve['R_Change'].max()
beta=init_params[2]
def constraint1(up, beta):
return 4.0-(up*beta)
def constraint2(down, beta):
return 4.0-(down*beta)
def constraint3(up, maximum):
return maximum - up/2.0
def constraint4(down, minimum):
return minimum - down/2.0
cons = [{'type':'ineq', 'fun':constraint1, 'args':(beta,)},
{'type':'ineq', 'fun':constraint2, 'args':(beta,)},
{'type':'ineq', 'fun':constraint3, 'args':(maximum,)},
{'type':'ineq', 'fun':constraint4, 'args':(minimum,)}]
soln = minimize(func, init_params, bounds=bnds, constraints=cons, method='SLQSP')
期望满足第一个和第二个约束,并且 beta (b) 不是恒定的。
解决方案
推荐阅读
- mongodb - 如何重命名 MongoDB 数据库?(当前状态)
- powershell - 从日志文件中获取最后 30 分钟
- javascript - java脚本websocket无法连接到python server
- json - Json Response Spring boot 中的继承
- python - 如何使用请求模块从 div 获取文本?
- javascript - NodeJS Firebase 等待请求
- azure-devops - SAPUI5 xhr 请求 Azure DevOps 授权失败
- php - PHP Scraper 循环直到超过时间限制(使用简单的 HTML Dom 解析器)
- r - Dredge MuMIn:在 GLMM 上使用挖泥机时,空模型是否包含随机效应?
- macos - OSX上的“dyld:警告,LC_RPATH @executable_path”是什么意思,我该如何解决?