# ติดตั้งแพ็กเกจ (ถ้ายังไม่มี)
install.packages("phaseR")
8 ระบบสมการเชิงอนุพันธ์สำหรับนักเศรษฐศาสตร์
ระบบสมการเชิงอนุพันธ์ ( System of Differential Equations ) คือชุดของสมการอย่างน้อยสองสมการที่เกี่ยวข้องกับ ตัวแปรมากกว่าหนึ่งตัว และ อนุพันธ์ ของตัวแปรเหล่านั้นตามตัวแปรเวลา (หรืออีกตัวแปรหนึ่ง)
8.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}\]
ตัวอย่างที่ 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.1 จุดดุลยภาพ (Equilibrium Point)
คือจุด \(\mathbf{x}^*\) ที่ทำให้ \[ \frac{d\mathbf{x}}{dt} = 0 \] หรือ \(\mathbf{f}(\mathbf{x}^*, t) = 0\) เป็นค่าที่ตัวแปรหยุดเปลี่ยนแปลง (นิ่ง)
8.1.2 ประเภทของระบบ 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.3 การวิเคราะห์ 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))
}
ตัวอย่างระบบสมการ
สามารถสร้างสมการด้วยเพื่อนำไปใช้กับ PhaseR
<- function(t, y, parameters) {
derivative1 <- y[1]
x <- y[2]
y <- c(3*y, 2*x)
dy list(dy)
}
สามารถสร้างสมการด้วยเพื่อนำไปใช้กับ PhaseR
<- 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)
}
สามารถสร้างสมการด้วยเพื่อนำไปใช้กับ PhaseR
<- 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")
การตีความ Phase Diagram (ในทางคณิตศาสตร์/เศรษฐศาสตร์):
องค์ประกอบ | สิ่งที่ช่วยวิเคราะห์ |
---|---|
Flow field | พฤติกรรมเฉพาะจุดของระบบ |
Nullclines | ตำแหน่งจุดดุลยภาพ และการแบ่งโซนพฤติกรรม |
Trajectories | การเปลี่ยนแปลงของระบบเมื่อเริ่มจากจุดต่าง ๆ |
ใน phaseR
แต่ละฟังก์ชัน เช่น flowField()
, nullclines()
, และ trajectory()
มีอาร์กิวเมนต์ที่ใช้ควบคุมลักษณะการวาดแผนภาพเฟส (phase diagram)
xlim
และ ylim
- ใช้กำหนด ช่วงของแกน x และ y สำหรับกราฟ
ตัวอย่าง:
= c(-5, 5) # แกน x จะเริ่มที่ -5 ถึง 5
xlim = c(-5, 5) # แกน y จะเริ่มที่ -5 ถึง 5 ylim
system
ระบุประเภทของระบบสมการอนุพันธ์ที่ใช้
สำหรับระบบ 2 ตัวแปร ใช้
"two.dim"
ตัวอย่าง:
= "two.dim" system
หากเป็นระบบ 1 มิติใช้ "one.dim"
หากเป็นระบบ 2 มิติใช้ "two.dim"
y0
ใช้ใน
trajectory()
เท่านั้นเป็น จุดเริ่มต้น (initial values) ที่จะใช้ในการวาดเส้นทาง (trajectory) ของระบบ
ตัวอย่าง:
= matrix(c(1, 0, -1, 0, 2, 2), ncol = 2, byrow = TRUE) y0
แปลว่าเราจะเริ่ม trajectory ที่: (1, 0) (-1, 0) (2, 2)
หมายเหตุ ถ้าเป็นระบบสมการตัวแปรเดียว ให้กำหนดเป็นเวคเตอร์
tlim
ใช้ใน
trajectory()
เช่นกันระบุช่วงเวลาที่จะวาด trajectory เช่น
tlim = c(0, 5)
แปลว่าให้วาด trajectory จากเวลา 0 ถึง 5
สรุปตารางargument หน้าที่:
Argument | ใช้ใน | ความหมาย |
---|---|---|
xlim |
ทุกฟังก์ชัน | กำหนดช่วงค่าแกน x |
ylim |
ทุกฟังก์ชัน | กำหนดช่วงค่าแกน y |
system |
ทุกฟังก์ชัน | ระบุว่าระบบเป็นกี่มิติ |
y0 |
trajectory() |
จุดเริ่มต้นของ trajectory |
tlim |
trajectory() |
ช่วงเวลาที่จะวาด trajectory |
สามารถใช้ argument อื่นจากฟังก์ชัน plot ในอาร์ได้ เช่น
col เลือกสีที่ต้องการ
lty เลือกลักษณะเส้นที่ต้่องการ เช่น เส้นป่ะ เส้นจุด เป็นต้น
lwd ขนาดของเส้น
xlab, ylab ตั้งชื่อแกน x และ y
main ตั้งชื่อกราฟ
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)
วิธีทำ สามารถสมการหาจุดดุลยภาพ ที่ \(\dfrac{dk}{dt}=0\) ดังนั้น สามารถใช้ caracas ในการจุดดุลยภาพได้ดังนี้
library(caracas)
#สร้างตัวแปร
<- symbol("s", "positive" = TRUE)
s <- symbol("alpha", "positive" = TRUE)
alpha <- symbol("delta", "positive" = TRUE)
delta <- symbol("k")
k #สร้างฟังก์ชัน
<- s*k^alpha - delta*k
solow # หาค่า k ที่ทำให้ solow = 0
<- solve_sys(solow,k)
sol 1]]$k sol[[
\[\left(\frac{\delta}{s}\right)^{\frac{1}{\alpha - 1}}\]
แทนค่า \(s=1\) \(\alpha=0.5\) และ \(\delta=0.1\)
0.1/1)^(1/(.5 - 1)) (
[1] 100
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย 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
วิธีทำ สามารถจุดดุลภาพด้วย caracas
library(caracas)
# สร้างตัวแปร
<- symbol("alpha", "positive" = TRUE)
alpha <- symbol("beta", "positive" = TRUE)
beta #เปลี่ยน I0 เป็น ๋๋J0
<- symbol("J0", "positive" = TRUE)
J0<- symbol("b", "positive" = TRUE)
b <- symbol("r", "positive" = TRUE)
r <- symbol("s", "positive" = TRUE)
s <- symbol("h", "positive" = TRUE)
h <- symbol("k", "positive" = TRUE)
k <- symbol("Y")
Y <- symbol("M")
M # สร้างระบบสมการ
<- cbind(alpha*(J0-b*r)-s*Y, beta*(k*Y -h*r -M))
dy dy
\[\left[\begin{matrix}- Y s + \alpha \left(J_{0} - b r\right) & \beta \left(- M + Y k - h r\right)\end{matrix}\right]\]
แก้สมการด้วยคำสั่ง solve_sys()
<- solve_sys(dy, list(Y,r)) sol
ที่จุดดุลภาพ \((Y^*,r^*)\) \(Y^*\) มีค่าเท่ากับ
1]]$Y sol[[
\[\frac{J_{0} \alpha h + M \alpha b}{\alpha b k + h s}\]
และ \(r^*\) มีค่าเท่ากับ
1]]$r sol[[
\[\frac{J_{0} \alpha k - M s}{\alpha b k + h s}\]
ถ้ากำหนดให้ \(\alpha = 1, J_0 = 50, b = 7, s = 0.3, \beta = 1, k = 0.5, h = 3, M = 100\) จะได้ Y เท่ากับ
subs(sol[[1]]$Y,list(alpha = 1, J0 = 50, b = 7, s = 0.3, beta = 1, k = 0.5, h = 3, M = 100))
\[193.181818181818\]
และ \(r\) เท่ากับ
subs(sol[[1]]$r,list(alpha = 1, J0 = 50, b = 7, s = 0.3, beta = 1, k = 0.5, h = 3, M = 100))
\[-1.13636363636364\]
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย 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 (โมเดลวัฏจักรเศรษฐกิจด้านแรงงานกับทุน)
ความหมายของตัวแปร: แก - \(u\): ส่วนแบ่งแรงงาน (wage share)
\(v\): อัตราการจ้างงาน (employment rate)
\(\alpha, \beta, \gamma, \delta\): พารามิเตอร์เชิงเศรษฐศาสตร์ เช่น productivity growth, bargaining power
ลักษณะ: ระบบนี้สามารถแสดงวงจรวัฏจักร (limit cycle) คล้ายกับ Predator-Prey
วิธีทำ สามารถหาจุดดุลภาพด้วย caracas
library(caracas)
# สร้างตัวแปร
<- symbol("alpha", "positive" = TRUE)
alpha <- symbol("beta", "positive" = TRUE)
beta <- symbol("gamma", "positive" = TRUE)
gamma <- symbol("delta", "positive" = TRUE)
delta <- symbol("u")
u <- symbol("v")
v # สร้างระบบสมการ
<- cbind( u*(alpha-beta*v), v*(gamma*u-delta))
dy dy
\[\left[\begin{matrix}u \left(\alpha - \beta v\right) & v \left(- \delta + \gamma u\right)\end{matrix}\right]\]
แก้สมการด้วยคำสั่ง solve_sys()
<- solve_sys(dy, list(u,v)) sol
ที่จุดดุลภาพ มี 2 จุดคือ \((u^*,v^*)\) \(u^*\) มีค่าเท่ากับ
1]]$u sol[[
\[0\]
และ \(r\) มีค่าเท่ากับ
1]]$v sol[[
\[0\]
นั่นคือ \((u^*,v^*)=(0,0)\)
และ
2]]$u sol[[
\[\frac{\delta}{\gamma}\]
และ \(r\) มีค่าเท่ากับ
2]]$v sol[[
\[\frac{\alpha}{\beta}\]
นั้นคือ \((u^*, v^*)=\left(\dfrac{\delta}{\gamma},\dfrac{\alpha}{\beta}\right)\)
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย 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 ก็ยังคงเป็น วิธีมาตรฐานและดีที่สุดในเชิงคณิตศาสตร์ สำหรับการวิเคราะห์จุดดุลยภาพ โดยเฉพาะ:
วิธีทำ Jacobian คือเมทริกซ์ \(3 \times 3\): \[ J(x, y, z) = \begin{bmatrix} \frac{\partial f}{\partial x} & \frac{\partial f}{\partial y} & \frac{\partial f}{\partial z} \\ \frac{\partial g}{\partial x} & \frac{\partial g}{\partial y} & \frac{\partial g}{\partial z} \\ \frac{\partial h}{\partial x} & \frac{\partial h}{\partial y} & \frac{\partial h}{\partial z} \end{bmatrix} \]
แล้วแทนค่าจุดดุลยภาพ \((x^*, y^*, z^*)\) \(\rightarrow\) หา eigenvalues \(\rightarrow\) วิเคราะห์เสถียรภาพ
ตารางสรุป: ความสัมพันธ์ระหว่าง Eigenvalues กับลักษณะของจุดดุลยภาพ
ลักษณะของ Eigenvalues | สถานะของจุดดุลยภาพ | ความหมายทางพลวัต |
---|---|---|
ทุก \(\Re(\lambda_i) < 0\) | Stable node / focus / spiral | จุดดุลยภาพ เสถียร (asymptotically stable) |
มีบาง \(\Re(\lambda_i) > 0\) | Unstable | ระบบหนีออกจากจุดนั้น |
มี \(\Re(\lambda_i) > 0\) และ \(\Re(\lambda_j) < 0\) | Saddle point | เสถียรบางทิศทาง ไม่เสถียรบางทิศทาง |
ทุก \(\Re(\lambda_i) = 0\) แต่ไม่เป็นศูนย์หลายลำดับ | Center / Neutrally stable | ระบบแกว่งวนรอบจุดนั้น (ต้องใช้วิธีอื่นช่วยวิเคราะห์ต่อ) |
บาง \(\Re(\lambda_i) = 0\) | ไม่สามารถสรุปได้แน่ชัด | อาจต้องใช้ Lyapunov method หรือ nonlinear terms ตรวจสอบต่อ |
8.5 ตัวอย่าง ระบบสมการเชิงอนุพันธ์ที่มีตั้งแต่ 3 สมการขึ้นไปในทางเศรษฐศาสตร์
8.5.1 แบบจำลอง IS–LM–PC (New Keynesian Model)
ใช้วิเคราะห์เศรษฐกิจระยะสั้น โดยพิจารณาการบริโภค (IS), การเงิน (LM), และเงินเฟ้อ (Phillips Curve)
\(Y\) = รายได้จริง
\(r\) = อัตราดอกเบี้ยนโยบาย
\(\pi\) = อัตราเงินเฟ้อ
\(\pi^*, r^*, Y^*\) = ค่าดุลยภาพ
\(\alpha_i\) = พารามิเตอร์ตอบสนอง
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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
จำลองวงจรธุรกิจโดยอิงการจ้างงานและการเจรจาค่าจ้าง
ความหมายของตัวแปร:
สัญลักษณ์ | ความหมายทางเศรษฐศาสตร์ |
---|---|
\(u(t)\) | อัตราการจ้างงาน (employment rate) – สัดส่วนแรงงานที่มีงานทำ |
\(v(t)\) | ส่วนแบ่งกำไรของทุน (profit share) – สัดส่วนของรายได้ที่ไปสู่ทุน |
\(w(t)\) | ค่าจ้างแรงงานต่อหน่วยเวลา (real wage) หรือดัชนีค่าจ้างแรงงาน |
ความหมายของพารามิเตอร์:
สัญลักษณ์ | ความหมาย | ค่าคาดหวัง |
---|---|---|
\(\alpha\) | อัตราการเติบโตของการจ้างงานพื้นฐาน (เช่น เทคโนโลยีหรือผลผลิตแรงงาน) | บวก |
\(\beta\) | ความไวของการจ้างงานต่อส่วนแบ่งกำไร (เมื่อ \(v\) เพิ่ม \(\rightarrow\) \(u\) ลด) | บวก |
\(\gamma\) | ความไวของกำไรต่อการจ้างงาน (เมื่อ \(u\) เพิ่ม\(\rightarrow\) กำไรเพิ่ม) | บวก |
\(\delta\) | อัตราการลดลงของส่วนแบ่งกำไร (เช่น จากค่าแรง, ภาษี ฯลฯ) | บวก |
\(\eta\) | ความไวของค่าจ้างต่ออัตราการจ้างงาน (bargaining power ของแรงงาน) | บวก |
\(\theta\) | อัตราการกัดกร่อนค่าจ้างจากปัจจัยภายนอก เช่น productivity หรือแรงถ่วงของตลาด | บวก |
คำอธิบายเชิงพลวัต:
สมการที่ 1: จ้างงานเพิ่มขึ้นเมื่อกำไรไม่สูงเกินไป (\(v\) ต่ำ)
สมการที่ 2: ส่วนแบ่งกำไรเพิ่มขึ้นเมื่อมีการจ้างงานสูง (ผลิตภาพดี)
สมการที่ 3: ค่าจ้างแรงงานเพิ่มขึ้นตามอัตราการจ้างงาน — เพราะอำนาจต่อรองแรงงานแข็งแรง
ระบบนี้สร้าง วงจรเศรษฐกิจ ที่มีลักษณะเป็น วงรอบ (limit cycle) ได้ในบางช่วง เช่น ค่าจ้างสูง \(\rightarrow\) กำไรลด \(\rightarrow\) การจ้างงานลด \(\rightarrow\) ค่าจ้างถูกกด \(\rightarrow\) กำไรเพิ่ม \(\rightarrow\) กลับมาใหม่
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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\))
ความหมายของตัวแปร
ตัวแปร | ความหมายทางเศรษฐศาสตร์ |
---|---|
\(A(t)\) | ขนาดของภาคเกษตรกรรม (Agricultural sector) ณ เวลา \(t\) |
\(I(t)\) | ขนาดของภาคอุตสาหกรรม (Industrial sector) |
\(S(t)\) | ขนาดของภาคบริการ (Service sector) |
ขนาดอาจวัดได้ด้วย GDP ส่วนย่อย, การจ้างงาน, หรือผลผลิตภาคเศรษฐกิจนั้น ๆ
ความหมายของพารามิเตอร์
พารามิเตอร์ | ความหมาย | ค่าคาดหวัง |
---|---|---|
\(f_A\) | อัตราการเติบโตพื้นฐานของภาคเกษตร (endogenous growth rate) | บวก (หรือลดลงหากอิงโครงสร้างเก่า) |
\(f_I\) | อัตราการเติบโตพื้นฐานของภาคอุตสาหกรรม | บวก (มักสูงในประเทศกำลังพัฒนา) |
\(f_S\) | อัตราการเติบโตพื้นฐานของภาคบริการ | บวก (เพิ่มตามพัฒนาการเศรษฐกิจ) |
\(\lambda_{ij}\) | ความหมาย | ตีความทางเศรษฐศาสตร์ |
---|---|---|
\(\lambda_{AI}\) | ผลกระทบเชิงลบจากภาคอุตสาหกรรมต่อภาคเกษตร | การย้ายทรัพยากรจากเกษตรไปอุตฯ |
\(\lambda_{AS}\) | ผลกระทบจากภาคบริการต่อภาคเกษตร | เช่น การเปลี่ยนแรงงานไปสู่บริการ |
\(\lambda_{IA}\) | ผลกระทบจากเกษตรต่ออุตสาหกรรม | การแข่งขันด้านแรงงาน หรือ supply ของ input |
\(\lambda_{IS}\) | ผลกระทบจากบริการต่ออุตสาหกรรม | ดึงแรงงาน skilled ไปจากอุตสาหกรรม |
\(\lambda_{SA}\) | ผลกระทบจากเกษตรต่อบริการ | เช่น การใช้ที่ดินหรือแรงงานท้องถิ่น |
\(\lambda_{SI}\) | ผลกระทบจากอุตสาหกรรมต่อบริการ | อาจเป็นบวกหากเกิดการเชื่อมโยงอุตฯ–บริการ |
โดยทั่วไป \(\lambda_{ij} > 0\) แสดงถึง “การแย่งทรัพยากร” ระหว่างภาคเศรษฐกิจต่าง ๆ
ซึ่งหมายถึง เมื่อภาค \(j\) เติบโต จะ “กดทับ” การเติบโตของภาค \(i\)
ลักษณะของสมการ:
เป็นแบบจำลอง nonlinear ODEs ที่อยู่ในรูปของ Lotka–Volterra-type competition model
การเติบโตของแต่ละภาค ขึ้นกับตัวเอง (ผ่าน \(A, I, S\))
และได้รับผลกระทบเชิงลบจากภาคอื่นผ่าน \(\lambda_{ij}\)
ตัวอย่างเชิงนโยบาย:
ถ้า \(\lambda_{AI}\) สูง \(\rightarrow\) นโยบายเร่งอุตสาหกรรมอาจทำให้ภาคเกษตรเสื่อมถอยเร็ว
ถ้า \(f_S\) สูงแต่ \(\lambda_{SI}\) สูงด้วย \(\rightarrow\) การขยายบริการอาจบั่นทอนอุตสาหกรรม (structural unbalance)
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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",
mat.A "-lambda_AS","-lambda_JS",0),nrow = 3)
<- 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.5.4 แบบจำลอง SIRV ทางเศรษฐศาสตร์พฤติกรรม
แบบจำลองที่คุณให้มาเป็น SIRV model ซึ่งขยายมาจากแบบจำลองโรคระบาด (SIR model) เพื่ออธิบายการแพร่กระจายของ พฤติกรรม แทนโรค โดยมีการเพิ่มกลุ่มที่ ติดพฤติกรรมอย่างถาวร (\(V\)) เข้าไป เช่น พฤติกรรมการใช้จ่ายอย่างไม่ระวัง การเสพติดบางอย่าง ฯลฯ
\(S\) = กลุ่มที่ยังไม่รับพฤติกรรม
\(I\) = กลุ่มที่กำลังมีพฤติกรรม
\(R\) = กลุ่มที่เลิกพฤติกรรมแล้ว
\(V\) = กลุ่มที่มีพฤติกรรมถาวร (เช่น ติดการใช้จ่ายแบบฟุ่มเฟือย)
คำอธิบายพารามิเตอร์
สัญลักษณ์ | ความหมาย | หน่วย (โดยนัย) | ความหมายเชิงพฤติกรรม |
---|---|---|---|
\(\beta\) | อัตราการแพร่พฤติกรรม | ต่อคนต่อเวลา | ความรุนแรงของการชักจูง เช่น การโน้มน้าวจากคนรอบข้างหรือโฆษณา |
\(\gamma\) | อัตราการเลิกพฤติกรรม | ต่อเวลา | ความเร็วที่บุคคล กลับตัว หรือหยุดพฤติกรรม เช่น เลิกใช้จ่ายฟุ่มเฟือย |
\(\nu\) | อัตราการกลายเป็นผู้มีพฤติกรรมถาวร | ต่อเวลา | โอกาสที่บุคคลจะ ติดพฤติกรรม จนเปลี่ยนแปลงนิสัยแบบถาวร เช่น กลายเป็นนักช็อปตลอดชีวิต |
ความสัมพันธ์ของสมการ
พฤติกรรมเริ่มแพร่จาก \(S\) \(\rightarrow\) \(I\) ผ่านการปฏิสัมพันธ์ (\(\beta SI\))
ผู้มีพฤติกรรม (\(I\)) สามารถ เลิก ได้ (\(\gamma I\) \(\rightarrow\) \(R\)) หรือ ติดถาวร ได้ (\(\nu I\) \(\rightarrow\) \(V\))
ไม่มีการกลับจาก \(R\) หรือ \(V\) ไปสู่ \(I\) หรือ \(S\) (ในโมเดลนี้ถือว่าถาวร)
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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\]
8.6 แบบฝึกหัดระบบสมการเชิงอนุพันธ์
8.6.1 I. วิเคราะห์เสถียรภาพ + Jacobian (เหมาะกับ caracas
)
ระบบ: \[\begin{cases} \frac{dx}{dt} = 3x - y \\ \frac{dy}{dt} = 2x + 4y \end{cases}\] หาจุดสมดุล, Jacobian matrix, eigenvalue และวิเคราะห์เสถียรภาพ
ระบบ: \[\frac{dx}{dt} = x(1 - y),\quad \frac{dy}{dt} = y(x - 2)\] หา Jacobian ที่จุดสมดุล และตรวจสอบเสถียรภาพ
ระบบ: \[\frac{dx}{dt} = y,\quad \frac{dy}{dt} = -\sin(x) - 0.1y\] หาจุดดุลยภาพ (เชิงตัวเลข), หา Jacobian โดยประมาณด้วย
caracas
ระบบ Lotka–Volterra: \[\frac{dR}{dt} = aR - bRF,\quad \frac{dF}{dt} = -cF + eRF\] ใช้
caracas
เพื่อหา Jacobian ที่จุดสมดุล\[ \frac{dx}{dt} = x(2 - x - y),\quad \frac{dy}{dt} = y(3 - x - y) \] หาจุดตัด nullclines และวิเคราะห์ Jacobian ที่แต่ละจุด
8.6.2 II. วิเคราะห์ด้วย eigen()
หรือ caracas::eigenvals()
ให้ Jacobian: \[J = \begin{bmatrix} 0 & 1 \\ -4 & -2 \end{bmatrix}\] หาค่า eigenvalues และวิเคราะห์ลักษณะ trajectory
เมตริกซ์ระบบ: \[A = \begin{bmatrix} 1 & 2 \\ -3 & -4 \end{bmatrix}\]
ใช้ eigen()
วิเคราะห์เสถียรภาพของจุดดุลยภาพ
\[ \frac{dx}{dt} = y,\quad \frac{dy}{dt} = -x - y \] เขียนระบบเป็นเมตริกซ์ แล้วใช้
eigen()
วิเคราะห์จุดสมดุล\[ \frac{dx}{dt} = 5x + y,\quad \frac{dy}{dt} = -x + 2y \] หาค่า eigenvalues และประเภทของจุดดุลยภาพ
\[ \frac{dp}{dt} = \lambda(p^e - p),\quad \frac{dp^e}{dt} = \gamma(p - p^e) \] แปลงเป็นระบบเมตริกซ์ และหา eigenvalues ของระบบ
8.6.3 III. ใช้ phaseR
วิเคราะห์ flow field, nullclines, trajectory
\[ \frac{dx}{dt} = y,\quad \frac{dy}{dt} = -x \] ใช้
phaseR::flowField()
และtrajectory()
จากจุด \((1, 0)\)\[ \frac{dx}{dt} = x - y^2,\quad \frac{dy}{dt} = y + x^2 \] ใช้
nullclines()
เพื่อหาจุดตัด และflowField()
เพื่อแสดงพฤติกรรม\[ \frac{dx}{dt} = x(1 - x - y),\quad \frac{dy}{dt} = y(2 - x - y) \] ใช้
flowField()
เพื่อวิเคราะห์การกระจายของ trajectory\[ \frac{dx}{dt} = -2x + y,\quad \frac{dy}{dt} = -x - y \] วาด phase portrait พร้อม trajectory จากหลายจุดเริ่มต้น
\[ \frac{dx}{dt} = -x + y,\quad \frac{dy}{dt} = -2x - y \] วาด nullclines + เส้นวิถีจากจุดเริ่ม \((2, 0)\)
ให้ระบบทั่วไป \[ \frac{dx}{dt} = ax + by,\quad \frac{dy}{dt} = cx + dy \] เขียนฟังก์ชันใน R ที่รับ \(a, b, c, d\) แล้วคำนวณ eigenvalues อัตโนมัติ
\[ \frac{dx}{dt} = x + y,\quad \frac{dy}{dt} = -x + y \] หาค่า eigenvalue และใช้
phaseR
วิเคราะห์ flowField