有关Pyomo提供的数学函数的问题

时间:2018-12-18 18:01:50

标签: python-3.x recursion optimization pyomo

我正在尝试使用具有递归关系的Pyomo解决最大化问题。我试图使电池的收益最大化,它涉及每小时更新电池的充电状态(这是此处的递归关系)。我正在使用以下代码:

import pyomo
import numpy as np
from pyomo.environ import *    
import pandas as pd

model = ConcreteModel()

N = 24 #number of hours
lmpdata = np.random.randint(1,10,24) #LMP Data (to be imported from MISO/PJM)
R = 0 #discount
eta_s = 0.99 #self-discharge efficiency
eta_c = 0.95 #round-trip efficiency
gammas_min = 0.1 #fraction of energy capacity to reserve for discharging
gammas_max = 0.05 #fraction of energy capacity to reserve for charging
S_bar = 50 #energy capacity
Q_bar = 50 #energy charge/discharge rating

model.qd = Var(range(N), within = NonNegativeReals) #variables for energy sold at time t
model.qr = Var(range(N), within = NonNegativeReals) #variables for energy purchased at time t

model.obj = Objective(expr = sum((model.qd[i]-model.qr[i])*lmpdata[i]*np.exp(-R*(i+1)) for i in range(N)), sense = maximize) #objective function

model.SOC = np.zeros(N) #state of charge (s(t) in Sandia's Model)
model.SOC[0] = 25 #SOC at hour 0

#recursion relation describing the SOC
def con_rule1(model,i):
    model.SOC[i] = eta_s*model.SOC[i-1] + eta_c*model.qr[i-1] - model.qd[i-1]
    return  (eta_s*model.SOC[i-1] + eta_c*model.qr[i-1] - model.qd[i-1]== model.SOC[i])

#def con_rule1(model,i):
model.con1 = Constraint(range(1,N), rule = con_rule1)
#model.con2 = Constraint(expr = eta_s*SOC[N-1] + eta_c*model.qr[N-1] - model.qd[N-1] == SOC[0]) #SOC relation for the last hour

#SOC boundaries
def con_rule2(model,i):
    return (gammas_min*S_bar <= eta_s*model.SOC[i] + eta_c*model.qr[i] - model.qd[i] <= (1-gammas_max)*S_bar)

model.con3 = Constraint(range(N), rule = con_rule2)


#limits the total energy charged over each time step to the energy
#charge limit (derived from the power limit)
#It restricts the throughput based on the power rating
def con_rule3(model,i):
    return (0 <= model.qr[i]+model.qd[i] <= Q_bar)

model.con4 = Constraint(range(N),rule = con_rule3)

def pyomo_postprocess(options=None, instance=None, results=None):
  model.qd.display()
  model.qr.display()


model.pprint()

但是,当我尝试运行代码时,出现以下错误:

Implicit conversion of Pyomo NumericValue type `<class 'pyomo.core.kernel.expr_coopr3._SumExpression'>' to a float is
disabled. This error is often the result of using Pyomo components as
arguments to one of the Python built-in math module functions when
defining expressions. Avoid this error by using Pyomo-provided math
functions.

我在其文档中找不到任何有关Pyomo数学函数的引用。如果有人可以帮助我解决这个问题,那就太好了!

1 个答案:

答案 0 :(得分:1)

Pyomo为 OpenBrowser("webapp/program.html?p=c"); // Remove local ticket Logout(AwaitableWebAccess.LogoutReason.NoData); // return to login activity Intent intent; intent = new Intent(this, typeof(LoginActivity)); StartActivity(intent); explog等操作定义了自己的数学模块函数集。如果要在Pyomo表达式中使用这些函数中的任何一个,则应确保它们是Pyomo提供的,而不是其他Python软件包提供的。我认为模型的问题在于您在Objective函数中使用了sin。导入np.exp时会自动导入Pyomo数学函数,因此您应该可以将pyomo.environ替换为np.exp以获得Pyomo定义的函数。