library(caracas)
5 การหาค่าสูงสุด/ต่ำสุดภายใต้ข้อจำกัด (Constrained Optimization)
5.1 บทนำ
ในทางเศรษฐศาสตร์ นักเศรษฐศาสตร์มักต้องการหาค่า สูงสุด (maximize) หรือ ต่ำสุด (minimize) ของฟังก์ชัน เช่น:
ผู้บริโภค: ต้องการเพิ่มอรรถประโยชน์สูงสุด ภายใต้ข้อจำกัดงบประมาณ
ผู้ผลิต: ต้องการลดต้นทุนให้น้อยที่สุด ภายใต้ข้อจำกัดการผลิต
ปัญหานี้เรียกว่า Constrained Optimization
วิธีแก้ปัญหาหลักคือ Lagrange Multiplier Method หรือภาษาไทยเรียกว่า ตัวคูณลากรองช์
ก่อนที่จะกล่าวถึงหัวข้อตัวคูณลากรองซ์ ในบทที่ 2 ผู้อ่านได้เรียนรู้ถึงการประยุกต์อนุพันธ์ เพื่อหาค่าสูงสุด/ต่ำสุดของฟังก์ชันมาแล้ว ในบทนี้จะมีตัวแปรตั้งแต่ 2 ตัวขึ้นทำให้ ผู้อ่านต้องการเรื่องหาอนุพันธ์บางส่วนของฟังก์ชันก่อน
5.2 อนุพันธ์บางส่วน (Partial Derivative)
ตัวอย่าง
ให้ \(f(x,y) = x^2 + xy + y^2\) อนุพันธ์บางส่วนของ \(f\) ตาม \(x\): \[\frac{\partial f}{\partial x} = 2x + y\] เพราะถือว่า \(y\) เป็นค่าคงที่
อนุพันธ์บางส่วนของ \(f\) ตาม \(y\): \[\frac{\partial f}{\partial y} = x + 2y\] เพราะถือว่า \(x\) เป็นค่าคงที่
5.3 เกรเดียนต์ (Gradient)
เกรเดียนต์ คือ เวกเตอร์ที่รวมอนุพันธ์บางส่วนทั้งหมดของฟังก์ชัน เข้าด้วยกัน
จากตัวอย่างที่ผ่านมา \(f(x,y) = x^2 + xy + y^2\) เกรเดียนต์ คือ: \[\nabla f(x,y) = (2x + y, x + 2y)\] เป็นเวกเตอร์ 2 มิติ
คุณสมบัติสำคัญของเกรเดียนต์
คุณสมบัติ | อธิบาย |
---|---|
ทิศทาง | ชี้ไปในทิศทางที่ \(f\) เพิ่มขึ้นเร็วที่สุด |
ความยาว (norm) | บอกอัตราความชัน หรือความเร็วของการเพิ่มขึ้น |
ถ้า \(\nabla f = 0\) | จุดนั้นอาจเป็น maximum, minimum, หรือ saddle point (critical point) |
5.4 การคำนวณเชิงสัญลักษณ์ของอนุพันธ์บางส่วนด้วย caracas
- เรียกใช้ชุดคำสั่ง caracas
จากตัวอย่าง \(f(x,y) = x^2 + xy + y^2\) สามารถสร้างได้ดังนี้
- กำหนดตัวแปรและฟังก์ชันที่ต้องการ
<- symbol("x")
x <- symbol("y")
y <- x^2+x*y+y^2
f f
\[x^{2} + x y + y^{2}\]
- หาอนุพันธ์บางส่วนด้วยฟังก์ชัน
der()
หา \(\frac{\partial f}{\partial x}\)
der(f, x)
\[2 x + y\]
หา \(\frac{\partial f}{\partial y}\)
der(f, y)
\[x + 2 y\]
ส่วนคำนวณเกรเดียนต์ด้วย caracas ก็ยังใช้คำสั่ง der()
เช่นเดิม แต่เปลี่ยนกับใส่ตััวแปรให้อยู่ในของ list แทน และแสดงผลในรูปของเมตริกซ์ขนาด \(1\times n\) โดยที่ \(n\) คือ จำนวนตัวแปรในฟังก์ชัน เช่น ตัวอย่างที่ผ่านมาฟังก์ชัน f ตัวแปร \(x\) และ \(y\)
der(f, list(x,y))
\[\left[\begin{matrix}2 x + y & x + 2 y\end{matrix}\right]\]
5.4.1 การสร้างตัวแปรเป็นจำนวนมากด้วย caracas
ในหลายๆปัญหาทางเศรษฐศาสตร์ นิยมสร้างตัวเป็นลำดับ (sequence) เช่น \(x_1, x_2, \cdots, x_10\) เป็นต้น ถ้าต้องการสร้างตัวแปรลักษณะนี้ด้วย caracas สามารถทำได้ ด้วยคำสั่ง as_sym()
สามารถเปลี่ยนเวคเตอร์และเมตริกซ์ในอาร์ เป็นตัวแปรของ caracas ได้
# สร้างเวคเตอร์ p เก็บค่า p1 .. p5
<- paste0("p", 1:5)
p # เปลี่ยนเวคเตอร์เป็นตัวแปร caracas ด้วย as_sym()
<- as_sym(p)
p <- -sum(p*log(p))
entropy entropy
\[- p_{1} \log{\left(p_{1} \right)} - p_{2} \log{\left(p_{2} \right)} - p_{3} \log{\left(p_{3} \right)} - p_{4} \log{\left(p_{4} \right)} - p_{5} \log{\left(p_{5} \right)}\]
ทดลองหาค่าเกรเดียนต์
der(entropy, p)
\[\left[\begin{matrix}- \log{\left(p_{1} \right)} - 1 & - \log{\left(p_{2} \right)} - 1 & - \log{\left(p_{3} \right)} - 1 & - \log{\left(p_{4} \right)} - 1 & - \log{\left(p_{5} \right)} - 1\end{matrix}\right]\]
5.5 การหาค่าสูงสุด/ต่ำสุดของฟังก์ชันและไม่มีข้อจำกัด (Unconstrained Optimization)
หัวข้อนี้ฟังก์ชันจะต้องมีตั้งแต่ 2 ตัวแปรขึ้นไปมีขั้นตอนการทำดังนี้
กำหนดปัญหา (Problem Statement) โดยระบุชัดเจนว่าเราต้องการหา
ค่ามากที่สุด (Maximize) หรือ
ค่าน้อยที่สุด (Minimize)
ของฟังก์ชัน \(f(x)\) หรือ \(f(x,y)\) หรือหลายตัวแปร
ตัวอย่าง \[ \text{maximize} \quad f(x,y) = 5x + 4y - x^2 - y^2 \]
หา First-Order Conditions (FOC) โดย
หา อนุพันธ์ ลำดับที่ 1 ของ \(f\) ตามตัวแปรทุกตัว
ตั้งสมการว่า อนุพันธ์เท่ากับศูนย์ (Critical Points)
กรณี 1 ตัวแปร:
\[
f'(x) = 0
\]
กรณีหลายตัวแปร:
\[
\frac{\partial f}{\partial x} = 0, \quad \frac{\partial f}{\partial y} = 0
\] (หรือถ้ามี 3 ตัวแปรก็ครบ 3 สมการ)
หมายเหตุ: จุดที่อนุพันธ์เป็นศูนย์ คือ จุดที่อาจเป็นจุดสูงสุดหรือต่ำสุด (critical point)
แก้สมการหา Critical Points
- แก้สมการที่ได้จากข้อ 2 เพื่อหา \(x\), \(y\) (หรือ ตัวแปรอื่น ๆ)
(ถ้าไม่ใช้โปรแกรมช่วย ในประสบการณ์ผู้เขียน นักส่วนใหญ่ทำได้ แต่มักแก้สมการผิด)
- ตรวจสอบลักษณะจุด (Second-Order Conditions - SOC)
- สรุปผล ระบุว่า Critical Point ที่หาได้ เป็น maximum หรือ minimum หรือเป็น saddle point (ถ้าไม่แน่นอน)
5.5.1 สรุปขั้นตอนการคำนวณ
ขั้นตอน | ทำอะไร | หมายเหตุ |
---|---|---|
1 | กำหนดปัญหา | maximize หรือ minimize ฟังก์ชันไหน |
2 | หา FOC | ตั้งอนุพันธ์ = 0 |
3 | แก้หา Critical Points | ได้ค่า \(x, y\) |
4 | ตรวจสอบ SOC | ด้วย \(f''\) หรือ Hessian |
5 | สรุปผลลัพธ์ | ว่าเป็นจุดสูงสุด/ต่ำสุดหรือไม่ |
จากโจทย์ตัวอย่าง
หา maximum/minimum ของ \(f(x,y) = 3x^2 + 2xy + y^2 - 4x - 5y\)
ตามขั้นตอน 1. หาอนุพันธ์หรือเกรเดียนต์ \[\begin{aligned} \frac{\partial f}{\partial x} =& 6x + 2y - 4\\ \frac{\partial f}{\partial y} =& 2x + 2y - 5 \end{aligned}\]
ตั้ง FOC: \[\begin{aligned} 6x + 2y - 4 =& 0\\ 2x + 2y - 5 =& 0 \end{aligned}\]
แก้ระบบสมการ \(\rightarrow\) ได้ \(x=-1/4, y =11/4)\)
ตรวจ Hessian: \[H = \begin{bmatrix} 6 & 2 \\ 2 & 2 \end{bmatrix}\]
\(\rightarrow\) คำนวณ determinant > 0 และ \(\frac{\partial^2 f}{\partial x^2} = 6 > 0\)
- สรุปผล เป็น minimum
กว่าจะได้คำตอบเหนื่อยจัง ถูกรึเปล่าก็ยังไม่รู้
5.5.2 การทำ 4 ขั้นตอนแรกด้วย caracas
- สร้างฟังก์ชัน \(f(x,y) = 3x^2 + 2xy + y^2 - 4x - 5y\)
<- symbol("x")
x <- symbol("y")
y # สร้างฟังก์ชัน หาค่าต่ำสุดของ f
<- 3*x^2 + 2*x*y + y^2 - 4*x - 5*y
min_f min_f
\[3 x^{2} + 2 x y - 4 x + y^{2} - 5 y\]
- ตั้ง FOC: ด้วยการหาเกรเดียนต์ด้วย
der()
<- der(min_f, list(x,y))
Gmin_f Gmin_f
\[\left[\begin{matrix}6 x + 2 y - 4 & 2 x + 2 y - 5\end{matrix}\right]\]
- แก้สมการหา Critical Points ด้วยคำสั่ง
solve_sys()
solve_sys(Gmin_f, list(x,y))
Solution 1:
x = -1/4
y = 11/4
- ตรวจสอบคำตอบด้วย Hessian Matrix ถ้าใช้ caracas มีฟังก์ชันชื่อ
hessian()
ช่วยหา
# หา hessian จากฟังก์ชันข้อ 1 โดยตั้งชื่อ hes.M
<-hessian(min_f, list(x, y))
hes.M hes.M
\[\left[\begin{matrix}6 & 2\\2 & 2\end{matrix}\right]\]
ค่า diagonal ทุกตัวมากกว่า 0
- หาค่า det เพื่อสรุปผล
det(hes.M)
\[8\]
ดีเทอมิแนนท์มีค่ามากกว่า 0 แสดงว่าเป็นจุดต่ำสุด
ที่จุด \(f(-1/4,11/4)\) มีค่าต่ำสุดเท่ากับ
subs(min_f, list(x = -1/4, y =11/4))
\[-6.375\]
ลองวาดแผนภาพเส้นชั้นความสูง (contour plot) ด้วยอาร์ด้วย ggplot2
# เปลี่ยนฟังก์ชันจาก caracas เป็น ฟังก์ชันใน R ด้วย as_func()
<- as_func(min_f)
plot.f # โหลดแพ็กเกจที่จำเป็น
library(ggplot2)
# กำหนดช่วงของ x และ y
<- seq(-5, 5, length.out = 100)
x <- seq(-5, 7, length.out = 100)
y
# สร้างตารางค่าที่จะใช้วาด
<- expand.grid(x = x, y = y)
grid
# คำนวณค่าฟังก์ชัน f(x,y)
$z <- plot.f(grid$x,grid$y)
grid
# วาดกราฟ contour
ggplot(grid, aes(x = x, y = y, z = z)) +
geom_contour_filled() + # วาด contour แบบมีไล่สี
labs(title = "Contour Plot of f(x,y)",
x = "x",
y = "y",
fill = "f(x,y)") +
theme_classic(base_size = 14)+
theme(text = element_text(family = "TH Sarabun New", size = 16)) +
annotate(geom = "text",x = -1/4, y =11/4, label = "X", size =8)
ถ้าผู้อ่านสนใจการวาดกราฟด้วยอาร์สามารถศึกษาได้จาก การสร้างภาพนิทัศน์ด้วยภาษาอาร์
สำหรับผู้อ่านจาก HTML book จะเห็นกราฟแบบ interactive
# ติดตั้ง plotly ถ้ายังไม่มี
# install.packages("plotly")
library(plotly)
# สร้างข้อมูล
<- seq(-5, 7, length.out = 50)
x_seq <- seq(-5, 7, length.out = 50)
y_seq
<- outer(x_seq, y_seq, function(x, y) {
z_matrix 3*x^2 + 2*x*y + y^2 - 4*x - 5*y
})# วาด surface plot แบบ interactive
plot_ly(
x = ~x_seq, y = ~y_seq, z = ~z_matrix
|>
) add_surface() |>
layout(
title = "Surface Plot of f(x,y)",
scene = list(
xaxis = list(title = "X"),
yaxis = list(title = "Y"),
zaxis = list(title = "f(x,y)")
) )
5.5.3 ตัวอย่างการหาค่าสูงสุดต่ำสุดโดยไม่มีข้อจำกัดในทางเศรษฐศาสตร์เพิ่มเติม
โดยใช้การคำนวณเชิงสัญลักษณ์และวาดกราฟประกอบ
5.6 การหาค่าสูงสุด/ต่ำสุดของฟังก์ชันและมีข้อจำกัด (Constrained Optimization)
เพราะเศรษฐศาสตร์เกี่ยวข้องกับ “การเลือกภายใต้ข้อจำกัด” (Choice under Scarcity)
เศรษฐศาสตร์ศึกษา “การเลือก” (choice) ที่เกิดขึ้นเพราะ ทรัพยากรมีจำกัด (scarcity)
ทุกการตัดสินใจทางเศรษฐกิจ — เช่น การบริโภค การผลิต การลงทุน การกำหนดราคาสินค้า — ล้วนเกิดขึ้นภายใต้ ข้อจำกัด:
รายได้จำกัด (budget constraint)
ต้นทุนการผลิต
เวลาจำกัด
กำลังการผลิตจำกัด
ทรัพยากรธรรมชาติจำนวนจำกัด
เพราะโลกจริงมีข้อจำกัดเสมอ การทำ optimization ที่ไม่คำนึงถึง constraint จะไม่สะท้อนโลกจริง
ตัวอย่างการใช้ Constrained Optimization ในเศรษฐศาสตร์จริง
สถานการณ์ | ฟังก์ชันเป้าหมาย | ข้อจำกัด |
---|---|---|
การบริโภคของผู้บริโภค | อรรถประโยชน์ (utility maximization) | งบประมาณ (budget constraint) |
การผลิตของบริษัท | ผลผลิต (production maximization) | ทุนและแรงงานจำกัด |
บริษัทตั้งราคา | กำไร (profit maximization) | กำลังการผลิตหรือข้อกำหนดภาครัฐ |
การจัดสรรทรัพยากร | สวัสดิการสังคม (welfare maximization) | งบประมาณรัฐจำกัด |
การลงทุน | ผลตอบแทนรวม (return maximization) | ความเสี่ยงหรืองบลงทุนจำกัด |
5.6.1 ขั้นตอนการทำ Constrained Optimization
- กำหนดปัญหา (Problem Definition)
กำหนดฟังก์ชันวัตถุประสงค์ (Objective Function) และข้อจำกัด (Constraint)
- ต้องการหาค่าสูงสุด (maximize) หรือค่าต่ำสุด (minimize) ของฟังก์ชัน \[f(x_1, x_2, \dots, x_n)\] โดยมีข้อจำกัดในรูปแบบ \[g_i(x_1, x_2, \dots, x_n) = 0, \quad i = 1,2,\dots,m\]
หมายเหตุ: ในกรณีนี้พิจารณาเฉพาะข้อจำกัดประเภท “เท่ากับ” (equality constraint)
- สร้างฟังก์ชันลากรังเชียน (Construct the Lagrangian Function)
- หาเงื่อนไขอันดับหนึ่ง (First-Order Conditions: FOC) ทำการหาอนุพันธ์บางส่วน (partial derivatives) ของฟังก์ชัน Lagrangianแล้วตั้งสมการว่าอนุพันธ์แต่ละตัวเท่ากับศูนย์ สำหรับทุกตัวแปร \(x_j\) และตัวคูณลากรังจ์ \(\lambda_i\): \[\begin{aligned} \frac{\partial \mathcal{L}}{\partial x_j} =& 0, \quad \text{สำหรับทุก } j = 1,2,\dots,n\\ \frac{\partial \mathcal{L}}{\partial \lambda_i} =& 0, \quad \text{สำหรับทุก } i = 1,2,\dots,m \end{aligned}\]
หมายเหตุ: \(\frac{\partial \mathcal{L}}{\partial \lambda_i} = 0\) คือสมการข้อจำกัดเดิม \(g_i(x) = c_i\)
แก้ระบบสมการ (Solve the System of Equations)
แก้ระบบสมการที่ได้จาก FOC
หา \((x_1^*, x_2^*, \dots, x_n^*, \lambda_1^*, \dots, \lambda_m^*)\)
ตรวจสอบลักษณะของจุดวิกฤติ (Second-Order Conditions: SOC) ถ้ามีความจำเป็น (โดยเฉพาะกรณีที่ต้องการพิสูจน์ minimum/maximum อย่างละเอียด):
ตรวจสอบลักษณะของจุดวิกฤติ โดยการวิเคราะห์ Hessian matrix ของฟังก์ชันวัตถุประสงค์บนข้อจำกัด
ใช้วิธี Bordered Hessian Test หรือเทคนิค Second-Order Sufficient Conditions
ตีความผลลัพธ์ (Interpret the Solution)
สรุปค่า \(x_j^*\) ที่ได้
คำนวณค่าของฟังก์ชันวัตถุประสงค์ที่จุดนั้น: \(f(x_1^*, x_2^*, \dots, x_n^*)\)
ตีความทางเศรษฐศาสตร์ วิศวกรรม หรือบริบทของปัญหา (เช่น ผลผลิตสูงสุด, ต้นทุนต่ำสุด)
5.7 ตัวอย่างการประยุกต์
5.7.1 การเพิ่มอรรถประโยชน์ภายใต้งบประมาณ (Utility Maximization)
ปัญหา: ให้ฟังก์ชันอรรถประโยชน์ของผู้บริโภค
\[
U(x_1, x_2) = x_1^{0.5} x_2^{0.5}
\] โดยข้อจำกัดงบประมาณคือ
\[
p_1x_1 + p_2x_2 = m
\] ( \(p_1, p_2\) ราคาสินค้า; \(m\) รายได้)
สร้างฟังก์ชัน Lagrangian: \[ \mathcal{L}(x_1, x_2, \lambda) = x_1^{0.5}x_2^{0.5} + \lambda(m - p_1x_1 - p_2x_2) \]
ตั้งสมการ FOC: \[ \frac{\partial \mathcal{L}}{\partial x_1} = 0 \quad \frac{\partial \mathcal{L}}{\partial x_2} = 0 \quad \frac{\partial \mathcal{L}}{\partial \lambda} = 0 \]
แก้ระบบสมการ จะได้ Demand Functions สำหรับ \(x_1\) และ \(x_2\)
5.4 เงื่อนไข Second-Order (SOC: Second-Order Conditions) - ใช้ตรวจสอบว่าจุดที่หาได้เป็นจุดสูงสุดหรือต่ำสุดจริงหรือไม่ - โดยตรวจสอบลักษณะของ Hessian Matrix ของฟังก์ชัน - ในเศรษฐศาสตร์ปกติเราสนใจเฉพาะกรณีที่ เป็นจุดสูงสุด (Maximization)
5.5 กรณีมีหลายข้อจำกัด (Multiple Constraints)
ถ้ามีมากกว่าหนึ่งข้อจำกัด เช่น
\[
g_1(x) = 0, \quad g_2(x) = 0
\] จะมีตัวแปร Lagrange เพิ่มขึ้น เช่น \(\lambda_1, \lambda_2\) และ Lagrangian ใหม่จะเป็น \[
\mathcal{L}(x, \lambda_1, \lambda_2) = f(x) + \lambda_1(c_1 - g_1(x)) + \lambda_2(c_2 - g_2(x))
\]
5.7.2 การคำนวณเชิงสัญลักษณ์ด้วย caracas
จะเหมือนกับหัวข้อที่ผ่านทุกประการ เพียงแค่ต้องคำนวณว่าผ่านฟังก์ชันลากรองซ์เท่านั้นเอง
5.8 ปัญหาแบบมีข้อจำกัดไม่เท่ากับ (Inequality Constraints) [เพิ่มเติม]
- ใช้เทคนิค Kuhn-Tucker Conditions แทน
- ตัวอย่างเช่น: การผลิตที่มีข้อจำกัดว่าไม่เกินกำลังการผลิตสูงสุด
5.9 สรุป
- ปัญหา Constrained Optimization พบได้ทั่วไปในเศรษฐศาสตร์
- วิธี Lagrange Multiplier เป็นเครื่องมือสำคัญ
- การเข้าใจค่า \(\lambda\) ช่วยตีความผลลัพธ์เชิงเศรษฐศาสตร์ได้ลึกซึ้ง