没错,对于很多问题我们深表歉意,但是我是Python的新手,我一直在努力。
我相信我终于创建了一个具有一定功能的代码。但是,我似乎无法正确定义目标函数。其余的似乎计算正确(基于目标给我的值)。这是我目前的目标功能:
def objective (x):
global sumIp, sumIm
if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
sumIp = sumIp + x[2]
sumIm = sumIm + 0
else:
sumIp = sumIp + 0
sumIm = sumIm - x[2]
return h*sumIp+b*sumIm
x [2]是我的It [i]。 sumIp和sumIm都应> = 0。
如果有人想看一下,这里是完整的代码:https://pastebin.com/AxC7fTVv-我相信这是我所想要的唯一缺少的部分,但是我不知道该怎么做为了我的生命,已经有好几天了!任何帮助表示赞赏。
答案 0 :(得分:1)
好的。我将总结您的问题(对您来说有点,但主要是为了帮助我:p)。
您有一个要计算的值序列,所有这些都围绕找出Qt[i]
。这些是:
d[i]
-在“真实世界”场景中从外部提供的一些值列表,但出于您的目的,这些值使用随机值进行仿真;最重要的是,这不是必须计算的。 (另一注:我假设我们不能“展望未来”并使用d[i+1]
或类似的东西。)It[i]
-由It[i] = It[i-1] - d[i] + Qt[i-LT]
给出(Qt
省略了i < LT
部分);这是根据前一周期值和d
值计算得出的,因此可以很容易地计算出 Ip[i]
,Im[i]
-都是直接从It[i]
计算得出的,因此,易于计算 NIt[i]
-由NIt[j] = NIt[j-1] - d[j] + Qt[j-1]
给出,可以很容易地计算,类似于It[i]
Qt[i]
-...?简而言之:唯一需要弄清楚的是Qt[i]
。因此,如果您决定使用scipy.minimize
之类的优化程序,则所需的 only 变量为x[0]
。但是,如果您只有一个变量,则可能甚至不需要使用优化器。您更有可能提出一些可以直接为您提供最佳结果的函数/表达式。
...还不太确定:\对不起
答案 1 :(得分:0)
注意-我正在根据问题说明中的链接第一粘贴框进行更改。
尝试一下:删除global
语句,使objective
函数看起来像
def objective (x):
# [`global` removed here]
if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
sumIp = sumIp + x[2]
sumIm = sumIm + 0
else:
sumIp = sumIp + 0
sumIm = sumIm - x[2]
return h*sumIp+b*sumIm
这样,sumIp
时的sumIm
和x[2]
值是在每个objective
调用中在本地创建的,而不是全局编辑。 (您可能想重命名局部变量,以免造成混淆。)
然后,在minimize
完成之后,将更改推送到最终的最佳x[2]
值,如下所示:
def test(T):
global i
while i < T:
# [...]
sol = minimize(objective, x0, constraints=cons)
if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
sumIp = sumIp + sol.x[2]
sumIm = sumIm + 0
else:
sumIp = sumIp + 0
sumIm = sumIm - sol.x[2]
# [...]
i += 1
return Qt, NIt, It
好的。 x[0] == Qt[i]
,不是 Qt[i-1]
,对吧?如果是这样,那么您将无法轻易地交换Qt[i-1]
和x[0]
。另外,当您删除x[0]
时,优化器会停止工作的事实也很有意义;尝试最小化表达式时,唯一允许更改的是x
值,然后将其删除,则最小化器的允许执行的内容将更少。
关于一般的“ strange [ness]”,可能与约束使用if
语句有关,这实际上使它们成为分段函数。虽然有一些对非线性约束有效的最小化方法,但我不确定是否有对不可微分约束有效的方法。
要解决此问题,请查看我在this paste中所做的更改。我用两个严格非负的变量x[2]
和x[2]
替换了x[3]
,其中旧值现在为x[2] - x[3]
。这样就无需在目标中使用if语句。为了使变量为非负值,我为x_bounds
问题添加了边界条件。 (请注意,这消除了对constraint1
函数的需要,因此我将其删除。代码中的其他简化操作还有更多空间,但是因为没有必要我将其他所有内容都保留下来。)
所以剩下的唯一我还不太了解的部分是constraint2
:您能再解释一下它应该做什么吗?