我在考虑是否可以使用 GEKKO 来解决以下问题。请随时分享您的意见。先感谢您。
鉴于我想通过分段线性(PWL)段来近似一些非线性函数。例如,我想使用 N 个 PWL 段来近似高斯函数。是否可以利用 GEKKO 解决问题?你建议学习哪些可用的例子?
谢谢
我在考虑是否可以使用 GEKKO 来解决以下问题。请随时分享您的意见。先感谢您。
鉴于我想通过分段线性(PWL)段来近似一些非线性函数。例如,我想使用 N 个 PWL 段来近似高斯函数。是否可以利用 GEKKO 解决问题?你建议学习哪些可用的例子?
谢谢
如果你有不连续的函数,这些函数在切换条件下是线性或非线性的, Junho发送的链接很好。如果您有数据,那么Gekko中有一个 PWL 功能,您可以在没有二进制或 MPCC 切换条件的情况下使用它。下面是 Python 中的一个简单的 PWL 示例。除了我包含的数据点,您可以使用 PWL 段来近似高斯函数。
import matplotlib.pyplot as plt
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
m.options.SOLVER = 1
x = m.FV(value = 4.5)
y = m.Var()
xp = np.array([1, 2, 3, 3.5, 4, 5])
yp = np.array([1, 0, 2, 2.5, 2.8, 3])
m.pwl(x,y,xp,yp)
m.solve()
plt.plot(xp,yp,'rx-',label='PWL function')
plt.plot(x,y,'bo',label='Data')
plt.show()
如果有一个包含很多点的数据集,有时希望只用 PWL 段拟合几个点。这是另一个展示如何拟合 PWL 近似的示例。在这种情况下,您不能在 Gekko 中使用 PWL 对象。
from scipy import optimize
import matplotlib.pyplot as plt
from gekko import GEKKO
import numpy as np
m = GEKKO()
m.options.SOLVER = 3
m.options.IMODE = 2
xzd = np.linspace(1,5,100)
yzd = np.sin(xzd)
xz = m.Param(value=xzd)
yz = m.CV(value=yzd)
yz.FSTATUS = 1
xp_val = np.array([1, 2, 3, 3.5, 4, 5])
yp_val = np.array([1, 0, 2, 2.5, 2.8, 3])
xp = [m.FV(value=xp_val[i],lb=xp_val[0],ub=xp_val[-1]) for i in range(6)]
yp = [m.FV(value=yp_val[i]) for i in range(6)]
for i in range(6):
xp[i].STATUS = 0
yp[i].STATUS = 1
for i in range(5):
m.Equation(xp[i+1]>=xp[i]+0.05)
x = [m.Var(lb=xp[i],ub=xp[i+1]) for i in range(5)]
x[0].lower = -1e20
x[-1].upper = 1e20
# Variables
slk_u = [m.Var(value=1,lb=0) for i in range(4)]
slk_l = [m.Var(value=1,lb=0) for i in range(4)]
# Intermediates
slope = []
for i in range(5):
slope.append(m.Intermediate((yp[i+1]-yp[i]) / (xp[i+1]-xp[i])))
y = []
for i in range(5):
y.append(m.Intermediate((x[i]-xp[i])*slope[i]))
for i in range(4):
m.Obj(1000*(slk_u[i] + slk_l[i]))
m.Equation(xz == x[0] + slk_u[0])
for i in range(3):
m.Equation(xz == x[i+1] + slk_u[i+1] - slk_l[i])
m.Equation(xz == x[4] - slk_l[3])
m.Equation(yz == yp[0] + y[0] + y[1] + y[2] + y[3] + y[4])
m.solve()
#y_val = yz.value
#print(y_val)
import matplotlib.pyplot as plt
plt.plot(xp,yp,'rx-',label='PWL function')
plt.plot(xzd,yzd,'b.',label='Data')
plt.show()
请查看下面的链接,了解使用二元决策变量的 PWL 示例。