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

2024-05-23 17:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个特殊的函数,它可以计算发电厂整个寿命期内的平均电力成本($/MWh)。你知道吗

示例函数如下所示

def calc(a,b,c):
     res = 65*a+74*b+12*c
     return res

其中abc是成本参数,如运营支出、建设成本和保险。你知道吗

我可以用无数种方法来改变abc,但我希望保持比率与我拥有的示例数据点相同,平均电力成本的结果更低。你知道吗

例如 当a=1b=2c=3res = 249时。你知道吗

但是,我想找出保持相同原始比率的最佳值,对于abcres=600

我试着想办法用科学优化,但有些困难。你知道吗

我不知道我将如何在约束的比率编程。你知道吗

非常感谢。你知道吗


Tags: 方法函数示例参数returnabdefcalc
3条回答

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

cons = [{'type':'eq', 'fun': con1},
        {'type':'eq', 'fun': con2}]

使用最小化函数如下:

scipy.optimize.minimize(func, x0, constraints=cons)

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

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))

约束保持相同的比率,并将“计算”的结果设置为等于600。你知道吗

假设有两组值,(a\u old,b\u old,c\u old)和(a\u new,b\u new,c\u new)。如果您希望它们各自的比率相同(例如_旧的:cïold是一样的_新:c\新,和c_旧的:b\U旧的与c相同_新:b泷U新,依此类推),这就等于说存在一个常数k,使得a_new=k*a_old,b_new=k*b_old,c_new=k*c_old。你知道吗

在您的示例中,65*a\u old+74*b\u old+12*c\u old=249。如果你把这个方程的两边都乘以k,你就得到了 65(k*a\u old)+74(k*b\u old)+12(k*c\u old)=249*k。这与“65(a\u new)+74(b\u new)+12(c\u new)=249k”相同。你知道吗

你希望249*k等于600。因此,k=600/249=约2.4096。然后可以将这个k值与a\u old、b\u old、c\u old一起使用,以查找a\u new、b\u new、c\u 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使用float,而不是使用截断的整数。你知道吗

相关问题 更多 >