我想在请求的功率曲线上优化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中的任何值
    这意味着总CHP功率的调制度x可以为0(关闭)或>0.3<= 1 但是我可以指定下限上限。 仅指定上限将无法“关闭CHP”,而将下限设置为bnds_lo = opt.Bounds(0, 1)
    将使热电联产工厂能够在不切实际的运行点(功率调制的0%至30%之间)下运行。
    有什么方法可以按照最小工作示例中指定的范围进行这项工作? 具体来说:是否可以同时设置两种边界,例如bounds=[bnds_lo, bnds_hi]
    我猜这是一个混合整数线性编程问题,但是COBYLA或SLSQP是否应该能够解决这个问题? 如果不是:是否有任何解决方法?

我想使用的约束:

  • np.sum(x*40) - 450
    将热量输出限制为一定的热量存储容量。 这里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) ,但其他问题也可能是原因)...

  • 设置CHP工厂的最小连续运行时间。 这意味着至少有5个连续的x != 0应该是有利的。 我考虑过尝试与上一点类似的操作(限制启动次数),但也无法解决一些有用的问题。 到目前为止,这是最不重要的问题。

为了解决这些问题,我也尝试使用scipy.optimize.LinearConstraingsNonlinearConstraings但是method='trust-constr'需要一个jac(据我在github上看,这似乎是一个错误),因此我无法这行得通。

有什么办法可以使这项工作吗? 特别是指定多个边界非常重要。

提前致谢!

真诚的,斯科蒂

#1楼 票数:2 已采纳

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 <= 0onoff_t = 0 ,关闭
其中w_t > 0onoff_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参见维基百科? 明星和酒吧 -惊人)


补充:我不是专家,但是开关控制对早些时候或晚一点的微小变化不是敏感吗? 一个程序(mer)可能花很多时间抖动,从而降低噪音。 分为两阶段,粗电网然后细电网

  1. 将时间0:T分成10个片段,全部运行2 ^ 10 = 1024个开关序列
    1A。 仔细观察最好的-任何模式?
  2. 将其边缘移动一半,T / 20。

另请参阅:谷歌“离散优化”多网格 ...和网格搜索

  ask by Scotty1- translate from so

未解决问题?本站智能推荐:

1回复

具有Scipy.Optimize.Minimize的矩阵约束

我正在尝试使用SLSQP算法将python的scipy.optimize最小化。 该优化似乎可以不受约束地工作并且具有一个矩阵约束,但是在添加第二个矩阵约束时出现错误。 这个版本有一个约束和界限,可以正常工作 但是,两个约束版本给我一个错误
1回复

具有线性约束的Scipy.optimize.minimizeSLSQP失败

考虑以下(凸)优化问题: 其中优化(矢量)变量是x和y , A , b分别是适当尺寸的矩阵和矢量。 下面的代码使用Scipy的SLSQP方法轻松找到解决方案: 请注意,约束函数是一个方便的“数组输出”函数。 现在,代替约束的数组输出函数,原则上可以使用一组等效的“标量输出”约束
1回复

scipy.optimize()值错​​误:求和的形状不匹配

嗨,我是scipy和numpy的新手, 我正在尝试使用解决QP问题进行类分配 其中H是2 X 2块矩阵,每个元素是ak X k维矩阵,x和f是2 X 1向量,每个元素是ak维向量。 即使我认为功能正确,也出现形状不匹配错误 这是我的实现: 我是否缺少明显的东西?
2回复

为什么scipy.optimize如此严重地依赖初始值?

我正在尝试使用scipy.optimize进行一些简单的优化问题,但是我发现只能找到起始值范围非常有限的解决方案。 这是一个最小的可复制示例: neg_likelihood函数的形状如下图所示,因此正确答案应该在0.65左右: 尝试不同的起始值,我发现只有在p起始值介于0.1和0.
1回复

scipy.optimize的最小化函数没有给出正确答案

我正在尝试使用 Scipy 的最小化功能解决最小化问题。 目标函数只是具有不同均值和方差的两个多元正态分布的比率。 我希望找到函数g_func的最大值,相当于找到函数g_optimization的最小值。 另外,我添加了 x[0] = 0 的约束。这里,x 是一个有 8 个元素的向量。 目标函数 g
3回复

如何在scipy.optimize函数上强制执行更大的步骤?

我有一个函数compare_images(k, a, b)比较两个二维数组a和b 在sigma=k内部,我将sigma=k的gaussian_filter应用到a我的想法是估计我必须平滑图像a的程度才能使其与图像b相似问题是我的函数compare_images只会在k变化超过0.5返回不同的值,如果
1回复

如何强制scipy.optimize的我的minimumsq函数优于每个数据点

我目前正在计算功能使用leastsq方法从以适应一些数据点scipy.optimize 。 我正在寻找的函数类似于f(x) = A * cos(b*x + c) ,其中A,b,c是我想知道的参数。 到目前为止,我的代码是: 此返回如所希望的: 这个工作很好,但是我希望用这些参数计
2回复

scipy.optimize解决方案使用python进行以下等式

我很擅长scipy并在python中进行数据分析。 我试图解决以下正则化优化问题,不幸的是我从scipy文档中无法理解。 我期待使用scipy.optimize解决以下约束优化问题 这是我希望最小化的功能: 这里A是m X n矩阵,最小化中的第一项是残差平方和,第二项是稀疏n X n