gpt4 book ai didi

python - 使用 m.CV 与 m.Var

转载 作者:行者123 更新时间:2023-12-01 23:12:28 24 4
gpt4 key购买 nike

我正在使用 gekko python 优化管状柱设计。我使用不同的变量类型 m.SVm.CV 代替 m.Var 尝试了代码,但没有明显效果关于求解器或结果。这些不同的变量类型有何用途?

我在下面包含了我的模型。


m = GEKKO()

#%% Constants
pi = m.Const(3.14159,'pi')
P = 2300 # compressive load (kg_f)
o_y = 450 # yield stress (kg_f/cm^2)
E = 0.65e6 # elasticity (kg_f/cm^2)
p = 0.0020 # weight density (kg_f/cm^3)
l = 300 # length of the column (cm)

#%% Variables
d = m.CV(value=8.0,lb=2.0,ub=14.0) # mean diameter (cm)
t = m.SV(value=0.3,lb=0.2,ub=0.8) # thickness (cm)
cost = m.Var()

#%% Intermediates
d_i = m.Intermediate(d - t)
d_o = m.Intermediate(d + t)
W = m.Intermediate(p*l*pi*(d_o**2 - d_i**2)/4) # weight (kgf)
o_i = m.Intermediate(P/(pi*d*t)) # induced stress

# second moment of area of the cross section of the column
I = m.Intermediate((pi/64)*(d_o**4 - d_i**4))

# buckling stress (Euler buckling load/cross-sectional area)
o_b = m.Intermediate((pi**2*E*I/l**2)*(1/(pi*d*t)))

#%% Equations
m.Equations([
o_i - o_y <= 0,
o_i - o_b <= 0,
cost == 5*W + 2*d
])

#%% Objective
m.Obj(cost)

#%% Solve and print solution
m.options.SOLVER = 1
m.solve()

print('Optimal cost: ' + str(cost[0]))
print('Optimal mean diameter: ' + str(d[0]))
print('Optimal thickness: ' + str(t[0]))

最佳答案

变量

变量是由求解器调整以满足方程或确定多个选项中的最佳结果的值。每个方程通常至少有一个变量。为了避免过度指定,模拟通常具有相同数量的方程和变量。对于优化问题,变量通常多于方程。更改额外变量以最小化或最大化目标函数。有关这些对象的更多信息,请参阅 Gekko documentationAPMonitor documentation

x = m.Var(5)  # declare a variable with initial condition

还有执行某些功能的“特殊”类型的变量。例如,将附加方程添加到具有数据协调测量的变量的模型中。为了避免为所有变量添加这些额外的方程,仅为指定为受控变量 (CV) 的变量添加测量方程。状态变量(SV)也可以被测量,通常被指定为仅用于监控目的。

状态变量 (SV)

状态是可以测量或特别值得观察的模型变量。对于时变模拟,SV 在时间范围内变化以满足方程的可行性。

x = m.SV()  # state variable

受控变量 (CV)

受控变量是包含在 Controller 或优化器目标中的模型变量。这些变量被控制在一个范围内,最大化或最小化。受控变量也可以是被包括用于数据协调的测量值。对于时变模拟,CV 在时间范围内变化以满足方程并最小化目标函数。

x = m.CV()  # controlled variable

示例应用程序

documentation for options for the different variable and parameter types (FV, MV, SV, CV) 。下面是一个模型预测控制应用程序,显示了操纵变量和受控变量的使用。

MPC Example

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO()
m.time = np.linspace(0,20,41)

# Parameters
mass = 500
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated variable
p = m.MV(value=0, lb=0, ub=100)
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth out gas pedal movement
p.DMAX = 20 # slow down change of gas pedal

# Controlled Variable
v = m.CV(value=0)
v.STATUS = 1 # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
v.SP = 40 # set point
v.TR_INIT = 1 # set point trajectory
v.TAU = 5 # time constant of trajectory

# Process model
m.Equation(mass*v.dt() == -v*b + K*b*p)

m.options.IMODE = 6 # control
m.solve(disp=False)

# get additional solution information
import json
with open(m.path+'//results.json') as f:
results = json.load(f)

plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,results['v1.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()

关于python - 使用 m.CV 与 m.Var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58982481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com