# ติดตั้งแพ็กเกจ (ถ้ายังไม่มี)
install.packages("phaseR")
8 ระบบสมการเชิงอนุพันธ์สำหรับนักเศรษฐศาสตร์
ระบบสมการเชิงอนุพันธ์ ( System of Differential Equations ) คือชุดของสมการอย่างน้อยสองสมการที่เกี่ยวข้องกับ ตัวแปรมากกว่าหนึ่งตัว และ อนุพันธ์ ของตัวแปรเหล่านั้นตามตัวแปรเวลา (หรืออีกตัวแปรหนึ่ง)
8.1 นิยาม
ตัวอย่างที่ 1 ระบบ 2 สมการเชิงเส้น
ตัวอย่างที่ 2 แบบจำลองเศรษฐศาสตร์ (Price Expectation Model)
8.1.1 จุดดุลยภาพ (Equilibrium Point)
คือจุด
8.1.2 ประเภทของระบบ ODE:
ประเภท | ตัวอย่าง | คำอธิบาย |
---|---|---|
เชิงเส้น (Linear) | คำตอบวิเคราะห์ได้ด้วยเมตริกซ์ | |
ไม่เชิงเส้น (Nonlinear) | วิเคราะห์ด้วย phase diagram, linearization | |
ระบบอิสระ (Autonomous) | ไม่ขึ้นกับ |
|
ไม่อิสระ (Non-autonomous) | มี |
นักเศรษฐศาสตร์ ไม่จำเป็นต้องแก้สมการเชิงอนุพันธ์ทั้งระบบเสมอไป เพราะเป้าหมายคือเข้าใจพฤติกรรมระยะยาวและโครงสร้างของแบบจำลอง มากกว่าการหาค่าตัวเลขแบบแม่นยำตลอดเวลา
นักเศรษฐศาสตร์มักใช้:
Phase diagram
ดูทิศทางการเคลื่อนไหวของระบบStability analysis
วิเคราะห์ว่า equilibrium point เสถียรหรือไม่Comparative statics
ศึกษาผลของพารามิเตอร์ต่อจุดดุลยภาพ โดยไม่ต้องรู้ 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 (ขึ้นกับ |
ต้องแปลงก่อนให้เป็น autonomous |
PDE (สมการเชิงอนุพันธ์ย่อย) | ไม่รองรับ |
DDE (สมการดีเลย์) | ไม่รองรับ |
การวิเคราะห์ Phase diagram (หรือ Phase Portrait) ใน R นิยมใช้เพื่อแสดง เส้นวิถี (trajectories) ของระบบสมการเชิงอนุพันธ์สองตัวแปร
ขั้นตอนการติดตั้ง (ทำครั้งเดียว)
เรียกใช้งาน
library(phaseR)
การสร้างฟังก์ชันของระบบสมการเชิงอนุพันธ์ สำหรับชุดคำสั่ง phaseR ขอยกตัวอย่างสมการอนุพันธ์ในคู่มือแนะนำการใช้งาน phaseR
ตัวอย่างสมการอนุพันธ์ หนึ่งตัวแปร
<- 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 แบบจำลองคือ
วิธีทำ ใช้ 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[[
จุดสมดุล:
ถ้า
: ระบบจะเข้าสู่เสถียรภาพ (stable node)เส้น trajectory จะวิ่งเข้าแนวเส้น
จากทุกจุดรอบนอก
สร้างฟังก์ชันของระบบสมการเชิงอนุพันธ์นี้ด้วย 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)
}
สมมุติให้
# วาด 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)
วิธีทำ สามารถสมการหาจุดดุลยภาพ ที่
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[[
แทนค่า
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)
}
เหตุผลที่ต้องการจุดดุลภาพ ก็เพื่อให้พิจาณาช่วงของ
# กำหนด
<- 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
แก้สมการด้วยคำสั่ง solve_sys()
<- solve_sys(dy, list(Y,r)) sol
ที่จุดดุลภาพ
1]]$Y sol[[
และ
1]]$r sol[[
ถ้ากำหนดให้
subs(sol[[1]]$Y,list(alpha = 1, J0 = 50, b = 7, s = 0.3, beta = 1, k = 0.5, h = 3, M = 100))
และ
subs(sol[[1]]$r,list(alpha = 1, J0 = 50, b = 7, s = 0.3, beta = 1, k = 0.5, h = 3, M = 100))
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย 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)
}
จาก
# กำหนด
<- 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 (โมเดลวัฏจักรเศรษฐกิจด้านแรงงานกับทุน)
ความหมายของตัวแปร: แก -
: อัตราการจ้างงาน (employment rate) : พารามิเตอร์เชิงเศรษฐศาสตร์ เช่น 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
แก้สมการด้วยคำสั่ง solve_sys()
<- solve_sys(dy, list(u,v)) sol
ที่จุดดุลภาพ มี 2 จุดคือ
1]]$u sol[[
และ
1]]$v sol[[
นั่นคือ
และ
2]]$u sol[[
และ
2]]$v sol[[
นั้นคือ
สร้างฟังก์ชันเพื่อวิเคราะห์ด้วย phaseR
สมุมติให้
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)
}
จาก
# กำหนด
<- 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 ตัวแปรขึ้นไป (หรือ
วิธีทำ Jacobian คือเมทริกซ์
แล้วแทนค่าจุดดุลยภาพ
ตารางสรุป: ความสัมพันธ์ระหว่าง Eigenvalues กับลักษณะของจุดดุลยภาพ
ลักษณะของ Eigenvalues | สถานะของจุดดุลยภาพ | ความหมายทางพลวัต |
---|---|---|
ทุก |
Stable node / focus / spiral | จุดดุลยภาพ เสถียร (asymptotically stable) |
มีบาง |
Unstable | ระบบหนีออกจากจุดนั้น |
มี |
Saddle point | เสถียรบางทิศทาง ไม่เสถียรบางทิศทาง |
ทุก |
Center / Neutrally stable | ระบบแกว่งวนรอบจุดนั้น (ต้องใช้วิธีอื่นช่วยวิเคราะห์ต่อ) |
บาง |
ไม่สามารถสรุปได้แน่ชัด | อาจต้องใช้ Lyapunov method หรือ nonlinear terms ตรวจสอบต่อ |
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
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(Y,r,pi))
Jaco Jaco
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(Y,r, pi)) Sol
1]]$Y Sol[[
1]]$r Sol[[
ขั้นที่ แทนค่าจุดดุลยภาพลงไปใน ่่Jacobian matrix ที่ได้ โดยใช้คำสั่ง eigenval() จาก caracas
<-eigenval(Jaco) Eigen
ค่า eigenvalue ตัวที่ 1 > 0
1]]$eigval Eigen[[
ค่า eigenvalue ตัวที่ 2 ค่าจริงติดลบ
2]]$eigval Eigen[[
ค่า eigenvalue ตัวที่ 3 ค่าจริงติดลบ
3]]$eigval Eigen[[
ดังนั้น ระบบนี้เป็น Saddle focus นั่นคือ ไม่เสถียร์
8.5.2 ระบบสมการเชิงอนุพันธ์ของแบบจำลอง Goodwin
จำลองวงจรธุรกิจโดยอิงการจ้างงานและการเจรจาค่าจ้าง
ความหมายของตัวแปร:
สัญลักษณ์ | ความหมายทางเศรษฐศาสตร์ |
---|---|
อัตราการจ้างงาน (employment rate) – สัดส่วนแรงงานที่มีงานทำ | |
ส่วนแบ่งกำไรของทุน (profit share) – สัดส่วนของรายได้ที่ไปสู่ทุน | |
ค่าจ้างแรงงานต่อหน่วยเวลา (real wage) หรือดัชนีค่าจ้างแรงงาน |
ความหมายของพารามิเตอร์:
สัญลักษณ์ | ความหมาย | ค่าคาดหวัง |
---|---|---|
อัตราการเติบโตของการจ้างงานพื้นฐาน (เช่น เทคโนโลยีหรือผลผลิตแรงงาน) | บวก | |
ความไวของการจ้างงานต่อส่วนแบ่งกำไร (เมื่อ |
บวก | |
ความไวของกำไรต่อการจ้างงาน (เมื่อ |
บวก | |
อัตราการลดลงของส่วนแบ่งกำไร (เช่น จากค่าแรง, ภาษี ฯลฯ) | บวก | |
ความไวของค่าจ้างต่ออัตราการจ้างงาน (bargaining power ของแรงงาน) | บวก | |
อัตราการกัดกร่อนค่าจ้างจากปัจจัยภายนอก เช่น productivity หรือแรงถ่วงของตลาด | บวก |
คำอธิบายเชิงพลวัต:
สมการที่ 1: จ้างงานเพิ่มขึ้นเมื่อกำไรไม่สูงเกินไป (
ต่ำ)สมการที่ 2: ส่วนแบ่งกำไรเพิ่มขึ้นเมื่อมีการจ้างงานสูง (ผลิตภาพดี)
สมการที่ 3: ค่าจ้างแรงงานเพิ่มขึ้นตามอัตราการจ้างงาน — เพราะอำนาจต่อรองแรงงานแข็งแรง
ระบบนี้สร้าง วงจรเศรษฐกิจ ที่มีลักษณะเป็น วงรอบ (limit cycle) ได้ในบางช่วง เช่น ค่าจ้างสูง
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(u,v,w))
Jaco Jaco
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(u,v,w)) Sol
ระบบนี้ มีจุดดุลภาพ 2 จุดคือ
1]]$u Sol[[
1]]$v Sol[[
1]]$w Sol[[
2]]$u Sol[[
2]]$v Sol[[
2]]$w Sol[[
ขั้นที่ แทนค่าจุดดุลยภาพลงไปใน ่่Jacobian matrix ที่ได้ โดยใช้คำสั่ง
subs() และ eigenval() จาก caracas
<- subs(Jaco, list(u=0,v=0,w=0))
Jaco1 <-eigenval(Jaco1) Eigen
ค่า eigenvalue ตัวที่ 1 > 0
1]]$eigval Eigen[[
ค่า eigenvalue ตัวที่ 2 ค่าจริงติดลบ
2]]$eigval Eigen[[
ค่า eigenvalue ตัวที่ 3 ค่าจริงติดลบ
3]]$eigval Eigen[[
ดังนั้น ระบบนี้เป็น 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[[
ค่า eigenvalue ตัวที่ 2 ค่าจริง้ท่ากับ 0
2]]$eigval Eigen[[
ค่า eigenvalue ตัวที่ 3
3]]$eigval Eigen[[
จะน้อยกว่า 0 ถ้า
จะเท่ากับ 0 ถ้า
จะมากกว่า 0 ถ้า
8.5.3 แบบจำลองสามกลุ่มเศรษฐกิจ (3-sector Growth Model)
เช่น เศรษฐกิจที่ประกอบด้วย ภาคเกษตร (
ความหมายของตัวแปร
ตัวแปร | ความหมายทางเศรษฐศาสตร์ |
---|---|
ขนาดของภาคเกษตรกรรม (Agricultural sector) ณ เวลา |
|
ขนาดของภาคอุตสาหกรรม (Industrial sector) | |
ขนาดของภาคบริการ (Service sector) |
ขนาดอาจวัดได้ด้วย GDP ส่วนย่อย, การจ้างงาน, หรือผลผลิตภาคเศรษฐกิจนั้น ๆ
ความหมายของพารามิเตอร์
พารามิเตอร์ | ความหมาย | ค่าคาดหวัง |
---|---|---|
อัตราการเติบโตพื้นฐานของภาคเกษตร (endogenous growth rate) | บวก (หรือลดลงหากอิงโครงสร้างเก่า) | |
อัตราการเติบโตพื้นฐานของภาคอุตสาหกรรม | บวก (มักสูงในประเทศกำลังพัฒนา) | |
อัตราการเติบโตพื้นฐานของภาคบริการ | บวก (เพิ่มตามพัฒนาการเศรษฐกิจ) |
ความหมาย | ตีความทางเศรษฐศาสตร์ | |
---|---|---|
ผลกระทบเชิงลบจากภาคอุตสาหกรรมต่อภาคเกษตร | การย้ายทรัพยากรจากเกษตรไปอุตฯ | |
ผลกระทบจากภาคบริการต่อภาคเกษตร | เช่น การเปลี่ยนแรงงานไปสู่บริการ | |
ผลกระทบจากเกษตรต่ออุตสาหกรรม | การแข่งขันด้านแรงงาน หรือ supply ของ input | |
ผลกระทบจากบริการต่ออุตสาหกรรม | ดึงแรงงาน skilled ไปจากอุตสาหกรรม | |
ผลกระทบจากเกษตรต่อบริการ | เช่น การใช้ที่ดินหรือแรงงานท้องถิ่น | |
ผลกระทบจากอุตสาหกรรมต่อบริการ | อาจเป็นบวกหากเกิดการเชื่อมโยงอุตฯ–บริการ |
โดยทั่วไป
ซึ่งหมายถึง เมื่อภาค
ลักษณะของสมการ:
เป็นแบบจำลอง nonlinear ODEs ที่อยู่ในรูปของ Lotka–Volterra-type competition model
การเติบโตของแต่ละภาค ขึ้นกับตัวเอง (ผ่าน
)และได้รับผลกระทบเชิงลบจากภาคอื่นผ่าน
ตัวอย่างเชิงนโยบาย:
ถ้า
สูง นโยบายเร่งอุตสาหกรรมอาจทำให้ภาคเกษตรเสื่อมถอยเร็วถ้า
สูงแต่ สูงด้วย การขยายบริการอาจบั่นทอนอุตสาหกรรม (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
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(A,J,S))
Jaco Jaco
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย solve_sys() ใน caracas
<-solve_sys(Deri, list(A,J,S)) Sol
SympifyError: S
จะพบว่า ไม่สามารถหา คำตอบ ก็ต้องกลับใช้ทักษะ ที่ควรมี ก็คือพิจารณาด้วยตนเองก่อน จะพบว่าจุดดุลภาพแรก คือ
# สร้างสมการ
<- (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
เนื่องจกสมการนี้เป็นระบบสมการเชิงเส้นควรใช้ คำสั่ง solve_lin() แก้สมการแต่ต้องจัดอยู่ในรูปเมตริกซ์ก่อน
<- 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
-f
<- solve_lin(mat.A,-f)
Sol Sol
ที่จุดดุลยภาพเท่ากับ
<- subs(Jaco, list(A=0,J=0,S=0))
Jaco1 Jaco1
จากเมตริกซ์ นี้เห็นได้โดยง่ายว่า ค่า 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) เพื่ออธิบายการแพร่กระจายของ พฤติกรรม แทนโรค โดยมีการเพิ่มกลุ่มที่ ติดพฤติกรรมอย่างถาวร (
= กลุ่มที่ยังไม่รับพฤติกรรม = กลุ่มที่กำลังมีพฤติกรรม = กลุ่มที่เลิกพฤติกรรมแล้ว = กลุ่มที่มีพฤติกรรมถาวร (เช่น ติดการใช้จ่ายแบบฟุ่มเฟือย)
คำอธิบายพารามิเตอร์
สัญลักษณ์ | ความหมาย | หน่วย (โดยนัย) | ความหมายเชิงพฤติกรรม |
---|---|---|---|
อัตราการแพร่พฤติกรรม | ต่อคนต่อเวลา | ความรุนแรงของการชักจูง เช่น การโน้มน้าวจากคนรอบข้างหรือโฆษณา | |
อัตราการเลิกพฤติกรรม | ต่อเวลา | ความเร็วที่บุคคล กลับตัว หรือหยุดพฤติกรรม เช่น เลิกใช้จ่ายฟุ่มเฟือย | |
อัตราการกลายเป็นผู้มีพฤติกรรมถาวร | ต่อเวลา | โอกาสที่บุคคลจะ ติดพฤติกรรม จนเปลี่ยนแปลงนิสัยแบบถาวร เช่น กลายเป็นนักช็อปตลอดชีวิต |
ความสัมพันธ์ของสมการ
พฤติกรรมเริ่มแพร่จาก
ผ่านการปฏิสัมพันธ์ ( )ผู้มีพฤติกรรม (
) สามารถ เลิก ได้ ( ) หรือ ติดถาวร ได้ ( )ไม่มีการกลับจาก
หรือ ไปสู่ หรือ (ในโมเดลนี้ถือว่าถาวร)
วิธีทำ การคำนวณเชิงสัญลักษณ์ด้วย 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
ขั้นที่ 2 หา Jacobain matrix ด้วยคำสั่ง jacobian() ใน caracas
<-jacobian(Deri, list(S, J, R, V))
Jaco Jaco
ขั้นที่ 3 จุดดุลยภาพจากระบบสมการเชิงอนุพันธ์ด้วย
solve_sys(Deri, list(S, J, R, V))
SympifyError: S
ระบบสมการนี้ caracas ไม่สามารถแก้ได้
ถ้าวิเคราะห์เอง จะพบว่าระบบสมการจะเป็นศูนย์ เมื่อ I=0 ส่งผลตัวแปรอื่นๆ มีค่าเป็นอะไรก็ได้
คำนวณค่า
<- eigenval(Jaco) Eigen
ค่า eigenvalue มีค่าเท่ากับ 0 อยู่ 2 ค่า และ eigenvalue ตัวอื่นเท่ากับ
1]]$eigval Eigen[[
2]]$eigval Eigen[[
3]]$eigval Eigen[[
8.6 แบบฝึกหัดระบบสมการเชิงอนุพันธ์
8.6.1 I. วิเคราะห์เสถียรภาพ + Jacobian (เหมาะกับ caracas
)
ระบบ:
หาจุดสมดุล, Jacobian matrix, eigenvalue และวิเคราะห์เสถียรภาพระบบ:
หา Jacobian ที่จุดสมดุล และตรวจสอบเสถียรภาพระบบ:
หาจุดดุลยภาพ (เชิงตัวเลข), หา Jacobian โดยประมาณด้วยcaracas
ระบบ Lotka–Volterra:
ใช้caracas
เพื่อหา Jacobian ที่จุดสมดุล หาจุดตัด nullclines และวิเคราะห์ Jacobian ที่แต่ละจุด
8.6.2 II. วิเคราะห์ด้วย eigen()
หรือ caracas::eigenvals()
ให้ Jacobian:
หาค่า eigenvalues และวิเคราะห์ลักษณะ trajectoryเมตริกซ์ระบบ:
ใช้ eigen()
วิเคราะห์เสถียรภาพของจุดดุลยภาพ
เขียนระบบเป็นเมตริกซ์ แล้วใช้eigen()
วิเคราะห์จุดสมดุล หาค่า eigenvalues และประเภทของจุดดุลยภาพ
8.6.3 III. ใช้ phaseR
วิเคราะห์ flow field, nullclines, trajectory
ใช้phaseR::flowField()
และtrajectory()
จากจุด ใช้nullclines()
เพื่อหาจุดตัด และflowField()
เพื่อแสดงพฤติกรรม ใช้flowField()
เพื่อวิเคราะห์การกระจายของ trajectory วาด phase portrait พร้อม trajectory จากหลายจุดเริ่มต้น วาด nullclines + เส้นวิถีจากจุดเริ่มให้ระบบทั่วไป
เขียนฟังก์ชันใน R ที่รับ แล้วคำนวณ eigenvalues อัตโนมัติ หาค่า eigenvalue และใช้phaseR
วิเคราะห์ flowField