繁体   English   中英

scipy.optimize具有多个范围,约束和连续字段

scipy.optimize with multiple bounds, constraints and continuous fields

提示:本站收集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中的任何值
    这意味着总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 个回复

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。

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

1 具有矩阵约束的scipy.optimize问题

我有一个优化问题,如下所示:最小化:总和'(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 ...

2 scipy.optimize 紧凑约束

我有一个长度为 9 的 np.array A,它是目标函数中的变量。 有没有简单的方法来编写约束? 目前我有以下代码,但随着数组大小变大,很难全部写出来。 ...

3 scipy.optimize问题使用矩阵作为输入,范围,约束

我过去曾经使用Python进行优化; 但是,我现在尝试使用矩阵作为目标函数的输入,并设置单个元素值的界限以及矩阵中每一行的值之和,因此遇到了问题。 具体来说,我想向目标函数ObjFunc三个参数w , p , ret ,然后最小化此函数的值(从技术上讲,我试图通过最小化-1*ObjFun ...

5 Scipy.optimize:如何正确编写约束?

我想使用scipy.optimize.minimize求解(2 + x_1)/(1 + x_2)-3x_1 + 4x_3的最小值,其中x_1,x_2和x_3的约束范围在0.1到0.9之间。 我的代码如下: 运行它,并报告一个TypeError: 我不知道为什么未注释的cons和注释的cons ...

6 对scipy.optimize函数使用约束向量

我想使用scipy.optimize库使用约束向量来进行约束优化。 特别是,我提供了N个点的3d坐标r0的矢量-因此,矩阵的大小为N x 3作为函数的输入。 坐标是笛卡尔坐标,我希望冻结所有y依赖。 因此,这意味着我需要将我的N x 3矩阵的第二列保持为常数y0 。 如何定义这样的约束列 ...

7 与scipy.optimize的问题

我是新手,我需要你的帮助!! 我在我的Ubuntu上安装了scipy。 当我从scipy import optimize运行代码时,特殊 我在终端中得到以下内容:无法读取/var/mail/scipy.optimize 如果我键入python,并获取&gt;&gt;&gt ...

8 使用scipy.optimize为优化模型设置不连续边界

我有一个运行良好的优化程序,但是还需要实现一些其他边界条件。 目前,边界看起来像这样: 优化应该能够在这些点之间取任何值,但是0也是应该取的值! 我可以引入某种if / or约束来解决此问题吗? 谢谢! ...

9 scipy.optimize最小化约束问题

我已经搜索了一下,但无法解决这个问题。 我正在使用scipy.optimize中的最小化函数,并不断收到错误: 'str'对象不可调用。 我的代码很复杂,所以我在网上查找了一个简单的示例,以确保我正确输入所有内容,但仍然遇到了同样的错误。 这是我在youtube上找到的简单 ...

10 scipy.optimize 约束方法中的边界数组形状问题

跟进我之前的问题,现在我在受约束的 bfgs 方法中遇到了边界数组的形状问题。 我的代码如下: 正如你所看到的,我从一个 (3,1,5) 形状的列表列表开始,这是我在myfunc()工作的首选格式,因为它很容易用嵌套的 for 循环解析。然后这个列表被压缩转换成 (15,) 形状的 numpy ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM