# ติดตั้งแพ็กเกจ (ถ้ายังไม่มี)
install.packages("phaseR")
8 ระบบสมการเชิงอนุพันธ์สำหรับนักเศรษฐศาสตร์
ในบทนี้เป็นการศึกษาระบบสมการเชิงอนุพันธ์ จะเป็นการคำนวณเชิงตัวเลข และการคำนวณเชิงสัญลักษณ์ ผู้อ่านจะศึกษาทำความเข้าใจ การสร้างฟังก์ชันด้วยอาร์ก่อน ก็จะศึกษาบทนี้ได้โดยง่าย
ระบบสมการเชิงอนุพันธ์ ( System of Differential Equations ) คือชุดของสมการอย่างน้อยสองสมการที่เกี่ยวข้องกับ ตัวแปรมากกว่าหนึ่งตัว และ อนุพันธ์ ของตัวแปรเหล่านั้นตามตัวแปรเวลา (หรืออีกตัวแปรหนึ่ง)
8.1 นิยาม
8.1.1 ตัวอย่างที่ 1: ระบบ 2 สมการเชิงเส้น
\[ \begin{cases} \frac{dx}{dt} = 3x + 4y \\ \frac{dy}{dt} = -2x + y \end{cases} \] เป็นระบบ ODE 2 ตัวแปร ซึ่งสามารถเขียนในรูปเมตริกซ์ได้ว่า: \[\frac{d}{dt} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} 3 & 4 \\ -2 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}\]
8.1.2 ตัวอย่างที่ 2: แบบจำลองเศรษฐศาสตร์ (Price Expectation Model)
\[ \begin{cases} \frac{dp}{dt} = \lambda (p^e - p) \\ \frac{dp^e}{dt} = \gamma (p - p^e) \end{cases} \] เป็นระบบ 2 สมการไม่เชิงเส้น สมมุติว่า \(p\) และ \(p^e\) เปลี่ยนแปลงตามกันในเวลา \(t\)
8.1.3 จุดดุลยภาพ (Equilibrium Point)
คือจุด \(\mathbf{x}^*\) ที่ทำให้ \[ \frac{d\mathbf{x}}{dt} = 0 \] หรือ \(\mathbf{f}(\mathbf{x}^*, t) = 0\) เป็นค่าที่ตัวแปรหยุดเปลี่ยนแปลง (นิ่ง)
8.1.4 ประเภทของระบบ ODE:
ประเภท | ตัวอย่าง | คำอธิบาย |
---|---|---|
เชิงเส้น (Linear) | \(\frac{dx}{dt} = Ax\) | คำตอบวิเคราะห์ได้ด้วยเมตริกซ์ |
ไม่เชิงเส้น (Nonlinear) | \(\frac{dx}{dt} = x(1 - x)\) | วิเคราะห์ด้วย phase diagram, linearization |
ระบบอิสระ (Autonomous) | \(\frac{dx}{dt} = f(x)\) | ไม่ขึ้นกับ \(t\) |
ไม่อิสระ (Non-autonomous) | \(\frac{dx}{dt} = f(x, t)\) | มี \(t\) โดยตรงในสมการ |
นักเศรษฐศาสตร์ ไม่จำเป็นต้องแก้แก้สมการเชิงอนุพันธ์ทั้งระบบเสมอไป เพราะเป้าหมายคือเข้าใจพฤติกรรมระยะยาวและโครงสร้างของแบบจำลอง มากกว่าการหาค่าตัวเลขแบบแม่นยำตลอดเวลา
นักเศรษฐศาสตร์มักใช้:
Phase diagram \(\rightarrow\) ดูทิศทางการเคลื่อนไหวของระบบ
Stability analysis \(\rightarrow\) วิเคราะห์ว่า equilibrium point เสถียรหรือไม่
Comparative statics \(\rightarrow\) ศึกษาผลของพารามิเตอร์ต่อจุดดุลยภาพ โดยไม่ต้องรู้ trajectory เต็ม
8.1.5 การวิเคราะห์ Phase diagram ด้วยอาร์โดยใช้ชุดคำสั่ง phaseR
แพ็กเกจ phaseR
ใน R ถูกออกแบบมาเพื่อ วิเคราะห์พฤติกรรมเชิงพลวัตของระบบสมการเชิงอนุพันธ์สามัญ (ODE) โดยเฉพาะระบบแบบ 2 ตัวแปร (2D autonomous ODE systems) ซึ่งเหมาะมากกับการวาด phase portrait, direction field, และ trajectory plot
ระบบสมการเชิงอนุพนธ์ที่ phaseR
ไม่รองรับโดยตรง:
ประเภท | เหตุผล |
---|---|
ODE มากกว่า 2 ตัวแปร | แสดงผลใน phase space ไม่ได้ |
Non-autonomous system (ขึ้นกับ \(t\) โดยตรง) | ต้องแปลงก่อนให้เป็น autonomous |
PDE (สมการเชิงอนุพันธ์ย่อย) | ไม่รองรับ |
DDE (สมการดีเลย์) | ไม่รองรับ |
การวิเคราะห์ Phase diagram (หรือ Phase Portrait) ใน R นิยมใช้เพื่อแสดง เส้นวิถี (trajectories) ของระบบสมการเชิงอนุพันธ์สองตัวแปร \[ \begin{cases} \frac{dx}{dt} = f(x, y) \\ \frac{dy}{dt} = g(x, y) \end{cases} \]
ขั้นตอนการติดตั้ง (ทำครั้งเดียว)
เรียกใช้งาน
library(phaseR)
การสร้างฟังก์ชันของระบบสมการเชิงอนุพันธ์ สำหรับชุดคำสั่ง phaseR ขอยกตัวอย่างสมการอนุพันธ์ในคู่มือแนะนำการใช้งาน phaseR
ตัวอย่างสมการอนุพันธ์ หนึ่งตัวแปร \[ \frac{d y}{d t}=y(1-y)(2-y), \]
<- function (t, y, parameters){
derivative0 list(y * (1 - y) * (2 - y))
}
ตัวอย่างระบบสมการ
ตัวอย่างที่ 1 \[ \frac{d x}{d t}=3 y, \quad \frac{d y}{d t}=2 x, \]
<- function(t, y, parameters) {
derivative1 <- y[1]
x <- y[2]
y <- c(3*y, 2*x)
dy list(dy)
}
ตัวอย่างที่ 2 \[ \frac{d x}{d t}=\alpha y, \quad \frac{d y}{d t}=\beta x, \] \(\alpha\) และ \(\beta\) เป็นค่าพารามิเตอร์
<- function(t, y, parameters) {
derivative2 <- parameters[1]
alpha <- parameters[2]
beta <- y[1]
x <- y[2]
y <- c(alpha*y, beta*x)
dy list(dy)
}
ตัวอย่างที่ 3 \[ \frac{d y}{d t}=a(b-3-y)^2, \]
<- function(t, y, parameters) {
derivative3 <- parameters[1]
a <- parameters[2]
b <- a*(b - 3 - y)^2
dy list(dy)
}
จากตัวอย่างทั้ง 3 สามารถสรุปได้เป็น
<- function(t, y, parameters) {
derivative # Enter derivative computation here
list(dy)
}
จากระบบสมการเชิงอนุพันธ์หนึ่งตัวแปร สามารถวิเคราะห์ phase diagram ได้ดังนี้
# 1. สร้าง flow field (เวกเตอร์ทิศทาง)
<- flowField(derivative0,
flowField xlim = c(0, 4),
ylim = c(-1, 3),
system = "one.dim",
add = FALSE)
# วาดกริด
grid()
# 2. สร้าง nullclines (เส้นที่อนุพันธ์ = 0)
<- nullclines(derivative0,
nullclines xlim = c(0, 4),
ylim = c(-1, 3),
system = "one.dim")
# 3. สร้างเส้นวิถี (trajectories) จากจุดเริ่มต้น y0
<- trajectory(derivative0,
trajectory y0 = c(-0.5, 0.5, 1.5, 2.5),
tlim = c(0, 4),
system = "one.dim")
8.2 ตัวอย่างสมการและระบบสมการเชิงอนุพันธ์ทางเศรษฐศาสตร์:
8.2.1 Price Adjustment Model (Adaptive Expectations)
8.3 แบบจำลองคือ
\[ \begin{cases} \frac{dp}{dt} = \lambda(p^e - p) \\ \frac{dp^e}{dt} = \gamma(p - p^e) \end{cases} \]
ใช้ caracas หาจุดดุลยภาพ
library(caracas)
# กำหนดตัวแปร
<- symbol("lambda_")
lambda <- symbol("gamma")
gamma <-symbol("p_e")
pe <- symbol("p")
p # นิยามฟังก์ชัน
<- cbind(lambda*(pe-p),gamma*(p-pe))
dP # หาค่า p, pe
<- solve_sys(dP, list(p,pe))
sol 1]]$p sol[[
\[p_{e}\]
จุดสมดุล: \(p = p^e\)
ถ้า \(\lambda, \gamma > 0\): ระบบจะเข้าสู่เสถียรภาพ (stable node)
เส้น trajectory จะวิ่งเข้าแนวเส้น \(p = p^e\) จากทุกจุดรอบนอก
สร้างฟังก์ชันของระบบสมการเชิงอนุพันธ์นี้ด้วย phaseR
library(phaseR)
<- function(t, y, parameter){
deriv <- parameter[1]
lambda <- parameter[2]
gamma <- y[1]
p <- y[2]
pe <- c(lambda*(pe-p), gamma*(p-pe))
dy list(dy)
}
สมมุติให้ \(\lambda =2\) และ \(\gamma=1\)
# วาด vector field
<- flowField(deriv,
flowField xlim = c(-5, 5),
ylim = c(-5, 5),
parameters = c(2,1),
system = "two.dim",
add = FALSE)
# วาดกริด
grid()
#เพิ่ม วาดเส้นจุดที่ dy/dt =0
<- nullclines(deriv,
nullclines xlim = c(-5, 5),
ylim = c(-5, 5),
parameters = c(2,1),
col = c("red", "blue"),
system = "two.dim")
#เพิ่ม วาด trajectory ตามจุด y0 ที่กำหนด
<- matrix(c(1, 0, -1, 0, 2, 2, -2,
y0 2, 3, -3, -3, -4), ncol = 2, byrow = TRUE)
<- trajectory(deriv,
trajectory y0 = y0,
tlim = c(0, 5),
parameters = c(2,1),
system = "two.dim")
8.3.1 Solow Growth Equation (Capital Accumulation)
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย phaseR
library(phaseR)
<- function(t, y, parameter){
solow <- parameter[1]
s <- parameter[2]
alpha <- parameter[3]
delta <- y
k <- s*k^alpha - delta*k
dy list(dy)
}
เหตุผลที่ต้องการจุดดุลภาพ ก็เพื่อให้พิจาณาช่วงของ \(k\) ให้ครอบคลุมจุดดุลยภาพนั้นเอง วิเคราะห์ phase diagram
# กำหนด
<- c(0,100)
xlim <- c(0.001,150)
ylim <- c(s = 1, alpha = 0.5, delta = 0.1)
para <- xlim
tlim # วาด vector field
<- flowField(solow,
flowField xlim = xlim,
ylim = ylim,
parameters = para,
system = "one.dim",
ylab = "k(t)",
add = FALSE)
# วาดกริด
grid()
#เพิ่ม วาดเส้นจุดที่ dy/dt =0
<- nullclines(solow,
nullclines xlim = xlim,
ylim = ylim,
parameters = para,
col = "red",
system = "one.dim")
#เพิ่ม วาด trajectory ตามจุด y0 ที่กำหนด
<- c(10,50, 90, 120, 150)
y0 <- trajectory(solow,
trajectory y0 = y0,
tlim = tlim,
col = "blue",
parameters = para,
system = "one.dim")
8.3.2 IS–LM Dynamic Model
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย phaseR
library(phaseR)
<- function(t, y, parameter){
deri <- 1
alpha <- 50
I0 <- 7
b <- 0.3
s <- 1
beta <- 0.5
k <- 3
h <- 100
M <- y[1]
Y <- y[2]
r <- c(alpha*(I0-b*r) -s*Y ,beta*(k*Y - h*r -M))
dy list(dy)
}
จาก \((Y^*,r^*) =(193.1818,-1.13636)\)
# กำหนด
<- c(0,400)
xlim <- c(-50,50)
ylim
<- xlim
tlim # วาด vector field
<- flowField(deri,
flowField xlim = xlim,
ylim = ylim,
parameters = NULL,
system = "two.dim",
xlab = "Y(t)",
ylab = "r(t)",
add = FALSE)
# วาดกริด
grid()
#เพิ่ม วาดเส้นจุดที่ dy/dt =0
<- nullclines(deri,
nullclines xlim = xlim,
ylim = ylim,
parameters = NULL,
col = c("red","green"),
system = "two.dim",
)
#เพิ่ม วาด trajectory ตามจุด (x0,y0) ที่กำหนด
<- matrix(c(10, -4, 5,20 , 150, 20, 250, 30, 350, 10, 300,-20), ncol = 2, byrow = TRUE)
y0 <- trajectory(deri,
trajectory y0 = y0,
tlim = tlim,
col = "blue",
parameters = NULL,
system = "two.dim")
8.3.3 Goodwin Growth Cycle Model (โมเดลวัฏจักรเศรษฐกิจด้านแรงงานกับทุน)
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย phaseR
สมุมติให้ \(\alpha,\beta,\gamma,\delta)=(1,0.1,0.075,1.5)\)
library(phaseR)
<- function(t, y, parameter){
deri <- 1
alpha <- 0.1
beta <- 0.075
gamma <- 1.5
delta <- y[1]
u <- y[2]
v <- u*(alpha - beta*v)
du <- v*(gamma*u - delta)
dv <- c(du,dv)
dy list(dy)
}
จาก \((u^*,v^*) =(0, 0)\) และ (20, 10)
# กำหนด
<- c(0,40)
xlim <- c(0,40)
ylim
<- xlim
tlim # วาด vector field
<- flowField(deri,
flowField xlim = xlim,
ylim = ylim,
parameters = NULL,
system = "two.dim",
xlab = "u(t)",
ylab = "v(t)",
add = FALSE)
# วาดกริด
grid()
#เพิ่ม วาดเส้นจุดที่ dy/dt =0
<- nullclines(deri,
nullclines xlim = xlim,
ylim = ylim,
parameters = NULL,
col = c("red","green"),
system = "two.dim",
)
#เพิ่ม วาด trajectory ตามจุด (x0,y0) ที่กำหนด
<- matrix(c(30, 30, 25, -10 , 10, 10, 40,15), ncol = 2, byrow = TRUE)
y0 <- trajectory(deri,
trajectory y0 = y0,
tlim = tlim,
col = "blue",
parameters = NULL,
system = "two.dim")
8.4 การวิเคราะห์จุดดุลยภาพสำหรับระบบสมการเชิงอนุพันธ์ตั้งแต่ 3 สมการขึ้นไป
การวิเคราะห์ ระบบสมการเชิงอนุพันธ์อันดับหนึ่งที่มี 3 ตัวแปรขึ้นไป (หรือ \(n\) ตัวแปร) การใช้ Jacobian matrix และการหาค่า eigenvalues ก็ยังคงเป็น วิธีมาตรฐานและดีที่สุดในเชิงคณิตศาสตร์ สำหรับการวิเคราะห์จุดดุลยภาพ โดยเฉพาะ:
8.5 ตัวอย่าง ระบบสมการเชิงอนุพันธ์ที่มีตั้งแต่ 3 สมการขึ้นไปในทางเศรษฐศาสตร์
8.5.1 แบบจำลอง IS–LM–PC (New Keynesian Model)
ใช้วิเคราะห์เศรษฐกิจระยะสั้น โดยพิจารณาการบริโภค (IS), การเงิน (LM), และเงินเฟ้อ (Phillips Curve)
การคำนวณเชิงสัญลักษณ์ด้วย caracas
ขั้นที่ 1 สร้างระบบสมการด้วย caracas
library(caracas)
# สร้างตัวแปร
<- as_sym(paste0("alpha",1:3))
alpha <- symbol("r_e")
r_e <- symbol("pi_e")
pi_e <- symbol("Y_e")
Y_e <- symbol("Y")
Y <- symbol("r")
r <- symbol("pi")
pi # สร้างสมการ
<- alpha[1]*(r-r_e)
dY <- alpha[2]*(pi-pi_e)
dr <- alpha[3]*(Y-Y_e)
dpi<- cbind(dY,dr,dpi)
Deri Deri
\[\left[\begin{matrix}\alpha_{1} \left(r - r_{e}\right) & \alpha_{2} \left(\pi - \pi_{e}\right) & \alpha_{3} \left(Y - Y_{e}\right)\end{matrix}\right]\]
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(Y,r,pi))
Jaco Jaco
\[\left[\begin{matrix}0 & \alpha_{1} & 0\\0 & 0 & \alpha_{2}\\\alpha_{3} & 0 & 0\end{matrix}\right]\]
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(Y,r, pi)) Sol
1]]$Y Sol[[
\[Y_{e}\]
1]]$r Sol[[
\[r_{e}\]
ขั้นที่ แทนค่าจุดดุลยภาพลงไปใน ่่Jacobian matrix ที่ได้ โดยใช้คำสั่ง eigenval() จาก caracas
<-eigenval(Jaco) Eigen
ค่า eigenvalue ตัวที่ 1 > 0
1]]$eigval Eigen[[
\[\sqrt[3]{\alpha_{1} \alpha_{2} \alpha_{3}}\]
ค่า eigenvalue ตัวที่ 2 ค่าจริงติดลบ
2]]$eigval Eigen[[
\[- \frac{\sqrt[3]{\alpha_{1} \alpha_{2} \alpha_{3}}}{2} - \frac{\sqrt{3} i \sqrt[3]{\alpha_{1} \alpha_{2} \alpha_{3}}}{2}\]
ค่า eigenvalue ตัวที่ 3 ค่าจริงติดลบ
3]]$eigval Eigen[[
\[- \frac{\sqrt[3]{\alpha_{1} \alpha_{2} \alpha_{3}}}{2} + \frac{\sqrt{3} i \sqrt[3]{\alpha_{1} \alpha_{2} \alpha_{3}}}{2}\]
ดังนั้น ระบบนี้เป็น Saddle focus นั่นคือ ไม่เสถียร์
8.5.2 ระบบสมการเชิงอนุพันธ์ของแบบจำลอง Goodwin:
จำลองวงจรธุรกิจโดยอิงการจ้างงานและการเจรจาค่าจ้าง
การคำนวณเชิงสัญลักษณ์ด้วย caracas
ขั้นที่ 1 สร้างระบบสมการด้วย caracas
library(caracas)
# สร้างตัวแปร
<- symbol("alpha", "positive" = TRUE)
alpha <- symbol("beta", "positive" = TRUE)
beta <- symbol("gamma", "positive" = TRUE)
gamma <- symbol("delta", "positive" = TRUE)
delta <- symbol("eta", "positive" = TRUE)
eta <- symbol("theta", "positive" = TRUE)
theta <- symbol("u")
u <- symbol("v")
v <- symbol("w")
w # สร้างสมการ
<- u*(alpha-beta*v)
du <- v*(gamma*u-delta)
dv <- w*(eta*u-theta)
dw <- cbind(du, dv, dw)
Deri Deri
\[\left[\begin{matrix}u \left(\alpha - \beta v\right) & v \left(- \delta + \gamma u\right) & w \left(\eta u - \theta\right)\end{matrix}\right]\]
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(u,v,w))
Jaco Jaco
\[\left[\begin{matrix}\alpha - \beta v & - \beta u & 0\\\gamma v & - \delta + \gamma u & 0\\\eta w & 0 & \eta u - \theta\end{matrix}\right]\]
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(u,v,w)) Sol
ระบบนี้ มีจุดดุลภาพ 2 จุดคือ \((u,v,w)=(0,0,0)\) และ \((\dfrac{\delta}{\gamma},\dfrac{\alpha}{\beta},0)\)
1]]$u Sol[[
\[0\]
1]]$v Sol[[
\[0\]
1]]$w Sol[[
\[0\]
2]]$u Sol[[
\[\frac{\delta}{\gamma}\]
2]]$v Sol[[
\[\frac{\alpha}{\beta}\]
2]]$w Sol[[
\[0\]
ขั้นที่ แทนค่าจุดดุลยภาพลงไปใน ่่Jacobian matrix ที่ได้ โดยใช้คำสั่ง
subs() eigenval() จาก caracas
<- subs(Jaco, list(u=0,v=0,w=0))
Jaco1 <-eigenval(Jaco1) Eigen
ค่า eigenvalue ตัวที่ 1 > 0
1]]$eigval Eigen[[
\[\alpha\]
ค่า eigenvalue ตัวที่ 2 ค่าจริงติดลบ
2]]$eigval Eigen[[
\[- \delta\]
ค่า eigenvalue ตัวที่ 3 ค่าจริงติดลบ
3]]$eigval Eigen[[
\[- \theta\]
ดังนั้น ระบบนี้เป็น Saddle focus ที่จุดดุลยภาพนี้
พิจารณาจุดดุลยภาพที่ 2
<- subs(Jaco, list(u= Sol[[2]]$u , v=Sol[[2]]$v , w=0))
Jaco1 <-eigenval(Jaco1) Eigen
ค่า eigenvalue ตัวที่ 1 ค่าจริงเท่ากับ 0
1]]$eigval Eigen[[
\[- \sqrt{- \alpha \delta}\]
ค่า eigenvalue ตัวที่ 2 ค่าจริง้ท่ากับ 0
2]]$eigval Eigen[[
\[\sqrt{- \alpha \delta}\]
ค่า eigenvalue ตัวที่ 3
3]]$eigval Eigen[[
\[\frac{\delta \eta - \gamma \theta}{\gamma}\]
จะน้อยกว่า 0 ถ้า \(\delta\eta <\gamma\theta\)
จะเท่ากับ 0 ถ้า \(\delta\eta= \gamma\theta\)
จะมากกว่า 0 ถ้า \(\delta\eta>\gamma\theta\)
8.5.3 แบบจำลองสามกลุ่มเศรษฐกิจ (3-sector Growth Model)
เช่น เศรษฐกิจที่ประกอบด้วย ภาคเกษตร (\(A\)), อุตสาหกรรม (\(I\)), และบริการ (\(S\))
การคำนวณเชิงสัญลักษณ์ด้วย caracas
ขั้นที่ 1 สร้างระบบสมการด้วย caracas
library(caracas)
# สร้างตัวแปร
# เปลี่ยน I เป็น J ทั้งหมด
<- symbol("lambda_AJ", "positive" = TRUE)
lambdaAJ <- symbol("lambda_AS", "positive" = TRUE)
lambdaAS <- symbol("lambda_JA", "positive" = TRUE)
lambdaJA <- symbol("lambda_JS", "positive" = TRUE)
lambdaJS <- symbol("lambda_SA", "positive" = TRUE)
lambdaSA <- symbol("lambda_SJ", "positive" = TRUE)
lambdaSJ <- as_sym(paste0("f",1:3))
f <- symbol("A")
A <- symbol("J")
J <- symbol("S")
S # สร้างสมการ
<- A*(f[1]-lambdaAJ*J-lambdaAS*S)
dA <- J*(f[2]-lambdaJA*A-lambdaJS*S)
dJ <- S*(f[3]-lambdaSA*A-lambdaSJ*J)
dS
<- cbind(dA, dJ, dS)
Deri Deri
\[\left[\begin{matrix}A \left(- J \lambda_{AJ} - S \lambda_{AS} + f_{1}\right) & J \left(- A \lambda_{JA} - S \lambda_{JS} + f_{2}\right) & S \left(- A \lambda_{SA} - J \lambda_{SJ} + f_{3}\right)\end{matrix}\right]\]
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(A,J,S))
Jaco Jaco
\[\left[\begin{matrix}- J \lambda_{AJ} - S \lambda_{AS} + f_{1} & - A \lambda_{AJ} & - A \lambda_{AS}\\- J \lambda_{JA} & - A \lambda_{JA} - S \lambda_{JS} + f_{2} & - J \lambda_{JS}\\- S \lambda_{SA} & - S \lambda_{SJ} & - A \lambda_{SA} - J \lambda_{SJ} + f_{3}\end{matrix}\right]\]
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(A,J,S)) Sol
SympifyError: S
จะพบว่า ไม่สามารถหา คำตอบ ก็ต้องกลับใช้ทักษะ ที่ควรมี ก็คือพิจารณาด้วยตนเองก่อน จะพบว่าจุดดุลภาพแรก คือ \((A^*,J^*,S^*)=(0,0,0)\) และจุดอื่นๆ คือ ถ้า พิจารณา ไม่มีค่าจุดใดเป็นศูนย์ จะได้
# สร้างสมการ
<- (f[1]-lambdaAJ*J-lambdaAS*S)
dA <- (f[2]-lambdaJA*A-lambdaJS*S)
dJ <- (f[3]-lambdaSA*A-lambdaSJ*J)
dS
<- cbind(dA, dJ, dS)
Another.SYS Another.SYS
\[\left[\begin{matrix}- J \lambda_{AJ} - S \lambda_{AS} + f_{1} & - A \lambda_{JA} - S \lambda_{JS} + f_{2} & - A \lambda_{SA} - J \lambda_{SJ} + f_{3}\end{matrix}\right]\]
เนื่องจกสมการนี้เป็นระบบสมการเชิงเส้นควรใช้ คำสั่ง solve_lin() แก้สมการแต่ต้องจัดอยู่ในรูปเมตริกซ์ก่อน
\[\begin{bmatrix}0&-\lambda_{AJ}&-\lambda_{AS}\\-\lambda_{JA}&0&-\lambda_{JS}\\-\lambda_{SA}&-\lambda_{SJ}&0\end{bmatrix}\begin{bmatrix}A\\J\\S\end{bmatrix}=\begin{bmatrix}-f_1\\-f_2\\-f_3 \end{bmatrix}\]
<- matrix(c(0,"-lambda_JA","-lambda_SA","-lambda_AJ",0,"-lambda_SJ","-lambda_AS","-lambda_JS",0),nrow = 3)
mat.A <-as_sym(mat.A)
mat.A mat.A
\[\left[\begin{matrix}0 & - \lambda_{AJ} & - \lambda_{AS}\\- \lambda_{JA} & 0 & - \lambda_{JS}\\- \lambda_{SA} & - \lambda_{SJ} & 0\end{matrix}\right]\]
-f
\[\left[\begin{matrix}- f_{1}\\- f_{2}\\- f_{3}\end{matrix}\right]\]
<- solve_lin(mat.A,-f)
Sol Sol
\[\left[\begin{matrix}- \frac{f_{1} \lambda_{JS} \lambda_{SJ}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} + \frac{f_{2} \lambda_{AS} \lambda_{SJ}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} + \frac{f_{3} \lambda_{AJ} \lambda_{JS}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}}\\\frac{f_{1} \lambda_{JS} \lambda_{SA}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} - \frac{f_{2} \lambda_{AS} \lambda_{SA}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} + \frac{f_{3} \lambda_{AS} \lambda_{JA}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}}\\\frac{f_{1} \lambda_{JA} \lambda_{SJ}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} + \frac{f_{2} \lambda_{AJ} \lambda_{SA}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}} - \frac{f_{3} \lambda_{AJ} \lambda_{JA}}{\lambda_{AJ} \lambda_{JS} \lambda_{SA} + \lambda_{AS} \lambda_{JA} \lambda_{SJ}}\end{matrix}\right]\]
ที่จุดดุลยภาพเท่ากับ \((A,J,S)=(0,0,0)\) Jacobian matrix คือ
<- subs(Jaco, list(A=0,J=0,S=0))
Jaco1 Jaco1
\[\left[\begin{matrix}f_{1} & 0 & 0\\0 & f_{2} & 0\\0 & 0 & f_{3}\end{matrix}\right]\]
จากเมตริกซ์ นี้เห็นได้โดยง่ายว่า ค่า eigenvalue ทั้งหมดมีค่ามากกว่า 0 ดังนั้น ไม่เสถียร
และนำจุดดุลยภาพอีกจุดไปในแทนใน ๋Jacobian matrix เผื่อหาค่า eigenvalue จะได้เป็นคำตอบเชิงสัญลักษณ์ที่ยาว
<-eigenval(Jaco)
Eigen
<-subs(Eigen[[1]]$eigval, list(A = Sol[1,1],
Eigen1 S = Sol[2,1], J =Sol[3,1]))
<-subs(Eigen[[2]]$eigval, list(A = Sol[1,1],
Eigen2 S = Sol[2,1], J =Sol[3,1]))
<-subs(Eigen[[3]]$eigval, list(A = Sol[1,1],
Eigen3 S = Sol[2,1], J =Sol[3,1]))
เหตุที่ไม่ค่าเชิงสัญลักษณ์เพราะ ยาวมาก และถ้าคำนวณด้วยมือหรือกระดาษ โอกาสผิดผลาดสูงมาก
ืทำให้การคำนวณว่า eigenvalue ในเชิงสัญลักษณ์ เป็นไปได้ยาก เพราะพิจาณาให้เห็นค่าเป็นจำนวณ หรือเชิงซ้อนทำได้ยาก จำเป็นต้องแทนตัวเลขลงที่ เพื่อวิเคราะห์
8.6.1 แบบจำลอง SIRV ทางเศรษฐศาสตร์พฤติกรรม
แบบจำลองที่คุณให้มาเป็น SIRV model ซึ่งขยายมาจากแบบจำลองโรคระบาด (SIR model) เพื่ออธิบายการแพร่กระจายของ พฤติกรรม แทนโรค โดยมีการเพิ่มกลุ่มที่ ติดพฤติกรรมอย่างถาวร (\(V\)) เข้าไป เช่น พฤติกรรมการใช้จ่ายอย่างไม่ระวัง การเสพติดบางอย่าง ฯลฯ
การคำนวณเชิงสัญลักษณ์ด้วย caracas
ขั้นที่ 1 สร้างระบบสมการด้วย caracas
library(caracas)
# สร้างตัวแปร
<- symbol("beta", "positive" = TRUE)
beta<- symbol("gamma", "positive" = TRUE)
gamma <- symbol("nu", "positive" = TRUE)
nu <- symbol("S")
S # เปลี่ยน I เป็น J ทั้งหมด
<- symbol("J")
J <- symbol("R")
R <- symbol("V")
V # สร้างสมการ
<- -beta*S*J
dS <- beta*S*J -gamma*J -nu*J
dJ <- gamma*J
dR <- nu*J
dV
<- cbind(dS, dJ, dR, dV)
Deri Deri
\[\left[\begin{matrix}- J S \beta & J S \beta - J \gamma - J \nu & J \gamma & J \nu\end{matrix}\right]\]
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(S, J, R, V))
Jaco Jaco
\[\left[\begin{matrix}- J \beta & - S \beta & 0 & 0\\J \beta & S \beta - \gamma - \nu & 0 & 0\\0 & \gamma & 0 & 0\\0 & \nu & 0 & 0\end{matrix}\right]\]
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย
solve_sys(Deri, list(S, J, R, V))
SympifyError: S
ระบบสมการนี้ caracas ไม่สามารถแก้ได้
ถ้าวิเคราะห์เอง จะพบว่าระบบสมการจะเป็นศูนย์ เมื่อ I=0 ส่งผลตัวแปรอื่นๆ มีค่าเป็นอะไรก็ได้
คำนวณค่า
<- eigenval(Jaco) Eigen
ค่า eigenvalue มีค่าเท่ากับ 0 อยู่ 2 ค่า และ eigenvalue ตัวอื่นเท่ากับ
1]]$eigval Eigen[[
\[- \frac{J \beta}{2} + \frac{S \beta}{2} - \frac{\gamma}{2} - \frac{\nu}{2} - \frac{\sqrt{J^{2} \beta^{2} - 2 J S \beta^{2} - 2 J \beta \gamma - 2 J \beta \nu + S^{2} \beta^{2} - 2 S \beta \gamma - 2 S \beta \nu + \gamma^{2} + 2 \gamma \nu + \nu^{2}}}{2}\]
2]]$eigval Eigen[[
\[- \frac{J \beta}{2} + \frac{S \beta}{2} - \frac{\gamma}{2} - \frac{\nu}{2} + \frac{\sqrt{J^{2} \beta^{2} - 2 J S \beta^{2} - 2 J \beta \gamma - 2 J \beta \nu + S^{2} \beta^{2} - 2 S \beta \gamma - 2 S \beta \nu + \gamma^{2} + 2 \gamma \nu + \nu^{2}}}{2}\]
3]]$eigval Eigen[[
\[0\]