如何在Python-GEKKO中构建和打印由循环生成的优化值列表?

如何在Python-GEKKO中构建和打印由循环生成的优化值列表?,python,python-3.x,gekko,Python,Python 3.x,Gekko,我有一个目标函数,需要优化四个参数(n1、n2、n3和n4)。这个优化应该在一个循环中完成,因为目标函数是T的函数。因此,我得到了每个T的一组参数。如何构建和打印包含T、n1、n2、n3和n4的个性化列表 我尝试了不同的“打印”方式,在循环内部和外部。我也在这里和GEKKO的文档中搜索了一些例子,但这对我来说仍然是一个挑战。提前谢谢 导入数学 将numpy作为np导入 从gekko进口gekko T=np.arange(1,10,2) 对于T中的T: A=3/(T**2) B=20-T**2 C

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

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

导入数学
将numpy作为np导入
从gekko进口gekko
T=np.arange(1,10,2)
对于T中的T:
A=3/(T**2)
B=20-T**2
C=3+T
D=T
mA=A-T*C
mB=B-T*D
#最小化程序
从gekko进口gekko
m=GEKKO()
#要最小化的变量:
n1,n2,n3,n4=[m.Var()表示范围(4)中的i]
var=[n1,n2,n3,n4]
#初始值:
n0=[3,2,3,3]
nL=np.ones(len(n0))*10**-10
nU=np.one(len(n0))*10**10
对于枚举(var)中的i,x:
x、 值=n0[i]
x、 下限=nL[i]
x、 上=nU[i]
nt=中间产物(n1+n2+n3+n4)
#目标:
m、 Obj(T*A*mA+B*mB+C*D/nt)
#设置全局选项
m、 options.IMODE=3
#求解极小化
m、 解决()
打印(n1、n2、n3、n4)
打印(str(n1.值)、str(n2.值)、str(n3.值)、str(n4.值))

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

#求解最小化
m、 求解(disp=False)
结果=[T]
对于var中的x:
result.append(x.value[0])
打印(结果)
它创建一个初始列表,值为
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
,之外,它们与其他方程没有联系。您需要将结果放入二维列表、NumPy数组或数据帧中。如果需要将值放入Excel可以打开的表单(如CSV文件),则以下是对原始脚本的修改。此脚本使用NumPy编写文件

导入数学
将numpy作为np导入
从gekko进口gekko
T=np.arange(1,10,2)
z=[无]*len(T)
对于枚举中的j,T(T):
A=3/(T**2)
B=20-T**2
C=3+T
D=T
mA=A-T*C
mB=B-T*D
#最小化程序
从gekko进口gekko
m=GEKKO()
#要最小化的变量:
n1,n2,n3,n4=[m.Var()表示范围(4)中的i]
var=[n1,n2,n3,n4]
#初始值:
n0=[3,2,3,3]
nL=np.ones(len(n0))*10**-10
nU=np.one(len(n0))*10**10
对于枚举(var)中的i,x:
x、 值=n0[i]
x、 下限=nL[i]
x、 上=nU[i]
nt=中间产物(n1+n2+n3+n4)
#目标:
m、 Obj(T*A*mA+B*mB+C*D/nt)
#设置全局选项
m、 options.IMODE=3
#求解极小化
m、 求解(disp=False)
结果=[T]
对于var中的x:
result.append(x.value[0])
z[j]=结果
zn=np.数组(z)
np.savetxt('z.txt',zn,分隔符=',',注释='',标题='T,n1,n2,n3,n4')

亲爱的约翰,非常感谢你的帮助。我仍然很难解决这个问题,因为我真正需要的是,在循环之外,能够获得n1阵列,n2阵列。一旦我得到这些数组,我会将其导出到excel,但我已经学会了如何做。问题是真正能够获取数组n1(T)、n2(T)…另一种可能的解决方案是使用位于运行目录(
m.\u路径
m.打开\u文件夹()
)中的结果文件
results.csv
)。这是一个包含所有结果的CSV文件。我将在这里发布另一个解决方案,使用CSV文件将值放入Excel的表格中。