首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小化多个参数,同时保持参数之间的相同比率。

最小化多个参数,同时保持参数之间的相同比率。
EN

Stack Overflow用户
提问于 2018-11-26 21:33:06
回答 3查看 88关注 0票数 1

我有一个特殊的功能,它计算发电厂寿命内的平均电费($/MWh)。

示例函数如下所示

代码语言:javascript
复制
def calc(a,b,c):
     res = 65*a+74*b+12*c
     return res

其中a bc是成本参数,如运营支出、建筑成本和保险。

我可以以无限多的方式改变a bc,但我希望保持与我所拥有的示例数据点相同的比率,从而降低平均电费。

例如,当a=1b=2c=3res = 249

但是,我想找出a bc when res=600的最优值,它保持相同的原始比率。

我试图找到一种使用scipy.optimize来实现这一目标的方法,但也遇到了一些困难。

我不知道如何在约束的比率中编程。

非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-26 23:51:17

我设法找到了一个解决方案,它帮助了我的特定用例,尽管有人指出,对于这个特定的例子,有一个更简单的解决方案。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 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倍。

下面是一个返回缩放参数值集的函数:

代码语言:javascript
复制
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使用浮点数,而不是使用截断整数来执行所有操作。

票数 1
EN

Stack Overflow用户

发布于 2018-11-26 22:31:05

this答案中,您可以指定如下约束:

代码语言:javascript
复制
cons = [{'type':'eq', 'fun': con1},
        {'type':'eq', 'fun': con2}]

并使用这样的最小化函数:

代码语言:javascript
复制
scipy.optimize.minimize(func, x0, constraints=cons)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53489400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档