2017-03-12 6 views
2

R에서 상미 분 방정식을 풀려고합니다. 이미 정의한 초기 값과 매개 변수로 행렬이 있습니다. 그러나 그것을 해결하려고하면 행렬 대신에 단일 값을 입력 할 때 나타나지 않는 아래의 오류가 발생합니다. (베타) %의 *의 %의 S에R : 행렬을 입력으로 사용하여 deSolve 패키지로 ODE를 해결합니다.

오류 : 필요 숫자/복잡한 행렬/벡터 인수

송시를 해결하기위한 내 코드는 내가 왜 이해가 안

S = matrix(c("S1","S2"), nrow = 2, ncol=1) 
I = matrix(c("I1","I2"), nrow = 2, ncol=1) 
R = matrix(c("R1","R2"), nrow = 2, ncol=1) 

beta=matrix(c("beta1", "beta2"), nrow = 2, ncol=1) 

MODEL <- function(time, state, parameters) { 
      with(as.list(c(state, parameters)), { 
      dS <- -1*(beta) %*% S %*% I 
      dI <- beta %*% S %*% I - gamma %*% I 
      dR <- gamma %*% I 
      return(list(c(dS, dI, dR))) 
      }) 
     } 

init  <-c(S1=1-1e-6, S2=1-1e-6, I1=1e-6, I2=1e-6, R1=0.0, R2=0.0) 
parameters <- c(beta1=1.4247, beta2=1.4247, gamma=0.14286) 
times  <- seq(0, 70, by = 1) 

out <- ode(y=init, times=times, func=MODEL, parms=parameters) 

이하 오류 메시지가 나타나고 행렬을 사용할 때 다르게 처리해야하는지 여부가 표시됩니다.

도움을 주시면 감사하겠습니다. 감사!!!

+1

당신이 당신의 그라데이션 기능을 내부에 행렬을 "재 포장"해야 할 것입니다. 'relist()'함수가 유용 할 수 있습니다. –

답변

2

코드의 행렬 크기에 일부 불일치가 있습니다. (매개 변수 값이 반복 수렴하는 방법도 보여줍니다) 다음 작업을해야합니다 :

MODEL <- function(time, state, parameters) { 
    with(as.list(c(state, parameters)), { 
    S = matrix(state[1:2], nrow = 2, ncol=1) 
    I = matrix(state[3:4], nrow = 2, ncol=1) 
    R = matrix(state[5:6], nrow = 2, ncol=1) 
    beta = matrix(c(beta1, beta2), nrow = 2, ncol=1) 
    dS <- -1*(beta) %*% t(S) %*% I 
    dI <- beta %*% t(S) %*% I - gamma * I 
    dR <- gamma * I 
    return(list(c(dS, dI, dR))) 
    }) 
} 

init  <- c(S1=1-1e-6, S2=1-1e-6, I1=1e-6, I2=1e-6, R1=0.0, R2=0.0) 
parameters <- c(beta1=1.4247, beta2=1.4247, gamma=0.14286) 
times  <- seq(0, 70, by = 1) 

out <- ode(y=init, times=times, func=MODEL, parms=parameters) 

library(ggplot2) 
library(reshape2) 
ggplot(melt(as.data.frame(as.matrix(out)), id='time'), aes(time, value, col=variable)) + 
     geom_point() + geom_line() + facet_wrap(~variable) 

enter image description here

+1

@ Sandipan Dey 솔루션에 대해 감사드립니다. 또한 상태에 의해 행렬이 함수에 어떻게 참조되는지 설명해 주시겠습니까? 초기화 조건 만 언급해야합니까? 예를 들어, 'S = 행렬 (c ("S1", "S2", "S3"), nrow = 3, ncol = 1)'S = 행렬 (상태 [1 : 3] , nrow = 3, ncol = 1) 함수에서 ?? – Jessie

+1

아니요. 세 개의 개별 매개 변수 S1, S2, S3의 값과 접촉하는'state' 매개 변수를 전달하기 때문에 함수가 개별적으로 알지 못하기 때문입니다. 또한 'S1'은 변수 S1이 아니라 문자열을 의미합니다. –

+0

알았어. 고마워요 !!! – Jessie