我有一个优化问题,如下所示:最小化:总和'(load [i] -6 * X [i])^ 2,i = 1,.. N',其中已知负载。 约束:X [i] = {-1或0或1},并且Y [i + 1] -Y [i] = 1.25x [i]其中Y [1] = Constant1 Y [N] = Con ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我想在请求的功率曲线上优化CHP工厂的运行。 因此,我定义了功率曲线,CHP工厂应尽可能地遵循该功率曲线。 必须应用多个界限和约束条件来代表CHP工厂的实际运行。 例如,这包括CHP可以打开或关闭,并且在打开时,其功率调制只能设置为特定百分比范围。
这是一个带有简短说明的最小工作示例:
import scipy.optimize as opt
import numpy as np
x = np.arange(200) # dummy x vector
poly_profile = np.array( # 7th degree polynome fit of profile
[-2.14104340e-11, 1.85108903e-08, -6.66697810e-06, 1.29239710e-03,
-1.45110876e-01, 9.40324129e+00, -3.24548750e+02, 4.60006330e+03])
poly_fun = np.poly1d(poly_profile) # make poly fun
profile = poly_fun(x[65:196])
x0 = np.zeros_like(profile) # all zeros as starting values
def optifun(x, profile): # define minimization fun
return - np.sum(profile * x)
bnds_hi = opt.Bounds(0.3, 1) # upper bounds
bnds_lo = opt.Bounds(0, 0) # lower bounds
res = opt.minimize(
optifun, x0, args=(profile), bounds=bnds_hi,
constraints={'type': 'eq', 'fun': lambda x: np.sum(x*40) - 2000},
method='SLSQP')
plt.plot(res.x)
plt.plot(profile)
所以这些是我要使用的界限:
(x == 0) or (0.3 <= x <= 1)
,对于数组x
中的任何值 >0.3
且<= 1
。 但是我可以指定下限或上限。 仅指定上限将无法“关闭CHP”,而将下限设置为bnds_lo = opt.Bounds(0, 1)
bounds=[bnds_lo, bnds_hi]
? 我想使用的约束:
np.sum(x*40) - 450
限制CHP工厂的启动次数。 作为一个例子,让我们假设
bnds_lo = opt.Bounds(0, 1) # lower bounds res = opt.minimize( optifun, x0, args=(profile), bounds=bnds_lo, constraints={'type': 'eq', 'fun': lambda x: np.sum(x*40) - 1000}, method='SLSQP')
这导致了热电联产工厂运行的三个阶段。 有什么办法可以限制这个? 我正在考虑添加一个特定的约束函数,该函数在前导0之后对正差值进行计数,但是我无法进行类似的工作(例如,由于大多数x
并不完全为0,因为边界设置为(0, 1)
,但其他问题也可能是原因)...
x != 0
应该是有利的。 我考虑过尝试与上一点类似的操作(限制启动次数),但也无法解决一些有用的问题。 到目前为止,这是最不重要的问题。 为了解决这些问题,我也尝试使用scipy.optimize.LinearConstraings
和NonlinearConstraings
但是method='trust-constr'
需要一个jac(据我在github上看,这似乎是一个错误),因此我无法这行得通。
有什么办法可以使这项工作吗? 特别是指定多个边界非常重要。
提前致谢!
真诚的,斯科蒂
profile * x0
在您的代码中给出
“ ValueError:操作数不能与形状(131,)(200,)一起广播”。
只是猜测, x_t
是产品onoff_t * xon_t
与onoff_t
= 0或1
在0 .. T
?中的每个t
处, 0.3 <= xon_t <= 1
0 .. T
即对于T = 5
存在2 ^ 5个可能的通onoff
序列,00000 00001 00010 .... 11111?
如果是这样,使用固定权重函数w_t
最大sum 0:T w_t * onoff_t * xon_t
w_t
是微不足道的:
其中w_t <= 0
: onoff_t = 0
,关闭
其中w_t > 0
: onoff_t = 1
,on, xon_t = 1
,max。
因此,这不是您的问题-请澄清。
如果进一步限制onoff_t
仅切换两次,即0 ... 1 ... 0 ...,那么可能的序列数量就足够少,可以按照以下方法尝试全部:
def pulse_generator( T=200, minwidth=5 ):
""" -> arrays of T floats, 0... 1... 0... """
for t0 in xrange( 1, T ):
for t1 in xrange( t0 + minwidth, T ):
pulse = np.zeros( T )
pulse[t0:t1] = 1
yield pulse
for pulse in pulse_generator( T ):
print "pulse:", pulse
optimize myfunction( pulse * xon ), 0.3 <= xon <= 1
切换4次,0 ... 1 ... 0 ... 1 ... 0 ...是相似的。 (有多少这样的脉冲对于一个给定T
参见维基百科? 明星和酒吧 -惊人)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.