首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GEKKO中的MPC :错误码‘位置4’解

GEKKO中的MPC :错误码‘位置4’解
EN

Stack Overflow用户
提问于 2021-03-21 19:35:40
回答 1查看 116关注 0票数 2

问题更新

以前,我的模型中的控制变量m.P范围很广,这会导致求解器的故障。在约翰博士的建议下,我尝试了对数标度 of P的目标函数。当错误代码‘位置4’出现新错误时:

代码语言:javascript
复制
*** Error in syntax of function string: Missing opening parenthesis
 
Position: 4                   
 log_p-(log10(p))
    ?

下面是模型和求解器设置的一部分。在模型中,我有控制变量m.log_P,两个多变量m.u_1、m.u_2、其他变量P、Q、D_1和D_2都是状态变量,小写字母都是常量。

代码语言:javascript
复制
m.log_P = m.CV(value = np.log10(P_ini), name = 'log_P')  # log_P for scaling
m.log_P.STATUS = 1    # add log_P to objective function, instead of P
m.log_P.FSTATUS = 1
m.P= m.SV(value = P_ini , name = 'P')   # now original P is treated as a state variable

m.u_1 = m.MV(value=u_0, lb = 0, name = 'u_1')
m.u_2 = m.MV(value=u_0, lb = 0, name = 'u_2')
m.u_1.STATUS = 1
m.u_1.FSTATUS = 1
m.u_2.STATUS = 1
m.u_2.FSTATUS = 1

m.Equations([m.P.dt() == (a-mm-n) * m.P + b * m.Q - k_1 * m.D_1 * m.P - k_2 * m.D_2 * m.P,
             m.Q.dt() == mm*m.P - b*m.Q,
             m.D_1.dt() == m.u_1 - r_1 * m.D_1,
             m.D_2.dt() == m.u_2 - r_2 * m.D_2,
             m.log_P == m.log10(m.P)]) # first 4 equations defined by model. The last equation take logrithmic value of P.

m.options.IMODE = 6
m.options.SOLVER = 3
m.options.CV_TYPE = 2   # l2-norm
m.options.EV_TYPE = 2
m.solver_options = ['linear_solver mumps',\
                    'mu_strategy adaptive']

这里,我将二次误差项设为“”m.options.cv_TYPE=2#l2-范数‘“。

代码语言:javascript
复制
for i in range(len(t)-1):

    ts = [t[i],t[i+1]]
    y = odeint(chemo_model, x0, ts, args = (u_infu1[i],u_infu2[i])) # 'chemo_model' is a model function
    P_cell[i+1] = y[-1][0]
    Q_cell[i+1] = y[-1][1]
    D1_drug[i+1] = y[-1][2]
    D2_drug[i+1] = y[-1][3]

    ''' update '''
    m.log_P.MEAS = np.log10(P_cell[i+1])  # insert measurement
    m.log_P.SP = np.log10(P_sp[i+1]) # P_sp is predefined trajectory points
    
 
    ''' solve MPC '''
    m.solve(disp=True)

错误码‘位置5’的一个在线案例是由于该方程中缺少了"dt()“。看起来很相似但不是我的案子。有人能帮我吗?提前谢谢!!

EN

回答 1

Stack Overflow用户

发布于 2021-03-24 04:28:53

此错误通过不使用保留关键字来命名变量来解决。

代码语言:javascript
复制
name = 'log_P'

lg_P这样的变量名可以工作。以下是APMonitor中的保留关键字的列表

代码语言:javascript
复制
abs()   Absolute value  abs(x*y)=0
exp()   Exponentiation  exp(x*y)=0
log10() Base-10 Log log10(x*y)=0
log()   Natural Log log(x*y)=0
sqrt()  Square Root sqrt(x*y)=0
sinh()  Hyperbolic Sine sinh(x*y)=0
cosh()  Hyperbolic Cosine   cosh(x*y)=0
tanh()  Hyperbolic Tangent  tanh(x*y)=0
sin()   Sine    sin(x*y)=0
cos()   Cosine  cos(x*y)=0
tan()   Tangent tan(x*y)=0
asin()  Arc-sine    asin(x*y)=0
acos()  Arc-cos acos(x*y)=0
atan()  Arc-tangent atan(x*y)=0
erf()   Error function  erf(x*y)=0
erfc()  Complementary error function    erfc(x*y)=0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66736712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档