gpt4 book ai didi

python - 如何修复 Python GEKKO 最优控制代码中的 "Solution Not Found"错误

转载 作者:行者123 更新时间:2023-12-04 17:35:17 25 4
gpt4 key购买 nike

我试图重现 K. Renee Fister 和 Jennifer Hughes Donnelly 于 2005 年发表的论文“免疫疗法:最佳控制理论方法”的图 1 中的结果。为此,我使用 Python 的 GEKKO 编写了一个数值最优控制求解器包裹。我使用了与论文中相同的初始条件、控制界限、参数值和模型方程。但是,当我运行代码时,出现以下错误:

Traceback (most recent call last):
File "xxxxxx", line 45, in <module>
m.solve(disp=False) #solve
File "xxxx", line 783, in solve
raise Exception(response)
Exception: @error: Solution Not Found

我希望程序的输出提供两个数字:一个 ODE 动力学和一个最优控制解的图。

我曾尝试通过多种方式更改代码:修改目标函数、时间步数和更改最佳控制模式,但是每次都遇到相同的错误。下面是我正在使用的代码:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO()
nt = 1010
m.time = np.linspace(0,350,nt)

# Variables
X = m.Var(value=1)
Y = m.Var(value=1)
Z = m.Var(value=1)
OF = m.Var(value=0)
v = m.Var(value=0,lb=0,ub=1) #Control is initially 0 with a lower bound of 0 and an upper bound of 1

p = np.zeros(nt) #mark final time point
p[-1] = 1.0 #all zeros except the end, which is 1
final = m.Param(value=p) #final depends on integration limits

#Parameter Values
c = .000085
mu2 = .03
p1 = .1245
a = 1
r2 = .18
mu3 = 10
p2 = 5
g1 = 20000000 #2e7
g2 = 100000 #1e5
g3 = 1000 #1e3
b = 1*10**(-9)
s2 = 100000000
B = 100000000

# Equations
m.Equation(X.dt() == c*Y-mu2*X+(p1*X*Z)/(g1+Z))
m.Equation(Y.dt() == r2*Y*(1-b*Y)-(a*X*Y)/(g2+Y))
m.Equation(Z.dt() == (p2*X*Y)/(g3+Y)-mu3*Z+v*s2)
m.Equation(OF.dt() == X-Y+Z-B*v)

m.Obj(-OF*final)

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

plt.figure(figsize=(4,3)) #plot results
plt.subplot(2,1,1)
plt.plot(m.time,X.value,'k-',label=r'$S$')
plt.plot(m.time,Y.value,'b-',label=r'$R$')
plt.plot(m.time,Z.value,'g-',label=r'$E$')
plt.plot(m.time,OF.value,'r-',label=r'$OF$')
plt.legend()
plt.ylabel('CV')
plt.subplot(2,1,2)
plt.plot(m.time,v.value,'g--',label=r'$v$')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

此代码是通过修改 this Youtube video 中提供的示例 GEKKO 代码派生而来的。 .任何帮助解决此问题将不胜感激!

最佳答案

当求解器无法找到解决方案并报告“未找到解决方案”时,有一种故障排除方法可以诊断问题。首先要做的是查看求解器输出 m.solve(disp=True) .求解器可能已经确定了一个不可行的问题,或者它在没有收敛到解决方案的情况下达到了最大迭代次数。
不可行问题
如果求解器因为方程不可行而失败,那么它发现变量和方程的组合是不可解的。您可以尝试放宽变量边界或使用 infeasibilities.txt 确定哪个方程不可行运行目录下的文件。检索 infeasibilities.txt您可以使用 m.open_folder() 查看的本地运行目录中的文件当m=GEKKO(remote=False) .
最大迭代限制
如果求解器达到默认迭代限制 ( m.options.MAX_ITER=250 ),那么您可以尝试增加此限制或尝试以下策略。

  • 通过设置 m.options.SOLVER=1 尝试不同的求解器APOT,m.options.SOLVER=2 BPOPT, m.options.SOLVER=3为IPOPT,或m.options.SOLVER=0尝试所有可用的求解器。
  • 首先通过求解变量数等于方程数的平方问题找到可行的解决方案。 Gekko 有几个选项可以帮助解决这个问题,包括 m.options.COLDSTART=1 (为所有 FV 和 MV 设置 STATUS=0)或 m.options.COLDSTART=2 (设置 STATUS=0 并执行块对角三角分解以找到可能的不可行方程)。
  • 找到可行的解决方案后,尝试将此解决方案作为初始猜测进行优化。

  • 我将使用 Luus example optimal control problem您在 YouTube 视频中引用的以演示此策略。这个问题在没有任何这些策略的情况下成功解决,但我将修改它以展示如何使用这些方法。
    Luus Optimal Control
    import numpy as np
    import matplotlib.pyplot as plt
    from gekko import GEKKO
    m = GEKKO(remote=False)
    nt = 101; m.time = np.linspace(0,2,nt)
    x = m.Var(value=1)
    u = m.MV(value=0,lb=-1,ub=1); u.STATUS=1
    p = np.zeros(nt); p[-1] = 1.0; final = m.Param(value=p)
    m.Equation(x.dt()==u)
    m.Minimize(m.integral(0.5*x**2)*final)
    m.options.IMODE = 6; m.solve()

    plt.figure(1)
    plt.plot(m.time,x.value,'k-',lw=2,label='x')
    plt.plot(m.time,u.value,'r--',lw=2,label='u')
    plt.legend(); plt.xlabel('Time'); plt.ylabel('Value')
    plt.show()
    Luus Optimal Control
    假设求解器不成功。您可以通过替换 m.solve() 来初始化具有以下内容:
    # initialize to get a feasible solution
    m.options.COLDSTART=2
    m.solve()

    # optimize, preserving the initial conditions (TIME_SHIFT=0)
    m.options.TIME_SHIFT=0
    m.options.COLDSTART=0
    m.solve()
    文章中也更详细地描述了初始化策略:
  • Safdarnejad, S.M.、Hedengren, J.D.、Lewis, N.R.、Haseltine, E.,动态系统优化的初始化策略,计算机和化学工程,2015 年,卷。 78,第 39-50 页,DOI:10.1016/j.compchemeng.2015.04.016。 article link
  • 关于python - 如何修复 Python GEKKO 最优控制代码中的 "Solution Not Found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56942615/

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