1

我有一个目标函数,其中有四个要优化的参数(n1、n2、n3 和 n4)。这种优化应该在“for T in T”循环中完成,因为目标函数是 T 的函数。结果,我为每个 T 得到一组参数。如何构建和打印包含 T、n1、n2、n3 和 n4 的个性化列表?

我尝试了不同的“打印”方式,在循环内部和外部。我还在这里和 GEKKO 的文档中搜索了示例,但这对我来说仍然是一个挑战。提前致谢。

import math
import numpy as np
from gekko import GEKKO

T = np.arange(1, 10, 2)
for T in T:
    A = 3/(T**2)
    B = 20-T**2
    C = 3+T
    D = T

    mA = A-T*C
    mB = B-T*D

    # Minimization routine

    from gekko import GEKKO
    m = GEKKO()

    # Variables to be minimized:
    n1, n2, n3, n4 = [m.Var() for i in range(4)]
    var = [n1, n2, n3, n4]

    # Initial values:
    n0 = [3,2,3,3]
    nL = np.ones(len(n0))*10**-10
    nU = np.ones(len(n0))*10**10
    for i,x in enumerate(var):
        x.value = n0[i]
        x.lower = nL[i]
        x.upper = nU[i]

    nt = m.Intermediate(n1 + n2 + n3 + n4)

    # Objective:
    m.Obj(T*A*mA + B*mB + C*D/nt)
    # Set global options
    m.options.IMODE = 3

    # Solve minimization
    m.solve()

    print(n1, n2, n3, n4)
    print(str(n1.value), str(n2.value), str(n3.value), str(n4.value))
4

2 回答 2

1

有多种方法可以从 Python 导出数据,如此处所示。您需要将结果放入二维列表、NumPy 数组或 Pandas 数据框。如果您需要将值转换为 Excel 可以打开的表单(例如 CSV 文件),则以下是对原始脚本的修改。该脚本使用 NumPy 编写文件。

import math
import numpy as np
from gekko import GEKKO

T = np.arange(1, 10, 2)
z = [None]*len(T)
for j,T in enumerate(T):
    A = 3/(T**2)
    B = 20-T**2
    C = 3+T
    D = T

    mA = A-T*C
    mB = B-T*D

    # Minimization routine

    from gekko import GEKKO
    m = GEKKO()

    # Variables to be minimized:
    n1, n2, n3, n4 = [m.Var() for i in range(4)]
    var = [n1, n2, n3, n4]

    # Initial values:
    n0 = [3,2,3,3]
    nL = np.ones(len(n0))*10**-10
    nU = np.ones(len(n0))*10**10
    for i,x in enumerate(var):
        x.value = n0[i]
        x.lower = nL[i]
        x.upper = nU[i]

    nt = m.Intermediate(n1 + n2 + n3 + n4)

    # Objective:
    m.Obj(T*A*mA + B*mB + C*D/nt)
    # Set global options
    m.options.IMODE = 3

    # Solve minimization
    m.solve(disp=False)

    result = [T]
    for x in var:
        result.append(x.value[0])
    z[j] = result

zn = np.array(z)
np.savetxt('z.txt',zn,delimiter=',',comments='',header='T,n1,n2,n3,n4')

Excel 中的结果表

于 2019-08-12T12:14:26.000 回答
1

Gekko 是为时变系统构建的,因此结果以列表的形式返回。稳态优化只返回一个值,因此您需要访问value属性的第一个元素。尝试使用 访问单个结果n1.value[0]。该T值是一个 numpy 数组,因此您可以使用 T[0] 等访问这些值。在程序脚本的末尾尝试类似以下内容:

    # Solve minimization
    m.solve(disp=False)

    result = [T]
    for x in var:
        result.append(x.value[0])
    print(result)

它使用 的值创建一个初始列表,T然后附加其他值。我将选项设置disp=False为不显示求解器输出。修改后的脚本产生以下结果:

[1, 3457333826.4, 3457319622.4, 3457333826.4, 3457333826.4]
[3, 2482924773.0, 2482917643.6, 2482924773.0, 2482924773.0]
[5, 2201591127.3, 2201587887.6, 2201591127.3, 2201591127.3]
[7, 2105335286.6, 2105331976.7, 2105335286.6, 2105335286.6]
[9, 1630154729.7, 1630153615.7, 1630154729.7, 1630154729.7]

对于这个问题,似乎所有参数值都是相等的,并且它们与除了计算nt和目标项之外的其他方程没有联系C*D/nt

于 2019-08-09T15:42:36.107 回答