<- symbol("P")
P <- 100 -2*P
Qd Qd
2 พีชคณิตเบื้องต้น
2.1 ความสำคัญของพีชคณิตในเศรษฐศาสตร์
พีชคณิต (Algebra) เป็นรากฐานทางคณิตศาสตร์ที่มีความสำคัญอย่างยิ่งต่อการศึกษาวิชาเศรษฐศาสตร์ โดยเฉพาะเมื่อนักเศรษฐศาสตร์ต้องการ วิเคราะห์ ปรับเปลี่ยน หรือพยากรณ์พฤติกรรมทางเศรษฐกิจ ผ่านการตั้งสมมุติฐานและแบบจำลองทางปริมาณ
2.2 สมการเชิงเส้น (Linear Equations) ในการเศรษฐศาสตร์
วิธีทำ
แทนค่า P = 30 แล้วคำนวณ Q_d
subs(Qd, P, 30)
วิธีทำ
<- symbol("Q")
Q <- 100 -2*Q
TR TR
แทนค่า Q = 200แล้วคำนวณ TR
subs(Qd, P, 30)
วิธีทำ ตั้ง
<- symbol("P")
P <- 120 -3*P -(20+2*P)
Eq Eq
สามารถแก้สมการได้โดยใช้คำสั่ง solve_sys()
solve_sys(Eq,P)
P = 20
หรือแก้สมการเชิงเส้นตัวแปรเดียวได้โดยใช้ R จึงจำเป็นต้องการแปลง ตัวแปร Eq
ไปเป็นฟังก์ชันใน R แล้วใช้คำสั่ง uniroot()
และควรต้องทราบช่วงที่คำตอบอยู่ด้วยโดยอาศัยการวาดกราฟช่วย
# แปลงเป็นไปฟังก์ชันใน R
<- as_func(Eq)
Eq # วาดกราฟ Qd-Qs เพื่อหาช่วงที่มีคำตอบของสมการ
curve(Eq, from = 10, to = 30, col = "red",
xlab = "P", ylab = "Qd-Qs")
grid()
จากกราฟ ช่วงระหว่าง uniroot()
uniroot(Eq, lower = 10, upper = 30)$root
[1] 20
lower และ upper คือขอบเขตของการค้นหาคำตอบ
วิธีทำ สมการเชิงเส้นของต้นทุนรวม (Total Cost Function) ซึ่งเขียนอยู่ในรูปแบบทั่วไปของต้นทุนคือ:
โดยที่
= ต้นทุนรวม = ต้นทุนคงที่ (Fixed Cost) = ต้นทุนแปรผันต่อหน่วย (Variable Cost per unit) = ปริมาณที่ผลิต
จากโจทย์ที่ให้
คือ ต้นทุนคงที่ (FC) คือ ต้นทุนแปรผันต่อหน่วย (VC)
คำถาม 1: เมื่อลงมือผลิต
คำนวณต้นทุนรวมโดยแทน Q ลงในสมการ:
<- symbol("Q")
Q <- 500 +25*Q
TC subs(TC, Q, 40)
คำถาม 2: ต้นทุนคงที่คือเท่าใด?
ดูจากสมการได้เลย:
วิธีทำ
Y = รายได้ต่อวัน
W = ค่าจ้างรายชั่วโมง (บาท)
H = จำนวนชั่วโมงทำงาน (ชั่วโมง)
ในกรณีนี้ต้องแทน W และ H เท่ากับ 150 และ 8 ตามลำดับจึงใช้ฟังก์ชัน subs() ที่มี list ด้วย
<- symbol("W")
W <- symbol("H")
H <- W * H
Y # แทนค่า
subs(Y, list(W = 150, H = 8))
<- symbol("Q")
Q <- symbol("pi")
pi <- 70*Q -(30*Q +500)
pi pi
# แทนค่า Q = 20
subs(pi,Q, 20)
วิธีทำ คือ หาค่า
เราสามารถแก้สมการโดยใช้ caracas ได้โดย
<- symbol("x","positive" = TRUE)
x <- symbol("y","positive" = TRUE)
y <- 10*x + 20*y -200
eq # แก้ y ในรูปของ x
<- solve_sys(eq, y)
Sol 1]]$y Sol[[
ที่ใช้ Sol[[1]]$y
เพื่อให้สามารถแสดงผลเอกสาร HTML หรือ PDF ได้
ดังนั้น เราสามารถใช้่สมการแทนค่า
<- 2*(1:10)
x ::kable(data.frame(x = x, y =10-0.5*x)) knitr
x | y |
---|---|
2 | 9 |
4 | 8 |
6 | 7 |
8 | 6 |
10 | 5 |
12 | 4 |
14 | 3 |
16 | 2 |
18 | 1 |
20 | 0 |
คำสั่ง kable() จากชุดคำสั่ง knitr ทำให้แสดงค่าออกอยู่รูปของตารางได้ในเอกสารแบบ HTML หรือ PDF และที่กำหนดให้ x เป็นเลขคู่ ก็เพราะต้องการใช้ y เป็นจำนวนเต็ม
วิธีทำ
= ผลผลิต (Output) = จำนวนแรงงาน (Labor) = จำนวนทุน (Capital)
<- symbol("L")
L <- symbol("K")
K <- 5*L + 10*K
Q # แทนค่า L = 4, K = 6
subs(Q, list(L = 4, K = 6))
วิธีทำ
= มูลค่าส่งออก = มูลค่านำเข้า = รายได้แห่งชาติ (National Income) = ดุลการค้า
ขั้นตอนที่ 1: เขียนสมการ NX
<- symbol("Y")
Y <- 500 + 3*Y
X <- 200 + 2*Y
M <- X - M # ได้สมการ NX = 300 + Y
NX NX
ขั้นตอนที่ 2: เมื่อ
# แทนค่า Y = 100
subs(NX, Y, 100)
วิธีทำ สมการรายได้:
โดยที่:
คือการบริโภค คือการลงทุนต้องการหาค่า
ที่ทำให้ระบบสมดุล
ขั้นที่ 1 แทนค่าลงในสมการ
<- symbol("Y")
Y <- 100 + 0.8*Y
C <- 200
I <- Y - (C + I) # ตั้งสมการ: Y = C + I
eq eq
ขั้นที่ 2 แก้สมการ
solve_sys(eq, Y)
Y = 1500.00000000000
2.3 สมการไม่เชิงเส้น (Nonlinear Equations) ในเชิงเส้นในทางเศรษฐศาสตร์
ในทางเศรษฐศาสตร์ สมการไม่เชิงเส้น (Nonlinear Equations) พบได้บ่อยมาก โดยเฉพาะเมื่อพฤติกรรมเศรษฐกิจมีลักษณะซับซ้อน เช่น ดุลยภาพที่เปลี่ยนตามกำลังสอง, สมการอรรถประโยชน์, ฟังก์ชันการผลิตแบบ Cobb-Douglas, ฯลฯ
เราต้องแก้สมการ:
แต่ทางเศรษฐศาสตร์ ราคา (P) ไม่ควรติดลบ
ดังนั้น
<- symbol("P", "positive" = TRUE)
P <- 100 -5*P^2
Qd <- Qd -20 # ตั้ง Qd = 20
eq solve_sys(eq, P)
P = 4
<- symbol("L")
L <- symbol("K")
K
<- 10 * L^0.6 * K^0.4
Q <- subs(Q, K, 25)
Q_sub <- Q_sub - 200
eq solve_sys(eq, L)
L = 17.2354775202551
คำตอบ: ค่าของ
<- symbol("x")
x <- symbol("y")
y
<- x^0.5 * y^0.5
U <- subs(U, x, 4)
U_sub <- U_sub - 10
eq solve_sys(eq, y)
y = 25.0000000000000
คำตอบ: ค่าของ
<- symbol("t","positive" = TRUE)
t <- 100 * exp(0.1 * t)
Q <- Q - 200
eq solve_sys(eq, t)
t = 6.93147180559945
คำตอบ: เวลาที่ทำให้ผลผลิตเติบโตจาก 100 เป็น 200
2.4 เมตริกซ์ (Matrix)
เมตริกซ์ (Matrix) คือ การจัดเรียงตัวเลขหรือตัวแปรในรูปแบบตารางที่มี แถว (rows) และ คอลัมน์ (columns) โดยใช้สำหรับคำนวณทางคณิตศาสตร์ วิศวกรรม เศรษฐศาสตร์ และวิทยาศาสตร์ข้อมูล
2.4.1 รูปแบบทั่วไปของเมตริกซ์
เมตริกซ์
โดยที่
ตัวอย่างเมตริกซ์
หรือ
เมตริกซ์
หรือเมตริกซ์ขนาด
2.4.2 คำศัพท์ที่เกี่ยวข้อง
คำศัพท์ | ความหมาย |
---|---|
Elements | ตัวเลขหรือพจน์ที่อยู่ในเมตริกซ์ |
Order หรือ Size | ขนาดของเมตริกซ์: แถว × คอลัมน์ |
Square Matrix | เมตริกซ์ที่มีจำนวนแถว = คอลัมน์ |
Row Vector | เมตริกซ์ที่มีเพียง 1 แถว |
Column Vector | เมตริกซ์ที่มีเพียง 1 คอลัมน์ |
Zero Matrix | เมตริกซ์ที่ทุกองค์ประกอบเป็น 0 |
Identity Matrix | เมตริกซ์หน่วย เช่น |
2.4.3 การดำเนินการทางคณิตศาสตร์ (arithmetic operations)
แน่นอนครับ! ต่อไปนี้คือวิธีการทำ การดำเนินการทางคณิตศาสตร์ (arithmetic operations) สำหรับ เมตริกซ์ (matrix) ด้วยแพ็กเกจ caracas
ใน R ซึ่งรองรับทั้งเมตริกซ์เชิงสัญลักษณ์ (symbolic matrix) และเชิงตัวเลข (numeric matrix)
2.4.4 การสร้างเมตริกซ์
# สร้างเมตริกซ์ A เชิงสัญลักษณ์ด้วย caracas
<- matrix(c("a11", "a12", "a21", "a22"), nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
# สร้างเมตริกซ์ B เชิงตัวเลขด้วย caracas
<- matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE)
B <- as_sym(B)
B B
2.4.5 การบวก / ลบเมตริกซ์
# บวก
<- A + B
A_plus_B A_plus_B
# ลบ
<- A - B
A_minus_B A_minus_B
2.4.6 การคูณด้วยสเกลาร์
# คูณ A ด้วย 3
<- 3 * A
A_scaled A_scaled
2.4.7 การคูณเมตริกซ์ (Matrix Multiplication)
# A %*% B: เมตริกซ์คูณกันแบบมาตรฐาน
<- A %*% B
AB AB
ใช้ %*%
สำหรับ matrix multiplication แบบ linear algebra
2.4.8 ยกกำลังของเมตริกซ์ (Matrix Exponentiation) ด้วยคำสั่ง mat_pow()
# หาค่า A^2
<- mat_pow(A, pow = 2)
A2 A2
2.4.9 การทำ Transpose (เมตริกซ์ทรานสโพส) ด้วย t()
<- t(A)
A_t A_t
คำสั่ง t()
สามารถใช้ได้กับ เมตริกซ์เชิงตัวเลขปกติจาก R
2.4.10 การหาค่าเมตริกซ์ผกผันด้วย inv() และดีเทอร์มิแนนต์ด้วย det()
# หาดีเทอร์มิแนนต์
<- det(A)
det_A det_A
# หาตัวผกผัน (ถ้า det ≠ 0)
<- inv(A)
inv_A inv_A
คำสั่ง det()
เป็นคำสั่งมาตราฐานสำหรับตัวแปรแบบเมตริกซ์ใน R สำหรับการหาเมตริกซ์ผกผันสำหรับตัวแปรแบบเมตริกซ์ใน R คือคำสั่ง solve()
ในหนังสือเล่มนี้สนใจเมทริกซ์ ที่มีจำนวนแถวเท่ากับจำนวนคอลัมน์ เพราะเป็นเมตริกซ์ที่สามารถใช้แก้ระบบสมการเชิงเส้นได้ (Linear Systems of Equations)
คุณสมบัติของเมตริกซ์ที่สำคัญ สำหรับการใช้ในการแก้ ระบบสมการเชิงเส้น (Linear Systems of Equations) ซึ่งเป็นพื้นฐานสำคัญในคณิตศาสตร์และเศรษฐศาสตร์
2.4.11 คุณสมบัติของเมตริกซ์ที่ใช้แก้ระบบสมการเชิงเส้นได้
สมมติให้ระบบสมการเชิงเส้นมีรูปแบบ
คือเมตริกซ์สัมประสิทธิ์ขนาด คือเวกเตอร์ของตัวแปร คือเวกเตอร์คำตอบ
คุณสมบัติ | อธิบาย | เหตุผลที่สำคัญ |
---|---|---|
เป็นเมตริกซ์สี่เหลี่ยมจัตุรัส (Square Matrix) | เพื่อให้สามารถหาตัวผกผัน (Inverse) ได้ | |
ดีเทอร์มิแนนต์ไม่เป็นศูนย์ (Non-singular / |
เมตริกซ์ |
บอกว่า |
มีอันดับ (Rank) เท่ากับจำนวนตัวแปร | Rank( |
บอกว่าระบบมีคำตอบเฉพาะเจาะจง |
สามารถหาเมตริกซ์ผกผันได้ (Invertible Matrix) | ใช้แก้สมการด้วยสูตร |
|
ไม่เกิดความสัมพันธ์เชิงเส้นระหว่างแถวหรือคอลัมน์ (Linearly Independent) | แถวหรือคอลัมน์ของ |
ป้องกันระบบสมการไม่สมบูรณ์หรือไม่มีคำตอบแน่นอน |
ตัวอย่าง เมตริกซ์ที่สามารถใช้แก้สมการได้
เป็นเมตริกซ์
มีดีเทอร์มิแนนต์
0 มีตัวผกผัน ใช้แก้สมการได้
2.5 การแก้ไขค่าเมตริกซ์เชิงสัญลักษณ์
สามารถใช้การแทนค่าด้วยคำสั่ง subs() เช่น ต้องการแทนค่า
1,1] <- 0
A[ A
คำนวณค่า det(A) อีกครั้งจะได้
det(A)
ถ้า แทนค่า
2,2] <- symbol("z")
A[ A
det(A)
2.6 การแก้ระบบสมการเชิงเส้น (Solving a Linear System of Equations) ด้วยคำสั่ง solve_lin()
สามารถทำได้โดย
ตัวอย่าง
เขียนในรูป
# เมทริกซ์สัมประสิทธิ์
<- matrix(c(3, 1, 2, -1), nrow = 2)
A <- as_sym(A)
A A
# เวกเตอร์คำตอบ
<-matrix(c(16, 4), nrow = 2)
B <- as_sym(B)
B B
# แก้สมการ: A %*% X = B
<- solve_lin(A, B)
X X
คำตอบคือเมตริกซ์ 2×1 ที่แสดง
ถ้าต้องการผลลัพธ์ออกมาเป็นตัวเลข สามารถใช้คำสั่ง N()
N(X, digits = 3)
digits
คือจำนวนทศนิยมสูงที่ต้องการแสดง แต่ในตัวอย่างเป็นตัวเลขทศนิยมลงตัวแสดงผลแค่เพียง ทศนิยม 1 ตำแหน่ง
2.7 ตัวอย่างระบบสมการเชิงเส้น (Linear System of Equations) ในทางเศรษฐศาสตร์
2.7.1 การจัดสรรทรัพยากรการผลิต
มี 2 ปัจจัยการผลิต (แรงงาน
(ใช้แรงงานทั้งหมด) (ใช้ทุนทั้งหมด)
จัดสมการอยู่ในรูปเมทริกซ์คือ
<- matrix(c(3,2,4,1), nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
<- matrix(c(18,16), nrow = 2, byrow = TRUE)
b <- as_sym(b)
b b
solve_lin(A, b)
2.7.2 ตลาดดุลยภาพ 2 สินค้า (2x2 System)
กำหนเให้มี 2 สินค้า
เงื่อนไขดุลยภาพ:
รูปเมตริกซ์
ดังนั้น
สามารถใช้ caracas สร้างเมตริกซ์เชิงสัญลักษณ์ แล้วหาเมตริกซ์ผกผัน เพื่อหาคำตอบได้่ดังนี้
<- matrix(c(-5,1,0.5,-3),nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
<- matrix(c(-120,-90),nrow = 2, byrow = TRUE)
B <- as_sym(B)
B B
ดังนั้น
solve_lin(A, B)
หรือจะใช้
inv(A)%*%B
โดยตรงก็ได้
2.7.3 Leontief Input-Output Model (3x3 System)
ตัวอย่างเศรษฐกิจ 3 ภาค
การเกษตร, อุตสาหกรรม, บริการ
สมมุติว่าเมตริกซ์เทคโนโลยี
และเวกเตอร์ผลผลิตขั้นสุดท้าย เป็น:
ต้องการหาผลผลิตรวม
เราสามารถใช้ caracas สร้าง เมตริกซ์ diag()
ใน R แบบปกติ ร่วมกับคำสั่ง as_sym()
<- as_sym(diag(3))
I I
ดังนั้น
<- matrix(c(0.2,0.1,0.1,0.4,0.3,0.2,0.1,0.2,0.2),nrow = 3,byrow = TRUE)
A <- as_sym(A)
A A
<- matrix(c(100,200,150),nrow = 3,byrow = TRUE)
d <- as_sym(d)
d d
solve_lin(I-A,d)
2.7.4 โมเดลงบประมาณรัฐ (Government Budget System)
สมมุติ รัฐมี 3 ประเภทการใช้จ่าย: ด้านสาธารณสุข
เขียนในรูปสมการ
้น** คือ:
# สร้างเมตริกซ์ A
<- matrix(c(1, 1, 1, 1, -1.5, 0, 0, -2, 1), nrow = 3, byrow = TRUE)
A <- as_sym(A)
A A
# เวกเตอร์ b
<- matrix(c(1000, 0, 0), nrow = 3)
b <- as_sym(b)
b b
# แก้สมการ A * G = b
solve_lin(A, b)
จะได้ค่าของ
2.7.5 โมเดล IS-LM แบบง่าย
แม้โดยทั่วไป IS-LM เป็นสมการไม่เชิงเส้น แต่สามารถ linearize ได้รอบจุดดุลยภาพ เช่น:
แปลงให้อยู่ในรูปเชิงเส้น (linearized) ได้รอบจุดดุลยภาพ โดยใช้แบบจำลองง่าย คือรูปแบบ IS-LM แบบเชิงเส้น:
ซึ่งเป็นระบบสมการ 2 ตัวแปร:
1. จัดสมการ IS:
เขียนในรูปเมตริกซ์
# สร้างเมตริกซ์ A
<- 0.6; b <- 5; k <- 0.5; h <- 4
c <- matrix(c(1 - c, b, -k, h), nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
# สร้างเวกเตอร์ b
<- 200; G <- 300; MP <- 800
C0 <- matrix(c(C0 + G, MP), nrow = 2)
B <- as_sym(B)
B B
# แก้ระบบสมการ
solve_lin(A, B)
เราจะได้คำตอบของ
2.8 ระบบสมการไม่เชิงเส้น (Nonlinear Equation System)
ประกอบไปด้วย 1. สมการไม่เชิงเส้น (Nonlinear Equation) คือ สมการที่ความสัมพันธ์ของตัวแปรไม่เป็นเส้นตรง เช่น
ตัวแปรถูกยกกำลัง (ยกกำลังมากกว่า 1 หรือเป็นทศนิยม)
ตัวแปรคูณกันเอง
มีฟังก์ชันไม่เชิงเส้น เช่น
, ,
สร้างสมการเชิงสัญลักษณ์
<- symbol("x", "positive" = TRUE)
x <- x^2+3*x-5
f f
สามารถใช้คำสั่ง solve_sys()
แก้สมการหาคำตอบได้
<-solve_sys(f, x)
solution 1]]$x solution[[
<- symbol("x", "positive" = TRUE)
x <- exp(x)+x
f f
วาดกราฟ
<- as_func(f)
fxcurve(fx,from = 0,to = 2, col= "blue")
curve(5+0*x, from = 0, to = 2, add = TRUE, col = "red")
จากกราฟ คำตอบประมาณคือ 1.3
สามารถใช้คำสั่ง solve_sys()
แก้สมการหาคำตอบได้
<- solve_sys(f-5, x)
solution N(solution[[1]]$x)
c: 1.30655864103935
2. ระบบสมการไม่เชิงเส้น (Nonlinear System of Equations) คือ กลุ่มของสมการตั้งแต่ 2 สมการขึ้นไป ที่มีตัวแปรร่วมกัน และ อย่างน้อย 1 สมการเป็นสมการไม่เชิงเส้น
ลักษณะของระบบสมการไม่เชิงเส้น
มีตัวแปรตั้งแต่ 2 ตัวขึ้นไป
มีสมการตั้งแต่ 2 สมการขึ้นไป
ความสัมพันธ์ระหว่างตัวแปรมีลักษณะโค้งหรือซับซ้อน
การแก้สมการอาจมีคำตอบมากกว่า 1 คำตอบ หรือไม่มีเลย
ต้องใช้วิธีทางเชิงสัญลักษณ์หรือเชิงตัวเลขในการแก้
สร้างสมการเชิงสัญลักษณ์
<- symbol("x")
x <- symbol("y")
y <- x^2+y^2 -25
f1 <- x*y-12 f2
หาคำตอบในเชิงตัวแปร y เพื่อใช้วาดกราฟ
.1 <- solve_sys(f1,y)
solution# คำตอบที่ 1
.1[[1]]$y solution
# คำตอบที่ 2
.1[[2]]$y solution
.2 <- solve_sys(f2,y)
solution.2[[1]]$y solution
วาดกราฟ
.1 <- as_func(solution.1[[1]]$y)
fx1.2 <- as_func(solution.1[[2]]$y)
fx1<- as_func(solution.2[[1]]$y)
fx2
curve(fx1.1, from = -5, to = 5, ylim = c(-6, 6), col = "red", xlim = c(-6, 6),
ylab = "y", xlab = "x")
curve(fx1.2, from = -5, to = 5, add =TRUE , col ="red")
curve(fx2, from = -5, to = -0.0001, add = TRUE, , col ="blue")
curve(fx2, from = 0.0001, to = 5, add = TRUE, , col ="blue")
grid()
จะเห็นว่า มีคำตอบทั้่งหมด 4 คำตอบ
ในการใช้คำสั่งใน solve_sys()
ใน caracas จะต้องทำการรวมสมการทั้งสองด้วยคำสั่ง cbind()
ก่อน และอย่าลืม ใช้ list()
จะสามารถหาคำตอบได้ดังนี้
solve_sys(cbind(f1, f2), list(x, y))
Solution 1:
x = -4
y = -3
Solution 2:
x = -3
y = -4
Solution 3:
x = 3
y = 4
Solution 4:
x = 4
y = 3
สร้างสมการเชิงสัญลักษณ์
<- symbol("x")
x <- symbol("y")
y <- log(x)+y-3
f1 f1
<- exp(y)+x-6
f2 f2
หาคำตอบในเชิงตัวแปร y เพื่อใช้วาดกราฟ
.1 <- solve_sys(f1,y)
solution.1[[1]]$y solution
จะเห็นว่า x ต้องการกว่าศูนย์เท่านั้น
.2 <- solve_sys(f2,y)
solution.2[[1]]$y solution
คำตอบของสมการนี้ ค่า x ไม่เกิน 6 เท่านั้น ดังนั้น เมื่อนำช่วงทั้ง 2 มา intersection กันจะได้
ลองวาดกราฟ
<- as_func(solution.1[[1]]$y)
fx1 <- as_func(solution.2[[1]]$y)
fx2
curve(fx1, from = 0.0001, to = 5.999, col = "red", ylab ="y", xlab ="x", ylim= c(-1,12))
curve(fx2, from = 0.0001, to = 5.999, col = "blue",add = TRUE)
grid()
จากกราฟ จะพบว่า ระบบสมการนี้ไม่มีคำตอบ
สร้างสมการเชิงสัญลักษณ์
<- symbol("L")
L <- symbol("K")
K <- sqrt(L)*sqrt(K)-20
Q Q
แทนค่า
<- subs(Q, K, 2*L)
Q Q
ค่า
<- as_func(Q)
fx # กราฟ Q
curve(fx, from = 0, to = 30, xlab = "L", ylab = "Q", col = "red")
# กราฟ y = 0
curve(0 + 0*x, from = 0, to = 30, xlab = "L", ylab = "Q", col = "blue", add = TRUE)
grid()
จากกราฟ ระบบสมการนี้มีคำตอบ
<- solve_sys(Q,L)
solution 1]]$L solution[[
สร้างสมการเชิงสัญลักษณ์
<- symbol("x")
x <- symbol("y")
y <- sin(x)+y-1
f1 f1
<- x^2+y^2 -2
f2 f2
แก้สมการ f1 และ f2 เพื่อวาดกราฟ
<-solve_sys(f1,y)
solution.f1 1]]$y solution.f1[[
f2 เป็นสมการกำลัง ต้องมี 2 คำตอบ
<-solve_sys(f2,y)
solution.f2 1]]$y solution.f2[[
2]]$y solution.f2[[
<- as_func(solution.f1[[1]]$y)
fx1 .1 <- as_func(solution.f2[[1]]$y)
fx2.2 <- as_func(solution.f2[[2]]$y)
fx2curve(fx1, from = -sqrt(2), to = 1.5, col = "red", ylim = c(-2, 2), xlab = "x", ylab = "y")
curve(fx2.1, from = -sqrt(1.999999), to = sqrt(1.999999), col = "blue", add = TRUE)
curve(fx2.2, from = -sqrt(1.999999), to = sqrt(1.999999), col = "blue", add = TRUE)
grid()
จากกราฟ จะเห็นว่า ระบบสมการนี้มี 2 คำตอบ
solve_sys(cbind(f1,f2), list(x, y))
could not solve y - sin(sqrt(2 - y**2)) - 1
จะพบว่า ระบบสมการนี้ caracas แก้สมการนี้ไม่ได้ต้องใช้ต้องใช้คำสั่งอื่นๆในอาร์ ในหนังสือเล่มนี้ เลือกใช้ ชุดคำสั่ง nleqslv
โดยนี้โค้ดดังนี้
library(nleqslv)
# นิยามระบบสมการ
<- function(vars) {
f <- vars[1]
x <- vars[2]
y c(sin(x) + y - 1,
^2 + y^2 - 2)
x
}# ค่าเริ่มต้นกราฟ เลือกที่ใกล้คำตอบ จุดแรก
<- c(-.5, 1)
start # แก้สมการ
<- nleqslv(start, f)
sol $x sol
[1] -0.3727731 1.3641995
# ค่าเริ่มต้นกราฟ เลือกที่ใกล้คำตอบ จุดที่2
<- c(1.2, 0)
start # แก้สมการ
<- nleqslv(start, f)
sol $x sol
[1] 1.41416057 0.01224232
2.9 เวกเตอร์เฉพาะ (Eigenvector) และค่าเฉพาะ (Eigenvalue)
การคำนวณเชิงสัญลักษณ์ด้วย caracas
ตัวอย่าง
โจทย์:
หาค่า eigenvalues และ eigenvectors ของเมทริกซ์
# สร้างเมทริกซ์ A
<- matrix(c(2, 1,1, 2), nrow = 2, byrow = TRUE)
A # ถ้าไม่กำหนด A เป็นตัวแปรจะไม่สามารถ คำนวณด้วยcaracas ได้
<- as_sym(A)
A A
# นิยาม lambda (ค่าเฉพาะ)
<- symbol("lambda_")
lambda# หา Determinant ของ (A - lambda * I)
<- diag(1, 2) # I คือ Identity Matrix 2x2
I <- as_sym(I) I
<-det(A - lambda* I)
char_eq char_eq
# แก้สมการ characteristic equation เพิ่อหา eigenvalues
<- solve_sys(char_eq, lambda)
eigenvals 1]]$lambda eigenvals[[
2]]$lambda eigenvals[[
# สมมติเอาค่าเฉพาะค่าแรกมาแทนหา eigenvector
<- eigenvals[[1]]$lambda # ดึงค่าแรก
lambda # สร้างระบบสมการ (A - lambda1 * I) * v = 0
<- as_sym(c("v1", "v2"))
V # สมการคือ (A - lambda1*I) %*% v = 0
<- (A - lambda*I) %*% V
eqs # แก้สมการหาเวกเตอร์เฉพาะ
<- solve_sys(eqs, V)
eigenvec1 1]]$v1 eigenvec1[[
ความหมายของคำตอบคือ ที่ค่าเฉพาะ
# สมมติเอาค่าเฉพาะค่าที่สองมาแทนหา eigenvector
<- eigenvals[[2]]$lambda # ดึงค่าแรก
lambda # สร้างระบบสมการ (A - lambda1 * I) * v = 0
<- as_sym(c("v1", "v2"))
V # สมการคือ (A - lambda1*I) %*% v = 0
<- (A - lambda*I) %*% V
eqs # แก้สมการหาเวกเตอร์เฉพาะ
<- solve_sys(eqs, V)
eigenvec2 1]]$v1 eigenvec2[[
ความหมายของคำตอบคือ ที่ค่าเฉพาะ
การคำนวณค่าเฉพาะและเวคเตอร์เจาะจงในตัวอย่างที่ผ่านมา จะการทดแทนการทำควณด้วยมือ เมื่อให้เกิดความเข้าใจในขั้นตอนการคำนวณ ถ้าเชี่ยวชาญดีแล้วสามารถใช้คำสั่งของ caracas โดยตรงเพื่อให้ได้ค่าเฉพาะและเวคเตอร์เจาะจงได้เลย คือ
eigenval()
สำหรับหาค่าเฉพาะeigenvec()
สำหรับหาค่าเวคเตอร์เจาะจง
เช่น จากตัวอย่างเมตริกซ์ A ที่ผ่านมา
eigenval(A)
[[1]]
[[1]]$eigval
c: 3
[[1]]$eigmult
[1] 1
[[2]]
[[2]]$eigval
c: 1
[[2]]$eigmult
[1] 1
ความหมายของผลลัพธ์
[[1]]$eigval
: Eigenvalue ตัวแรกคือ3
[[1]]$eigmult
: Eigenvalue ตัวนี้มีความซ้ำ (multiplicity) เท่ากับ 1[[2]]$eigval
: Eigenvalue ตัวที่สองคือ1
[[2]]$eigmult
: ตัวนี้ก็มี multiplicity = 1 เช่นกัน
eigenvec(A)
[[1]]
[[1]]$eigval
c: 1
[[1]]$eigmult
[1] 1
[[1]]$eigvec
c: [-1 1]ᵀ
[[2]]
[[2]]$eigval
c: 3
[[2]]$eigmult
[1] 1
[[2]]$eigvec
c: [1 1]ᵀ
ความหมายของผลลัพธจากคำสั่ง eigenvec()
ลำดับ | Eigenvalue ( |
Eigenvector ( |
Multiplicity |
---|---|---|---|
1 | 1 | 1 | |
2 | 3 | 1 |
2.9.1 การประยุกต์ใช้ Eigenvalue และ Eigenvector ในทางเศรษฐศาสตร์
2.9.1.1 แบบจำลองการผลิตแบบ Leontief (Input-Output Model)
ตัวอย่างการคำนวณเชิงสัญลักษณ์ กำหนดเมทริกซ์เทคนิคการผลิต:
ตรวจสอบว่าเศรษฐกิจนี้เสถียรหรือไม่ โดยดูจาก largest eigenvalue ของ A
# สร้างเมตริกซ์ A
<- matrix(c(0.3, 0.2,
A 0.4, 0.1), nrow = 2, byrow = TRUE)
# เปลี่ยนเป็นตัวแปรเชิงสัญลักษณ์
<- as_sym(A)
A A
# สร้างแปร lambda
<- symbol("lambda_")
lambda# สร้างเมตริกซ์เอกลักษณ์ I แบบสัญลักษณ์
<- diag(1, 2)
I <- as_sym(I)
I I
# สร้างสมการ (A-lambda*I) เชิงสัญลักษณ์
<- det(A - lambda*I)
char_eq char_eq
## คำตอบมีแค่ 2 ค่า
factor_(char_eq)
# แก้สมการ
<- solve_sys(char_eq, lambda)
eigenvals 1]]$lambda eigenvals[[
2]]$lambda eigenvals[[
ถ้า largest eigenvalue
ระบบผลิตมีเสถียรภาพถ้า
ระบบจะขยายตัวไม่สิ้นสุด (ไม่เสถียร)
จากสมการ ค่า
2.9.1.2 การวิเคราะห์การเปลี่ยนผ่านของระบบเศรษฐกิจ (Markov Chain)
ตัวอย่างการคำนวณ พิจารณาเมทริกซ์การเปลี่ยนผ่านของระดับรายได้
หาค่าสถานะสมดุล (stationary distribution) โดยแก้
# สร้างตัวแปรเชิงสัญลักษณ์
<- matrix(c(0.8, 0.2, 0.4, 0.6), nrow = 2, byrow = TRUE)
P <- as_sym(P)
P P
<- as_sym(c("pi1", "pi2"))
pi pi
# สมการ: pi * P = pi $\rightarrow$ transpose ทั้งสองข้าง
<- t(P) %*% pi - pi
eqs eqs
<-solve_sys(eqs, pi)
sol 1]]$pi1 sol[[
แทนค่า
subs(pi,pi[1], 2*pi[2])
จากเงื่อนไข
sum(subs(pi,pi[1], 2*pi[2]))-1
<- solve_sys(sum(subs(pi,pi[1], 2*pi[2]))-1, pi[2])
sol 1]]$pi2 sol[[
จาก
คำตอบคือ stationary distribution หรือความน่าจะเป็นของแต่ละสถานะในระยะยาว
rm(pi)
ตรวจสอบ
pi
[1] 3.141593
2.9.1.3 การวิเคราะห์การเติบโตทางเศรษฐกิจ (Growth Models)
ตัวอย่างการคำนวณ ระบบเศรษฐกิจที่มีการเปลี่ยนแปลงแบบ:
วิเคราะห์เสถียรภาพด้วย eigenvalue
# สร้างเมตริกซฺสัญลักษณ์ A
<- matrix(c(0.1, 0.05, 0.02, 0.08), nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
# สร้างเมตริกซฺสัญลักษณ์ lambda
<- symbol("lambda_")
lambda# สร้างเมตริกซ์เอกลักษณ์
<- diag(1, 2) |> as_sym()
I <- as_sym(I)
I I
# สร้างสมการ det(A)-lambda*I =0
<- det(A - lambda* I)
char_eq char_eq
## คำตอบมีแค่ 2 ค่า
factor_(char_eq)
<- solve_sys(char_eq, lambda)
eigenvals 1]]$lambda eigenvals[[
2]]$lambda eigenvals[[
ถ้า eigenvalues มีค่าบวก
ถ้าค่าลบ
ไม่มีค่าเฉพาะที่เป็นลบ แสดงว่า “unstable”
2.9.1.4 แบบจำลองใน Game Theory
ตัวอย่างการคำนวณ พิจารณาเกมแบบ 2 ผู้เล่นที่มีเมทริกซ์ผลตอบแทน (payoff matrix):
ต้องการวิเคราะห์ว่า กลยุทธ์เสถียร (stable strategy) อยู่ตรงไหน โดยพิจารณาทิศทางที่ระบบมีแนวโน้มจะเคลื่อนที่เข้าไปหาในระยะยาว
# สร้างเมตริกซ์สัญลักษณ์ A
<- matrix(c(2, -1, -1, 2), nrow = 2, byrow = TRUE)
A <- as_sym(A)
A A
# สร้างตัวแปร lambdaและเมติกซ์เอกลักษณ์
<- symbol("lambda_")
lambda<- diag(1, 2) |> as_sym()
I <- as_sym(I)
I I
# สร้างสมการ det(A-lambda*I) =0
<- det(A - lambda* I)
char_eq char_eq
## คำตอบมีแค่ 2 ค่า
factor_(char_eq)
<- solve_sys(char_eq, lambda)
eigenvals 1]]$lambda eigenvals[[
2]]$lambda eigenvals[[
จากการคำนวณได้ eigenvalues คือ
ผลการวิเคราะห์:
บวก บวก
ดังนั้น ระบบไม่เสถียร (Unstable)
แปลว่า: ถ้ามี perturbation เล็กๆ (การเบี่ยงเบนเล็กน้อย) ระบบจะเคลื่อน หนีออกจากดุลยภาพ ไม่ได้เคลื่อนกลับเข้าไปหาเอง
2.9.1.5 การกระจายพลังอำนาจทางเศรษฐกิจ (Power Index / Ranking)
ตัวอย่างการคำนวณ พิจารณา network ของประเทศ 3 ประเทศที่มีความเชื่อมโยงทางการค้า (Trade Influence): สมมติความสัมพันธ์การค้า (Trade Influence)
ประเทศ A ส่งออก ไปยัง B และ C
ประเทศ B ส่งออก ไปยัง A และ C
ประเทศ C ส่งออก ไปยัง A และ B
ตารางแสดงการเชื่อมโยง
A | B | C | |
---|---|---|---|
A | 0 | 1 | 1 |
B | 1 | 0 | 1 |
C | 1 | 1 | 0 |
- ค่า 1 หมายถึง มีการเชื่อมโยง
- ค่า 0 หมายถึง ไม่มีการเชื่อมโยงกับตัวเอง
เขียนเป็นเมทริกซ์
โดยที่
แถว 1 คือ ประเทศ A
แถว 2 คือ ประเทศ B
แถว 3 คือ ประเทศ C
และ
คอลัมน์ 1 คือ ประเทศ A
คอลัมน์ 2 คือ ประเทศ B
คอลัมน์ 3 คือ ประเทศ C
ต้องการหาว่า ประเทศใดมีความสำคัญที่สุด ในเครือข่าย โดยใช้ eigenvector centrality
# สร้างเมตริกซสัญลักษณ์ C
<- matrix(c(0, 1, 1,
C 1, 0, 1,
1, 1, 0), nrow = 3, byrow = TRUE)
<- as_sym(C)
C C
# สร้างสัญลักษณ์ lambda และเมตริกซ์เอกลักษณ์ 3x3
<- symbol("lambda_")
lambda<- diag(1, 3)
I <- as_sym(I)
I I
# สร้างสมการ det(C)- lambda*I =0
<- det(C - lambda* I)
char_eq char_eq
## คำตอบมีแค่ 2 ค่า
factor_(char_eq)
c: 2
-(λ - 2)⋅(λ + 1)
# หาค่า eigenvector
<- solve_sys(char_eq, lambda)
eigenvals 1]]$lambda eigenvals[[
2]]$lambda eigenvals[[
# เลือกค่า eigenvalue ใหญ่สุดมาหา eigenvector
<- as_sym(paste0("v",1:3))
V <- (C - eigenvals[[2]]$lambda*I) %*% V
eqs eqs
# แก้สมการหาค่า V
<- solve_sys(eqs, V)
sol1]]$v1 sol[[
1]]$v2 sol[[
จากผลการคำนวณพบว่า
แน่นอนครับ! ต่อไปนี้คือแบบฝึกหัดพีชคณิตในเศรษฐศาสตร์ 20 ข้อเรียงเป็นรายการ (list) ที่ไม่ซ้ำกับในไฟล์ของคุณ:
2.10 แบบฝึกหัดพีชคณิตในเศรษฐศาสตร์
ให้ใช้ caracasในการหาคำตอบ
สมการอุปทานคือ
จงหาปริมาณอุปทานเมื่อราคาสินค้าเท่ากับ 10สมการต้นทุนคือ
จงหาต้นทุนเมื่อผลิต 30 หน่วยสมการรายได้รวมคือ
จงหาค่ารายได้รวมเมื่อให้กำไร
โดย , จงหากำไรเมื่อสมการดุลยภาพ:
, โดย , จงหาราคาและปริมาณดุลยภาพรายได้เฉลี่ย (AR) คือ
, โดย จงหาค่า AR เมื่อถ้าต้นทุนเฉลี่ยคือ
, โดย จงหาค่า AC เมื่อให้
, จงเขียนสมการกำไร และหาค่ากำไรเมื่อผู้ผลิตมีฟังก์ชันอุปสงค์
จงหาค่าราคาเมื่อฟังก์ชันผลผลิตคือ
จงหาค่า เมื่อ ,ให้สมการอรรถประโยชน์
จงหาค่า เมื่อ ,พิจารณาสมการ
จงหาค่ารายได้รวมเมื่อให้ต้นทุนเพิ่ม (MC) คือ
จงหาค่า MC เมื่อฟังก์ชันราคาคือ
จงหาค่าราคาสินค้าเมื่อปริมาณขายคือ 30 หน่วยผู้บริโภคมีฟังก์ชันอรรถประโยชน์
จงหาค่า เมื่อ ,ให้
จงหาต้นทุนเมื่อฟังก์ชันการผลิตคือ
จงหาค่า เมื่อพิจารณาสมการ
จงหาค่ารายได้เมื่อหาก
, จงหาค่ากำไร เมื่อหากฟังก์ชันอุปสงค์คือ
, โดย , จงเขียนสมการ Q แล้วหาค่า Q เมื่อ