如何在 Python - GEKKO 中构建和打印循环生成的优化值列表?
How to build and print in Python - GEKKO a list of optimized values generated by loop?
我有一个 Objective 函数,其中有四个要优化的参数(n1、n2、n3 和 n4)。此优化应在循环 "for T in T" 中完成,因为 Objective 函数是 T 的函数。因此,我为每个 T 获得了一组参数。如何构建和打印包含 T、n1、n2、n3 和 n4 的个性化列表?
我已经尝试了 "print" 的不同方法,在循环内和循环外。我还在此处和 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))
Gekko 是为时变系统构建的,因此结果以列表形式返回。稳态优化只有 returns 个值,因此您需要访问 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
和 objective 项 C*D/nt
.
export data from Python as shown here有多种方法。您需要将结果放入二维列表、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')
我有一个 Objective 函数,其中有四个要优化的参数(n1、n2、n3 和 n4)。此优化应在循环 "for T in T" 中完成,因为 Objective 函数是 T 的函数。因此,我为每个 T 获得了一组参数。如何构建和打印包含 T、n1、n2、n3 和 n4 的个性化列表?
我已经尝试了 "print" 的不同方法,在循环内和循环外。我还在此处和 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))
Gekko 是为时变系统构建的,因此结果以列表形式返回。稳态优化只有 returns 个值,因此您需要访问 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
和 objective 项 C*D/nt
.
export data from Python as shown here有多种方法。您需要将结果放入二维列表、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')