ถ้าใครได้ใช้ deSolve สำหรับแก้ปัญหาเชิงตัวเลขของระบบสมการเชิงอนุพันธ์(ode) แล้วจะเห็นว่ามันมีข้อจำกัดเรื่องความเร็วอยู่ เพราะถ้าเขียน function ของสมการด้วย R แล้วจะช้ามาก ยิ่งถ้ามีการเอาfunction ไปใช้ fitting ด้วยเทคนิคอย่าง Markov chain monte carlo แล้วนี่เลิกคิดได้เลยสำหรับระบบใหญ่ ๆ
deSolve เองก็พยายามแก้ปัญหานี้ โดยผู้ใช้สามารถเรียกใช้ function ที่เขียนใน C/C++ ที่คอมไพล์แล้วมาใช้ได้ แต่ก็ยังดูยากพอสมควรสำหรับคนที่ไม่เคยเขียน C/C++ เลย แต่มันก็ยังพอมีวิธีที่ดีกว่าหน่อยที่อยากจะแนะนำสำหรับคนที่อยากจะเพิ่มความเร็วสำหรับใช้กับ deSolve นั่นก็คือเขียน ในภาษาของ rstan แทนครับ
โดยหลักการก็คือเขียนสมการใน rstan แล้วใช้คำสั่งของ rstan ที่เรียกว่า expose_stan_functions เพื่อที่จะคอมไพล์ function แล้วเราก็จะยังเรียกใช้ได้ใน .GlobalEnv นั่นหมายความว่าเราสามารถเรียกใช้ function ที่คอมไพล์แล้วนี้กับ deSolve ได้ครับ
ตัวอย่างเช่น ผมเขียนสมการ lorenz ในไฟล์ชื่อ lorenz.stan
##lorenz.stan functions{ vector lorenz(real t,vector y,vector parms){ vector[3] ydot; // parms[1]=beta ,[2]=sigma,[3]=rho ydot[1]=parms[2]*(y[2]-y[1]); ydot[2]=y[1]*(parms[3]-y[3])-y[2]; ydot[3]=y[1]*y[2]-parms[1]*y[3]; return ydot; } } model{ }
จากนั้นก็ใช้ expose_stan_functions เรียกจากใน R ได้เลยตามนี้ครับ
library(rstan) expose_stan_functions("lorenz.stan") # parms[1]=beta ,[2]=sigma,[3]=rho parameters1<-c(2.66666,10,28) # x=-10, y=-12, z=30.05 init.state<-c(-10,-12,30.05) nderivs<-function(t,state,parameters){ tmp<-lorenz(t,state,parameters) return(list(tmp)) } run1<-ode(y=init.state,times=seq(0,15,0.01), func=nderivs, parms=parameters1) plot(run1)