亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于 GEKKO 中的條件語句('m.if3')的問題

關于 GEKKO 中的條件語句('m.if3')的問題

墨色風雨 2022-03-09 21:03:34
我想在 GEKKO 代碼中添加一些條件語句。我用“m.if3”添加了以下語句。但是,它返回了沒有條件語句我沒有的語法錯誤。'R1_1 = m.if3(R1<0, 0, R1)'#%% GEKKOm = GEKKO(remote=False)#print(m.version)#m.time = np.linspace(0, 3600, 100)m.time = np.array([0,tstep])cH = m.CV(value=cs0[0])cM = m.CV(value=cs0[1])cW = m.CV(value=cs0[2])cF = m.CV(value=cs0[3])R1_1 = m.Var()r3 = m.Intermediate(r0*(1-cF/cFeMax)**(1/3))r2 = m.Intermediate(r0*((2*cH + 3*cM)/cFeMax)**(1/3))r1 = m.Intermediate(r0*(2*cH/cFeMax)**(1/3))x = m.Intermediate(r1/r0)y = m.Intermediate(r2/r0)z = m.Intermediate(r3/r0)A1 = m.Intermediate(1/x**2/(kd[0]*(1+1/Keq[0])))A2 = m.Intermediate(1/y**2/(kd[1]*(1+1/Keq[1])))A3 = m.Intermediate(1/z**2/(kd[2]*(1+1/Keq[2])))B1 = m.Intermediate((y-x)/x/y*r0/Dif[1])B2 = m.Intermediate((z-y)/y/z*r0/Dif[2])B3 = m.Intermediate((1-z)/z*r0/Dif[3])F = 0W = m.Intermediate((A1+B1)*(A3*(A2+B2+B3+F)+(A2+B2)*(B3+F))+A2*(A3*(B2+B3+F))+B2*(B3+F))ceq1 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[0]))ceq2 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[1]))ceq3 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[2]))R1 = m.Intermediate(3/r0/W*((A3*(A2+B2+B3+F)+(A2+B2)*(B3+F))*(cg0[0]-ceq1) \                     -(A3*(B2+B3+F)+B2*(B3+F))*(cg0[0]-ceq2) \                     -A2*(B3+F)*(cg0[0]-ceq3)))R2 = m.Intermediate(3/r0/W*(-(B2*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq1) \                     +((A1+B1+B2)*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq2) \                     -(A1+B1)*(B3+F)*(cg0[0]-ceq3)))R3 = m.Intermediate(3/r0/W*(-A2*(B3+F)*(cg0[0]-ceq1) \                    -(A1+B1)*(B3+F)*(cg0[0]-ceq2) \                    +((A1+B1)*(A2+B2+B3+F)+A2*(B2+B1+F))*(cg0[0]-ceq3)))R1_1 = m.if3(R1<0, 0, R1)m.Equation(cH.dt() == nus[0].dot([R1_1, R2, R3]))m.Equation(cM.dt() == nus[1].dot([R1_1, R2, R3]))m.Equation(cW.dt() == nus[2].dot([R1_1, R2, R3]))m.Equation(cF.dt() == nus[3].dot([R1_1, R2, R3]))m.options.IMODE = 4m.options.SOLVER = 3m.options.nodes = 2異常:@error:模型表達式 *** 函數字符串語法錯誤:括號不匹配位置:4(0)))-((((1-int_v5))*(i35)-slk_1 ?
查看完整描述

1 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

您只需進行一次更正(刪除<0)即可使用if3Gekko 中的功能。


R1_1 = m.if3(R1, 0, R1)

該m.if3函數使用一個條件,根據條件是小于零還是大于或等于零來切換使用的內容(參數 2 或 3)。這是幫助 (m.if3) 的結果以及一些額外的解釋:


if3(condition, x1, x2) method of gekko.gekko.GEKKO instance


IF conditional with a binary switch variable.

The traditional method for IF statements is not continuously

differentiable and can cause a gradient-based optimizer to fail

to converge.


Usage: y = m.if3(condition,x1,x2)

Inputs:

   condition: GEKKO variable, parameter, or expression

   x1 and x2: GEKKO variable, parameter, or expression

Output: GEKKO variable y = x1 when condition<0

                       y = x2 when condition>=0

要考慮的另一件事是該if3函數使用二進制變量,您需要使用混合整數求解器來找到整數解。您可以刪除將求解器切換到 IPOPT 的行(if3默認情況下切換到 APOPT 求解器),也可以手動將選項切換到 APOPT。


m.options.SOLVER = 1

您的腳本中缺少一些常量。我添加了一些虛擬變量只是為了讓它運行。


from gekko import GEKKO

import numpy as np


m = GEKKO()


help(m.if3)


tstep = 1.0

cs0=[1,1,1,1]

r0 = 1.0

cFeMax = 1.0

kd = [1,1,1]

Keq = [1,1,1]

Dif = [1,1,1,1]

cg0 = [1,1,1]

nus = np.array([[1,1,1],[1,1,1],[1,1,1],[1,1,1]])


m.time = np.array([0,tstep])


cH = m.CV(value=cs0[0])

cM = m.CV(value=cs0[1])

cW = m.CV(value=cs0[2])

cF = m.CV(value=cs0[3])


R1_1 = m.Var()


r3 = m.Intermediate(r0*(1-cF/cFeMax)**(1/3))

r2 = m.Intermediate(r0*((2*cH + 3*cM)/cFeMax)**(1/3))

r1 = m.Intermediate(r0*(2*cH/cFeMax)**(1/3))

x = m.Intermediate(r1/r0)

y = m.Intermediate(r2/r0)

z = m.Intermediate(r3/r0)

A1 = m.Intermediate(1/x**2/(kd[0]*(1+1/Keq[0])))

A2 = m.Intermediate(1/y**2/(kd[1]*(1+1/Keq[1])))

A3 = m.Intermediate(1/z**2/(kd[2]*(1+1/Keq[2])))

B1 = m.Intermediate((y-x)/x/y*r0/Dif[1])

B2 = m.Intermediate((z-y)/y/z*r0/Dif[2])

B3 = m.Intermediate((1-z)/z*r0/Dif[3])

F = 0

W = m.Intermediate((A1+B1)*(A3*(A2+B2+B3+F)+(A2+B2)*(B3+F))+A2*(A3*(B2+B3+F))+B2*(B3+F))

ceq1 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[0]))

ceq2 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[1]))

ceq3 = m.Intermediate((cg0[0]+cg0[1])/(1+Keq[2]))


R1 = m.Intermediate(3/r0/W*((A3*(A2+B2+B3+F)+(A2+B2)*(B3+F))*(cg0[0]-ceq1) \

                     -(A3*(B2+B3+F)+B2*(B3+F))*(cg0[0]-ceq2) \

                     -A2*(B3+F)*(cg0[0]-ceq3)))

R2 = m.Intermediate(3/r0/W*(-(B2*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq1) \

                     +((A1+B1+B2)*(A3+B3+F)+A3*(B3+F))*(cg0[0]-ceq2) \

                     -(A1+B1)*(B3+F)*(cg0[0]-ceq3)))

R3 = m.Intermediate(3/r0/W*(-A2*(B3+F)*(cg0[0]-ceq1) \

                    -(A1+B1)*(B3+F)*(cg0[0]-ceq2) \

                    +((A1+B1)*(A2+B2+B3+F)+A2*(B2+B1+F))*(cg0[0]-ceq3)))


R1_1 = m.if3(R1, 0, R1)


m.Equation(cH.dt() == nus[0].dot([R1_1, R2, R3]))

m.Equation(cM.dt() == nus[1].dot([R1_1, R2, R3]))

m.Equation(cW.dt() == nus[2].dot([R1_1, R2, R3]))

m.Equation(cF.dt() == nus[3].dot([R1_1, R2, R3]))


m.options.IMODE = 4

m.options.SOLVER = 1

m.options.nodes = 2


m.solve()


查看完整回答
反對 回復 2022-03-09
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號