2

제가 다루고있는 문제 (표시된 예제는 매우 단순합니다)는 일반적인 문제인 것 같지만 아직 해결책을 찾지 못했습니다. 나는 다음과 같이 정의되는 세 가지 다른 반응, 즉 v1, v2 및 v3을 가진다 :Python : odeint를 사용하여 임계 값 모델 구현

v1 : R < -> A + C; v1 = k1 * (R-A * C/5000)

v2 : R< → B + C; v2 = k2 * (R-B * C/5000)

v3 : A + B → P; v3 = k3 * A * B

자원 R을 사용하면 첫 번째 두 반응은 각각 A와 C와 B와 C를 생성하는 반면 세 번째 반응은 A와 B를 생성물 P (k1, k2, k3는 상수, 여기서는 1로 설정 됨).

세 번째 반응은 C가 특정 임계 값 Cthr (여기서는 Cthr = 25)을 초과하는 경우에만 발생합니다. 그렇지 않으면 v3이 0입니다. 따라서 아이디어는 C가 누적되어 특정 농도에 도달하면, 제품의 생산에 결과 P.

나는 다음과 같은 것을 구현 : 그래서 분명히 한계가 위해에 도달 할 때까지 작동 http://i50.tinypic.com/apdvkj.png

:

def thresholdmodel (yn,tvec,allpara,R): 

    (A, B, C, P) = yn 

    k1, k2, k3 = allpara['kv']  

    Cthr = allpara['Cthresh'] 

    if C <= Cthr: 
     v3 = 0 
    else:  
     v3 = k3*A*B 
     C = 0 #does not(!) affect the ouput, why? 

    v1 = k1*(R - A*C/5000.) 
    v2 = k2*(R - B*C/5000.) 

    dA = v1 - v3 
    dB = v2 - v3 
    dC = v1 + v2 
    dP = v3 

    return (dA, dB, dC, dP) 

시뮬레이션의 출력은 다음과 같습니다 처음 (v3은 0, P는 생성되지 않음), 이후에 C는 0으로 설정되지 않고 이유를 모르겠습니다.
내가 원하는 것은 다음과 같습니다. C가 임계 값까지 생성되고, 0으로 떨어지고, 다시 생성되고, 0으로 떨어지는 등의 톱니파처럼 보입니다.
P의 시간 코스는 계단처럼 보일 것입니다 (Cthr를 초과 할 때만 생성됨).

누구나 내가 C를 다시 0으로 설정하고 예상되는 출력을 얻으려면 어떻게해야하는지 알고 있습니까? 고마워요!

답변

2

내가 당신에게 방정식을 이해하지 않지만, Codeint에서 상태를 변경하지 않습니다 값으로 C을 변경, thresholdmodel()에서 지역 변수입니다 0

C 때문에 떨어진다되지 않는 이유를 내가 말할 수있는 . odeint은 항상 dCthresholdmodel() (으)로 반환합니다. 그래서 C가 계속 증가 할 것입니다.

편집 : 당신이 임계 값을 변경해야하므로

C가 지속적으로 증가 할 때마다 C>와 같은 임계 값 : 귀하의 빠른 응답에 대한

lastC = 0 

def thresholdmodel (yn,tvec,allpara,R): 
    global lastC 
    (A, B, C, P) = yn 

    k1, k2, k3 = allpara['kv']  

    Cthr = allpara['Cthresh'] 

    if C <= lastC + Cthr: 
     v3 = 0 
    else:  
     v3 = k3*A*B 
     lastC = C 

    v1 = k1*(R - A*C/5000.) 
    v2 = k2*(R - B*C/5000.) 

    dA = v1 - v3 
    dB = v2 - v3 
    dC = v1 + v2 
    dP = v3 

    return (dA, dB, dC, dP) 
+0

좋아, 고마워요! 글쎄, 그게 내가 가지고있는 문제를 설명하기위한 장난감 예일 뿐이다. 정확히 당신이 이해하지 못하는 것은 무엇입니까? 적용되는 단순한 매스 작업 동역학이 있으며 특별한 것은 없습니다. 문제를 명확히 설명해 주셔서 감사합니다. 가능한 해결 방법을 알고 있습니까? – Cleb

+0

나는 무엇을 <-> 및 -> 의미 모르겠다. 그리고 C가 0에서 C = 0으로 코드에서 떨어질 수 있다면, v3는 거의 0이 될 것이고 C == 0 일 때 k3 * A * B 일 것입니다. – HYRY

+1

답장을 보내 주셔서 다시 한번 감사드립니다! '<->'은 반응이 되돌릴 수 있음을 의미합니다 (양방향). '->'는 되돌릴 수 없습니다 (한 방향 만). 음, 거의 : v3는 임계 값 (Cthr)보다 작은 모든 C에 대해 0입니다. 임계 값에 도달하면 v3는 k3 * A * B가되어 P를 생성 할 수 있습니다. 그 후에 C는 다시 0으로 설정되고, 따라서 v3은 0이되고, 다음에 임계 값에 도달 할 때까지 C가 다시 빌드됩니다. 그러나 C는 지역 변수 일 뿐이므로 전체 출력에서 ​​C를 0으로 설정하는 것은 어렵습니다. 이 문제를 해결하려면 어떤 제안이 필요합니까? – Cleb