我有一个特殊的功能,它计算发电厂寿命内的平均电费($/MWh)。
示例函数如下所示
def calc(a,b,c):
res = 65*a+74*b+12*c
return res其中a b和c是成本参数,如运营支出、建筑成本和保险。
我可以以无限多的方式改变a b和c,但我希望保持与我所拥有的示例数据点相同的比率,从而降低平均电费。
例如,当a=1,b=2和c=3,res = 249。
但是,我想找出a b和c when res=600的最优值,它保持相同的原始比率。
我试图找到一种使用scipy.optimize来实现这一目标的方法,但也遇到了一些困难。
我不知道如何在约束的比率中编程。
非常感谢。
发布于 2018-11-26 23:51:17
我设法找到了一个解决方案,它帮助了我的特定用例,尽管有人指出,对于这个特定的例子,有一个更简单的解决方案。
from scipy.optimize import minimize
import numpy as np
a = 1
b = 2
c = 3
def calc(x):
res = 65*x[0]+74*x[1]+12*x[2]
return res
cons = [{'type': 'eq', 'fun': lambda x: x[0]/x[1]-a/b},
{'type': 'eq', 'fun': lambda x: x[1]/x[2]-b/c},
{'type': 'eq', 'fun': lambda x: calc(x)-600}]
start_pos = np.ones(3)*(1/6.)
print(minimize(calc, x0=start_pos, constraints=cons))约束保持相同的比率,并将calc的结果设置为等于600。
发布于 2018-11-26 22:09:59
假设您有两组值(a_old、b_old、c_old)和(a_new、b_new、c_new)。如果您希望它们各自的比率相同(例如,a_old:c_old与a_new:c_new相同,c_old:b_old与c_new:b_new相同,等等),那就等于说存在一些常数k,例如a_new = k*a_old、b_new = k*b_old和c_new = k*c_old。
在您的示例中,65*a_old + 74*b_old + 12*c_old = 249。如果将方程的两边乘以k,得到65(k*a_old) + 74(k*b_old) + 12(k*c_old) = 249*k,等于'65(a_new) + 74(b_new) + 12(c_new) =249 k‘。
你想要249*k等于600。因此,k= 600/249 =约2.4096。然后,您可以使用这个k值以及a_old、b_old、c_old来查找a_new、b_new、c_new的值。记住,新值只是旧值的k倍。
下面是一个返回缩放参数值集的函数:
def optimize(a,b,c, opt_res):
res = 65 * a + 74 * b + 12 * c
k = opt_res/res
new_vals = [parameter * k for parameter in [a,b,c]]
return new_vals
print(optimize(1,2,3,600.0))
## output: [2.4096385542168677, 4.819277108433735, 7.2289156626506035]注:我使用的是"600.0",而不是"600“。这迫使Python使用浮点数,而不是使用截断整数来执行所有操作。
发布于 2018-11-26 22:31:05
从this答案中,您可以指定如下约束:
cons = [{'type':'eq', 'fun': con1},
{'type':'eq', 'fun': con2}]并使用这样的最小化函数:
scipy.optimize.minimize(func, x0, constraints=cons)https://stackoverflow.com/questions/53489400
复制相似问题