繁体   English   中英

如何修复 Python Gekko 方程错误“m.solve(disp=False)”?

[英]How to fix Python Gekko equation error “m.solve(disp=False)”?

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

t_incubation = 5.1
t_infective = 3.3
R0= 2.4
N = 100000

e_initial=1/N
i_initial=0.00
r_initial=0.00
s_initial= 1- e_initial - i_initial - r_initial

alpha = 1/t_incubation
gamma = 1/t_infective
beta= R0*gamma

m = GEKKO()
u = m.MV(0,lb=0.0, ub=0.8)

s,e,i,r = m.Array(m.Var,4)
s.value= s_initial
e.value= e_initial
i.value=i_initial
r.value=r_initial
m.Equations([s.dt()== -(1-u)*beta * s * i,\
            e.dt()== (1-u)*beta * s * i - alpha * e,\
            i.dt== alpha * e - gamma * i,\
            r.dt()==gamma *i])
t= np.linspace(0,200,101)
t= np.insert(t,1,[0.001,0.002,0.004,0.008,0.02,0.04,0.08,\
                  0.2,0.4,0.8])
m.time=t
m.options.IMODE=7
m.options.NODES=3
m.solve(disp=False)

# plot the data
plt.figure(figsize=(8,5))

plt.subplot(3,1,1)
plt.plot(m.time, s.value, color='blue', lw=3, label='Susceptible')
plt.plot(m.time, r.value, color='red', lw=3, label='Recovered')


plt.subplot(3,1,2)
plt.plot(m.time, i.value, color='orange', lw=3, label='Infective')
plt.plot(m.time, e.value, color='purple', lw=3, label='Exposed')

#优化

m.options.IMODE=6
i.UPPER= 0.02
u.STATUS=1
m.options.SOLVER=3
m.options.TIME_SHIFT=0
s.value=s.value.value
e.value=e.value.value
i.value=i.value.value
r.value=r.value.value
m.Minimize(u)
m.solve(disp=True)

plt.subplot(3,1,1)
plt.plot(m.time, s.value, color='blue', lw=3, ls='--', label='Optimal susceptible')
plt.plot(m.time, r.value, color='red', lw=3, ls='--',label='optimal Recovered')


plt.subplot(3,1,2)
plt.plot(m.time, i.value, color='orange',ls='--', lw=3, label='Infective<2000')
plt.plot(m.time, e.value, color='purple',ls='--', lw=3, label='Optimal Exposed')
plt.ylim(0,0.2)
plt.ylabel('Fraction')
plt.legend()

plt.subplot(3,1,3)
plt.plot(m.time, u.value, 'k:',lw=3, label='Optimal (0=None, 1=No Interactions)')
plt.ylabel('Social Distancing')
plt.legend()

plt.xlabel('Time (days)')

plt.show()

我尝试运行代码但未能这样做并从系统中获得以下信息

 m.solve(disp=False) and raise Exception(response)
Exception:  @error: Model Expression
 *** Error in syntax of function string: Invalid element: <boundmethodgkvariable
 .dtof0.0>

方程中的 di/dt 项错过了parenthesis

i.dt()== alpha * e - gamma * I

您可以通过如下所示的错误消息大致了解代码的哪一部分引发了问题。

在此处输入图像描述

请参阅下面的更正代码。

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

t_incubation = 5.1
t_infective = 3.3
R0= 2.4
N = 100000

e_initial=1/N
i_initial=0.00
r_initial=0.00
s_initial= 1- e_initial - i_initial - r_initial

alpha = 1/t_incubation
gamma = 1/t_infective
beta= R0*gamma

m = GEKKO(remote=True)
u = m.MV(0,lb=0.0, ub=0.8)

s,e,i,r = m.Array(m.Var,4)
s.value= s_initial
e.value= e_initial
i.value=i_initial
r.value=r_initial
m.Equations([s.dt()== -(1-u)*beta * s * i,
            e.dt()== (1-u)*beta * s * i - alpha * e,
            i.dt()== alpha * e - gamma * i,
            r.dt()==gamma *i])
t= np.linspace(0,200,101)
t= np.insert(t,1,[0.001,0.002,0.004,0.008,0.02,0.04,0.08,\
                  0.2,0.4,0.8])
m.time=t
m.options.IMODE=4
m.options.NODES=3
m.solve(disp=True)

# plot the data
plt.figure(figsize=(8,5))

plt.subplot(3,1,1)
plt.plot(m.time, s.value, color='blue', lw=3, label='Susceptible')
plt.plot(m.time, r.value, color='red', lw=3, label='Recovered')


plt.subplot(3,1,2)
plt.plot(m.time, i.value, color='orange', lw=3, label='Infective')
plt.plot(m.time, e.value, color='purple', lw=3, label='Exposed')

plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM