from sympy import symbols, expand
x = symbols('x')
expr = (x + 1)**3
expand(expr)1 การคำนวณเชิงสัญลักษณ์และการใช้งานซิมไพเบื้องต้น
1.1 บทนำ
ในบริบทของการศึกษาคณิตศาสตร์การเงิน การคำนวณเชิงตัวเลข (numerical computation) มักถูกนำมาใช้เป็นเครื่องมือหลักในการหาคำตอบของปัญหา เช่น การคำนวณมูลค่าเงินตามเวลา การหาค่าดอกเบี้ย หรือการประเมินกระแสเงินสด อย่างไรก็ตาม แนวทางดังกล่าวมุ่งเน้นผลลัพธ์เชิงตัวเลขเป็นสำคัญ ซึ่งอาจไม่เพียงพอสำหรับการทำความเข้าใจโครงสร้างภายในของสูตรหรือแบบจำลองทางการเงิน
เพื่อแก้ไขข้อจำกัดดังกล่าว แนวคิดของ การคำนวณเชิงสัญลักษณ์ (symbolic computation) จึงมีบทบาทสำคัญมากขึ้น โดยเปิดโอกาสให้ผู้เรียนสามารถทำงานกับนิพจน์ทางคณิตศาสตร์ในรูปแบบสัญลักษณ์ แทนที่จะเป็นเพียงค่าตัวเลข
1.1.1 การคำนวณเชิงตัวเลขและเชิงสัญลักษณ์
เพื่อให้เห็นความแตกต่างอย่างชัดเจน สามารถพิจารณาเปรียบเทียบแนวทางทั้งสองได้ดังนี้
| ลักษณะ | การคำนวณเชิงตัวเลข | การคำนวณเชิงสัญลักษณ์ |
|---|---|---|
| ผลลัพธ์ | ค่าตัวเลข | นิพจน์ทางคณิตศาสตร์ |
| การใช้งาน | คำนวณคำตอบเฉพาะกรณี | วิเคราะห์โครงสร้างทั่วไป |
| ความยืดหยุ่น | ต่ำ | สูง |
| ความเข้าใจเชิงลึก | จำกัด | สูง |
จากตารางจะเห็นได้ว่า การคำนวณเชิงสัญลักษณ์ไม่ได้มาแทนที่การคำนวณเชิงตัวเลข แต่ทำหน้าที่เสริม เพื่อให้เกิดความเข้าใจเชิงโครงสร้างของปัญหา
1.2 บทบาทของการคำนวณเชิงสัญลักษณ์ในคณิตศาสตร์การเงิน
ในคณิตศาสตร์การเงิน สูตรต่าง ๆ เช่น มูลค่าปัจจุบัน มูลค่าในอนาคต หรือมูลค่าของเงินงวด สามารถมองได้ในรูปของแบบจำลอง (model) ที่ขึ้นกับพารามิเตอร์ เช่น อัตราดอกเบี้ย ระยะเวลา และรูปแบบของกระแสเงินสด
การใช้การคำนวณเชิงสัญลักษณ์ช่วยให้สามารถ:
นิยามแบบจำลองในรูปทั่วไป
วิเคราะห์พฤติกรรมของฟังก์ชัน เช่น การเพิ่มขึ้นหรือลดลง
หาความสัมพันธ์เชิงอนุพันธ์หรือขีดจำกัดของแบบจำลอง
แปลงรูปสูตรให้อยู่ในรูปที่สะดวกต่อการตีความ
ดังนั้น แนวทางนี้จึงมีบทบาทสำคัญในการเชื่อมโยงระหว่างการเรียนรู้เชิงทฤษฎีกับการประยุกต์ใช้งานจริง
1.2.1 เครื่องมือสำหรับการคำนวณเชิงสัญลักษณ์
ในหนังสือเล่มนี้จะใช้ไลบรารีซิมไพ(SymPy) ซึ่งเป็นเครื่องมือในภาษาไพธอน (Python) สำหรับการคำนวณเชิงสัญลักษณ์ โดยมีความสามารถในการ:
แก้สมการ (equation solving)
หาอนุพันธ์และปริพันธ์
จัดรูปนิพจน์ทางพีชคณิต
นิยามฟังก์ชันเชิงสัญลักษณ์
แปลงผลลัพธ์ให้อยู่ในรูปแบบ \(\LaTeX\)
ซิมไพเป็นซอฟต์แวร์แบบเปิด (open-source) ที่สามารถใช้งานได้โดยไม่มีค่าใช้จ่าย และสามารถทำงานร่วมกับเครื่องมืออื่นในระบบนิเวศของ Python เช่น NumPy, Matplotlib และ Pandas ได้อย่างมีประสิทธิภาพ
1.3 สภาพแวดล้อมสำหรับการใช้งาน
เพื่อให้สามารถทดลองและประยุกต์ใช้แนวคิดในบทนี้ได้อย่างมีประสิทธิภาพ ผู้อ่านควรใช้งานร่วมกับสภาพแวดล้อมที่รองรับการเขียนโปรแกรมแบบอินเทอร์แอกทีฟ เช่น Jupyter Notebook หรือเครื่องมืออื่นที่มีลักษณะใกล้เคียง โดยสามารถใช้งานได้ทั้งแบบติดตั้งในเครื่องหรือผ่านระบบออนไลน์
1.3.1 การติดตั้งโปรแกรมและการใช้งานซิมไพเบื้องต้น
ถ้าไม่ต้องการติดตั้งโปรแกรมภาษาไพธอนในเครื่องคอมพิวเตอร์ หรือผู้อ่านใช้ iPad หรือ tablet อื่นๆ ผู้อ่านสามารถใช้ภาษาไพธอนและซิมไพได้จาก
https://jupyter.org/ หรือ https://colab.google/ ก็ได้
โดยไม่ต้องติดตั้งโปรแกรมที่เกี่ยวข้องลงในคอมพิวเตอร์
1.3.2 ติดตั้งไพธอนสาม (Python3)
ตรวจสอบว่าเครื่องคอมพิวเตอร์มีไพธอนหรือไม่ โดยพิมพ์ใน command line สำหรับ WINDOWS และใน terminal สำหรับ MAC OS หรือ LINUX
python3 --versionถ้ายังไม่มี
- macOS ดาวน์โหลดจาก https://www.python.org/downloads/macos/ หรือสามารถติดตั้งผ่าน Homebrew
brew install pythonWindows ดาวน์โหลดจาก https://www.python.org/downloads/ อย่าลืมเลือก “Add Python to PATH”
LINUX(สาย ubuntu) ติดตั้งผ่าน terminal
sudo apt update
sudo apt install python3 python3-pip -y- สร้าง Virtual Environment (แนะนำ)
python3 -m venv sympy-env
source sympy-env/bin/activate # บน macOS / Linux
sympy-env\Scripts\activate.bat # บน WindowsVirtual Environment (สภาพแวดล้อมเสมือน) คือเครื่องมือในภาษาไพธอนที่ใช้สร้างสภาพแวดล้อมเฉพาะตัวสำหรับโปรเจกต์หนึ่ง ๆ ซึ่งแยกออกจากไพธอนและไลบรารีหลักที่ติดตั้งไว้ในเครื่องเพื่อให้สามารถ
แยกไลบรารี แต่ละโปรเจกต์สามารถใช้เวอร์ชันของไลบรารีที่ต่างกันได้โดยไม่ชนกัน
หลีกเลี่ยงปัญหา dependency conflict โปรเจกต์ A อาจใช้
sympy==1.7.1ส่วนโปรเจกต์ B ใช้sympy==1.12ทำงานร่วมกับทีมได้ง่ายขึ้น สามารถแนบ
requirements.txtแล้วให้คนอื่นติดตั้งไลบรารีตามที่คุณใช้ได้ไม่รบกวนระบบหลัก ไพธอนและไลบรารีในเครื่องยังคงปลอดภัยจากการเปลี่ยนแปลงในแต่ละโปรเจกต์
1.3.3 ติดตั้งซิมไพ และ Jupyter Notebook
ก่อนเริ่มต้นใช้งานซิมไพ ซึ่งเป็นไลบรารีในภาษาไ ํพธอนสำหรับการคำนวณเชิงสัญลักษณ์ (symbolic computation) และ Jupyter Notebook ซึ่งเป็นเครื่องมือยอดนิยมในการเขียนและรันโค้ดไพธอนในรูปแบบอินเทอร์แอกทีฟ ผู้ใช้จำเป็นต้องติดตั้งโปรแกรมทั้งสองผ่านคำสั่งในเทอร์มินัล (Terminal) หรือ Command Prompt ดังนี้
pip3 install sympy notebookpip3คือคำสั่งสำหรับติดตั้งแพ็กเกจในไพธอนsympyคือไลบรารีสำหรับการคำนวณเชิงสัญลักษณ์ เช่น การแก้สมการ หาค่าอนุพันธ์ อินทิกรัล และอื่น ๆnotebookคือแพ็กเกจสำหรับติดตั้ง Jupyter Notebook ซึ่งเป็นเครื่องมือที่ช่วยให้สามารถเขียนโค้ด คำอธิบาย และดูผลลัพธ์ในหน้าต่างเดียวกัน
เมื่อดำเนินการติดตั้งเสร็จเรียบร้อยแล้ว ผู้ใช้สามารถเริ่มต้นเขียนสมการทางคณิตศาสตร์โดยใช้ซิมไพ ได้ทันทีใน Jupyter Notebook
1.4 สรุปคำสั่งหลักสำหรับการใช้งานซิมไพ
# ติดตั้ง Python (ถ้ายังไม่มี)
brew install python # สำหรับ macOS
# สร้าง virtual environment
python3 -m venv sympy-env
source sympy-env/bin/activate
# ติดตั้ง SymPy และ Jupyter
pip3 install sympy notebook
# เรียกใช้งาน Jupyter Notebook
jupyter notebookการคำนวณเชิงสัญลักษณ์ (symbolic mathematics) โดยใช้ชุดคำสั่งซิมไพสำหรับผู้ที่มีพื้นฐานภาษาไพธอน เช่น การแก้สมการ การหาอนุพันธ์ การอินทิเกรต พีชคณิตเชิงเส้น สมการเชิงอนุพันธ์ ฯลฯ
from sympy import Symbol
## เช่นการสร้างตัวแปรสัญลักษณ์การจ่ายรายงวด
a_n = Symbol('a_{\\overline{x}|i}')
a_n\(\displaystyle a_{\overline{x}|i}\)
1.4.1 ทำไมเลือกใช้ซิมไพ
พลังแห่งการคำนวณเชิงสัญลักษณ์ (The Power of Symbolic Math) SymPy ไม่ได้มองตัวเลขเป็นแค่ทศนิยมเหมือนเครื่องคิดเลขทั่วไป แต่มันมองคณิตศาสตร์เป็น “สัญลักษณ์” (Expression)
ความแม่นยำ 100%: เช่น การคำนวณค่า \(\sqrt{2}\) หรือ \(\pi\) จะไม่มีการปัดเศษทิ้งจนกว่าคุณจะสั่ง ทำให้ผลลัพธ์ในสมการการเงินที่ซับซ้อนไม่เกิด Error สะสม
แก้สมการติดตัวแปร: สามารถจัดรูปสมการ แก้สมการดิฟเฟอเรนเชียล หรือหาอนุพันธ์โดยติดค่าพารามิเตอร์ไว้ได้ (เช่น ติดค่า \(r\) หรือ \(\sigma\) ไว้) เหมือนมีซอฟต์แวร์ราคาแพงอย่าง Mathematica อยู่ในมือ แต่ใช้ฟรี!
ไร้รอยต่อบนโลกของ Cloud Computing ออกแบบมาเพื่อยุคสมัยของ Jupyter Notebook และ Google Colab โดยเฉพาะ
ไม่ต้องติดตั้งให้ยุ่งยาก: ผู้เรียนหรือผู้อ่านสามารถรัน Code ผ่าน Browser ได้ทันที
Interactive Learning: เปลี่ยนจาก “การดูสูตรนิ่งๆ ในตำรา” เป็น “การเปลี่ยนตัวแปรแล้วดูผลลัพธ์ทันที” (Real-time Experimentation) ซึ่งเป็นหัวใจของการศึกษาในยุคดิจิทัล
ศูนย์กลางของระบบนิเวศ Python (The Python Ecosystem Hub) SymPy ไม่ได้ทำงานโดดเดี่ยว แต่เป็น “สะพาน” เชื่อมไปสู่เครื่องมืออื่นๆ:
SymPy ➔ NumPy: สามารถเปลี่ยนสูตรทางคณิตศาสตร์ที่พิสูจน์เสร็จแล้ว ให้กลายเป็นฟังก์ชันความเร็วสูง (Vectorized Code) เพื่อประมวลผลข้อมูลการเงินขนาดใหญ่ใน Pandas ได้ทันที
SymPy ➔ Matplotlib: พล็อตกราฟจากฟังก์ชันสัญลักษณ์ได้โดยตรง ช่วยให้เห็นภาพรวมของฟังก์ชัน (เช่น กราฟกำไร-ขาดทุน) ได้ง่ายขึ้น
การสร้างเอกสารทางวิชาการระดับโลก (Seamless Documentation) เมื่อใช้ร่วมกับ Markdown และ Quarto จะทำให้การเขียนตำราการเงินกลายเป็นเรื่องง่าย:
Auto-LaTeX: SymPy สามารถแปลงผลลัพธ์ที่คำนวณได้ให้อยู่ในรูป \(\LaTeX\) ที่สวยงามโดยอัตโนมัติ ลดความผิดพลาดจากการพิมพ์สูตรเอง
One Source, Multi-Outputs: เขียน Code ครั้งเดียว แต่สามารถ Export ผลลัพธ์ออกมาเป็นทั้งเว็บไซต์ (HTML Book), รายงาน (PDF), หรือสไลด์สอน (Revealjs) ที่มีสูตรคณิตศาสตร์คมชัด
มาตรฐานใหม่ของ Open Source Library
Lightweight & Pure Python: ตัวไลบรารีมีขนาดเล็ก ติดตั้งง่าย และเขียนด้วยภาษา Python ทั้งหมด ทำให้เข้าถึงและเรียนรู้ได้รวดเร็วสำหรับนักศึกษาและนักวิจัย
Community Driven: มีการอัปเดตและตรวจสอบจากนักคณิตศาสตร์และโปรแกรมเมอร์ทั่วโลก ทำให้มั่นใจได้ในความถูกต้องและความทันสมัยของ Algorithm
1.4.2 การกำหนดสัญลักษณ์ด้วยคำสั่ง symbols
คำสั่ง symbols ในซิมไพเป็นคำสั่งพื้นฐานที่ สำคัญมาก เพราะใช้ในการสร้าง ตัวแปรเชิงสัญลักษณ์ (symbolic variables) ซึ่งเป็นหัวใจของการคำนวณเชิงสัญลักษณ์ เช่น การแก้สมการ, การอนุพันธ์, อินทิกรัล, การแทนค่า ฯลฯ
ความหมายของคำสั่ง symbols
from sympy import symbols
x = symbols('x')คำสั่งนี้หมายถึง สร้างตัวแปรสัญลักษณ์ชื่อว่า \(x\)
เป็นวัตถุ (object) ของชนิด Symbol ที่ซิมไพใช้แทน “ตัวแปรทางคณิตศาสตร์” เหมือนที่เราใช้ในสมการจริงๆ
ซิมไพไม่ใช้ตัวแปรแบบไพธอนทั่วไป เช่น x = 5 แต่ใช้ x = symbols('x') เพื่อบอกว่า “ฉันต้องการใช้ \(x\) เป็นตัวแปรในสมการ/สูตร”
ความสำคัญของคำสั่ง symbols()
| วัตถุประสงค์ | อธิบาย |
|---|---|
| 1. สร้างตัวแปรเชิงสัญลักษณ์ | เหมือน \(x, y, z\) ในคณิตศาสตร์ |
| 2. ใช้ในสมการ | ใช้สร้าง, แก้, หรือแปลงสมการ |
| 3. ใช้ในการคำนวณขั้นสูง | เช่นการหาอนุพันธ์, อินทิกรัล, ลิมิต, พีชคณิตเชิงเส้น เป็นต้น |
| 4. ควบคุมสมบัติตัวแปร | เช่นมีคุณสมบัติเป็นจำนวนบวก, จำนวนจริง หรือจำนวนเต็ม |
| 5. รองรับเวกเตอร์/แมทริกซ์/อนุกรม | ใช้ได้ทั้งการตัวแปรแบบรายตัวหรือหลายตัวพร้อมกัน |
from sympy import symbols
# สร้างตัวแปรเชิงสัญลักษณ์ชื่อ x ให้มีค่าเท่ากับ x
x = symbols('x')หรือหลายตัว:
from sympy import symbols
# สร้างตัวแปรเชิงสัญลักษณ์ชื่อ x y และ z ให้มีค่าเท่ากับ x y และ z ตามลำดับ
x, y, z = symbols('x y z')หรือเป็นลำดับ ลิสต์/เมตริกซ์ของตัวแปร
from sympy import symbols
a = symbols('a1:6') # ได้ a1, a2, ..., a5
a(a1, a2, a3, a4, a5)
1.4.3 การกำหนดสมมุติฐานให้ตัวแปรเชิงสัญลักษณ์ (assumptions)
ซิมไพรองรับสมมุติฐานที่ช่วยลดความซับซ้อนของนิพจน์ หรือข่วยในเวลาต้องการแก้สมการหาคำตอบ
หากไม่กำหนดสมมุติฐาน ซิมไพจะให้เป็นค่าไม่ทราบแน่ชัด
การกำหนดสมมุติฐานที่เหมาะสมช่วยให้ simplify, solve, limit, และการพิสูจน์เชิงสัญลักษณ์ต่าง ๆ แม่นยำขึ้น
a = symbols('a', positive = True) # a > 0
b = symbols('b', real = True, positive = True) # b เป็นจำนวนจริง บวก
c = symbols('c', integer = True) # c เป็นจำนวนเต็ม
d = symbols('d', nonzero = True) # d ไม่เท่ากับ 0
e = symbols('d')ตรวจสอบว่า a เป็นจำนวนเต็มบวกใช่หรือไม่?
a.is_positiveTrue
หรือ b เป็นจำนวนจริงบวกใช่หรือไม่?
b.is_realTrue
b.is_positiveTrue
ถ้าไม่กำหนดสมมุติฐานเช่น ตัวแแปรเชิงสัญลักษณ์ e
e.is_real # เป็นจำนวนเต็มใช่หรือไม่?e.is_complex # เป็นจำนวนเชิงซ้อนใช่หรือไม่?จะไม่ได้คำตอบออกมา ว่าเป็นจริงหรือเท็จ
1.4.4 ตัวอย่างสมมุติฐานที่ใช้ได้
| สมมุติฐาน | ความหมาย |
|---|---|
real = True |
เป็นจำนวนจริง |
positive = True |
> 0 |
negative = True |
< 0 |
nonzero = True |
\(\neq\) 0 |
integer = True |
เป็นจำนวนเต็ม |
odd = True, even = True |
เป็นเลขคี่, เลขคู่ |
finite = True |
ไม่เป็นอินฟินิตี้ |
prime = True |
เป็นจำนวนเฉพาะ |
1.4.5 การสร้างสัญลักษณ์ภาษากรีก
สัญลักษณ์หรือตัวแปรต่างๆ ในทางคณิตศาสตร์มักใช้ตัวอักษรกรีซในการสื่อความหมาย และซิมไพอนุญาติให้เราสามารถใช้ตัวอักษรกรีกได้โดยใช้ชื่อของสัญลักษณ์โดยตรง เช่น
## ตัวแปรเชิงสัญลักษณ์ภาษากรีซ
alpha, beta, gamma, lam, mu, nu, pi = symbols('alpha beta gamma lambda mu nu pi')ซิมไพรองรับการแสดงผลเป็นอักษรกรีกอัตโนมัติเมื่อใช้ pretty(), LaTeX, หรือ notebook rendering
| พิมพ์ว่า | ได้เป็นสัญลักษณ์ |
|---|---|
alpha |
\(\alpha\) |
beta |
\(\beta\) |
lam |
\(\lambda\) |
mu |
\(\mu\) |
nu |
\(\nu\) |
pi |
\(\pi\) |
ตัวอย่างใช้งานและผลลัพธ์ทางหน้าจอหรือเอกสาร
alpha + beta - gamma/lam + mu + nu/pi\(\displaystyle \alpha + \beta - \frac{\gamma}{\lambda} + \mu + \frac{\nu}{\pi}\)
1.4.6 การหลีกเลี่ยงการใช้บางชื่อเป็นตัวแปร
ถูกใช้เป็นชื่อฟังก์ชันหรือคลาสของซิมไพเอง
เป็นคำสงวน (reserved keywords) ในไพธอน
อาจทำให้เกิด conflict หรือพฤติกรรมผิดพลาดโดยไม่รู้ตัว
ชื่อที่ควรหลีกเลี่ยงในซิมไพโดยเฉพาะ
| ชื่อ | เหตุผล |
|---|---|
I |
แทนหน่วยจินตภาพ \(i = \sqrt{-1}\) |
E |
แทนค่าคงที่ \(e \approx 2.718\) |
pi |
ค่าคงที่ \(\pi\) |
oo |
Infinity (\(\infty\)) |
zoo |
Complex infinity |
NaN |
Not a Number |
S |
ตัวช่วยเรียกค่าคงที่ เช่น S(1)/2 |
Eq, solve, diff, integrate, symbols, expand, ฯลฯ |
เป็นฟังก์ชันหลักของซิมไพ |
ถ้าเขียน I = symbols('I') \(\rightarrow\) จะทำให้ I ไม่ใช่ \(\sqrt{-1}\) อีกต่อไป และอาจทำให้การคำนวณตัวเลขเชิงซ้อนผิดพลาดได้
ชื่อที่เป็น reserved keywords ของไพธอน (ห้ามใช้)
เช่น:
if, else, while, for, in, def, class, return, lambda, True, False, Noneห้ามสร้างตัวแปรชื่อ lambda
lambda = symbols('lambda') # SyntaxErrorผลลัพธ์
File "<string>", line 1
lambda = symbols('lambda') # SyntaxError
^
SyntaxError: invalid syntax)แต่สามารถใช้ชื่อใกล้เคียงได้
lambda_ = symbols('lambda_') # สามารถทำได้
lambda_\(\displaystyle \lambda_{}\)
ชื่อที่ใช้ในชุดคำสั่งหรือไลบรารีอื่น เช่น NumPy, matplotlib
ถ้าเราต้องใช้หลายไลบรารีร่วมกัน (เช่น NumPy, Pandas, matplotlib) ก็ควรหลีกเลี่ยงชื่อต่อไปนี้เช่นกัน:
| ชื่อ | ความเสี่ยง |
|---|---|
sum, min, max, range |
เป็น built-in function ของ Python |
list, dict, set |
ชื่อชนิดข้อมูล |
np, pd, plt |
ชื่อย่อ (alias) ของไลบรารี |
วิธีป้องกันตัวแปรซ้อนชื่อสำคัญ
ใช้ suffix เช่น
_var,_sym,_valใช้ underscore
_เช่นlambda_,I_,pi_ใช้
dir()เพื่อตรวจสอบว่าชื่อนั้นถูกใช้แล้วหรือไม่
'I' in dir() # ถ้า True แสดงว่ามี object ชื่อ I แล้วถ้าต้องการสร้างสัญลักษณ์หลายตัว เช่น \(\lambda, \mu, \sigma\) ที่ชื่อซ้อนกับค่าพิเศษเหล่านี้อาจใช้ lambda_ mu_sym หรือ sigma_sym
1.4.7 สัญลักษณ์ที่มี “ยกกำลัง” หรือ “ตัวห้อย”
x_t = symbols('x_t') # ตัวห้อย
x_t\(\displaystyle x_{t}\)
i_m = symbols('i^{(m)}') # ตัวยก
i_m\(\displaystyle i^{(m)}\)
ผู้อ่านควรจะต้องเข้าใจภาษา LaTeX เบื้องต้นเกี่ยวกับเขียนสมการก่อน จะทำให้เข้าใจหลักของ การสร้างตัวแปรเชิงสัญลักษณ์ด้วยซิมไพได้เข้าใจมากยิ่งขึ้น
1.5 สัญลักษณ์พื้นฐานที่ใช้ในคณิตศาสตร์การเงิน
ในการศึกษาวิชาคณิตศาสตร์การเงิน การใช้ สัญลักษณ์ทางคณิตศาสตร์ มีความสำคัญอย่างยิ่ง เนื่องจากช่วยให้สามารถเขียนสูตรและแบบจำลองต่าง ๆ ได้อย่างกระชับ ชัดเจน และเป็นสากล โดยเฉพาะอย่างยิ่งในการวิเคราะห์เรื่องดอกเบี้ย มูลค่าเงินตามเวลา เงินงวด (Annuities) และเงินสำรอง (Reserves)
หัวข้อนี้จึงรวบรวมสัญลักษณ์พื้นฐานที่ใช้กันอย่างแพร่หลายในการคำนวณทางการเงิน เช่น
อัตราดอกเบี้ย (เช่น \(i\), \(d\))
ค่าคิดลด (\(v\))
จำนวนงวดและระยะเวลา (\(n, m\))
มูลค่าปัจจุบันและมูลค่าในอนาคต (\(PV, FV\))
เงินงวดและทุนตั้งต้น (\(A, P, F, S\))
การกำหนดสัญลักษณ์ด้วยภาษาไพธอนด้วยชุดคำสั่งซิมไพยังช่วยให้สามารถคำนวณเชิงสัญลักษณ์ได้ ซึ่งเหมาะทั้งสำหรับการเรียน การสอน และการสร้างแบบจำลองเชิงทฤษฎีและเชิงปฏิบัติ
1.5.1 อัตราดอกเบี้ย และมูลค่าเงิน
ในการคำนวณทางการเงิน อัตราดอกเบี้ยและการวัดมูลค่าของเงินในช่วงเวลาต่าง ๆ ถือเป็นพื้นฐานสำคัญที่ใช้ในการวิเคราะห์ เช่น การคำนวณดอกเบี้ย มูลค่าปัจจุบัน (Present Value) หรือมูลค่าในอนาคต (Future Value) ของเงิน
เพื่อความสะดวกในการเขียนสมการและทำงานเชิงสัญลักษณ์ เราสามารถกำหนดสัญลักษณ์ที่สำคัญได้ดังนี้
from sympy import symbols
# อัตราดอกเบี้ย
i = symbols('i', positive=True) # i: effective
i_m = symbols('i^{(m)}', positive=True) # i^{(m)}: nominal interest rate (m ครั้งต่อปี)
r = symbols('r', positive=True) # r: nominal interest rate m -> oo
d = symbols('d', positive=True) # d: effective discount rate
d_m = symbols('d^{(m)}', positive=True) # i: nominal discount rate
# อัตราต่อช่วง
m = symbols('m', integer=True, positive=True) # จำนวนงวดต่อปี
# ปัจจัยมูลค่าปัจจุบัน / อนาคต
v = symbols('v', positive=True) # v = 1/(1+i)
n = symbols('n', positive=True) # n ปี
# มูลค่าปัจจุบันและอนาคต
PV, FV = symbols('PV FV') # Present Value / Future Value
# ปริมาณเงินหรือจำนวนเงิน
A, P, F, S = symbols('A P F S') # Annuity, Principal, Future, Sinking fund1.5.2 มูลค่าปัจจุบันและอนุกรม
ในคณิตศาสตร์การเงิน การคำนวณมูลค่าปัจจุบันของเงินงวด (annuity) และมูลค่าในอนาคตของเงินงวด เป็นหัวข้อหลักที่สำคัญ โดยทั่วไปจะมีสัญลักษณ์เฉพาะที่ใช้เรียกสูตรมาตรฐาน เช่น \(a_{\overline{n}|i}\), \(s_{\overline{n}|i}\), \(\ddot{a}_{\overline{n}|i}\), \(\ddot{s}_{\overline{n}|i}\) เป็นต้น
เงินงวดสิ้นงวด (Ordinary Annuity)
สัญลักษณ์ a_n ใช้แทนค่าปัจจุบันของเงินงวดสิ้นงวดจำนวน \(n\) งวด โดยมีอัตราดอกเบี้ย \(i\) ต่อช่วง ค่าของมันคำนวณจากสูตร
# ปัจจัยมูลค่าปัจจุบันของเงินงวดสิ้นงวด อย่างย่อ
a_n = symbols('a_n') # a_n = (1 - v^n)/iสัญลักษณ์ \(a_{\overline{n}|i}\) คือรูปแบบเต็มที่ใช้กันในเอกสารทางการเงิน เพื่อแสดงว่าเป็นมูลค่าปัจจุบันของอนุกรมเงินงวดสิ้นงวด
# หรือสร้างสัญลักษณ์เต็มรูปแบบ
a_n = symbols('a_{\\overline{n}|i}')
a_n # แสดงผลลัพธ์\(\displaystyle a_{\overline{n}|i}\)
สัญลักษณ์ s_n ใช้แทน มูลค่าในอนาคต (Future Value) ของเงินงวดสิ้นงวดจำนวน \(n\) งวด
# สัญลักษณ์อย่างย่อ
s_n = symbols('s_n') # s_n = ((1+i)^n - 1)/iสัญลักษณ์ \(s_{\overline{n}|i}\) คือรูปแบบเต็มของมูลค่าในอนาคตของอนุกรมเงินงวดสิ้นงวด
# หรือ สร้างสัญลักษณ์เต็มรูปแบบ
s_n = symbols('s_{\\overline{n}|i}')
s_n # แสดงผลลัพธ์\(\displaystyle s_{\overline{n}|i}\)
เงินงวดต้นงวด (Annuity Due)
สัญลักษณ์ a_n_due แทนมูลค่าปัจจุบันของเงินงวดต้นงวด โดยแต่ละงวดจ่ายต้นงวดแทนที่จะเป็นสิ้นงวด
# สัญลักษณ์อย่างย่อ
a_n_due = symbols('a_n_due') # เงินรายงวด ต้นงวดสัญลักษณ์ \(\ddot{a}_{\overline{n}|i}\) คือรูปแบบมาตรฐานของมูลค่าปัจจุบันของเงินงวดต้นงวด ซึ่งต่างจากกรณีสิ้นงวดเพียงแค่คูณเพิ่มด้วย \(1 + i\)
# สัญลักษณ์เต็ม
a_n_due = symbols('\\ddot{a}_{\\overline{n}|i}')
a_n_due\(\displaystyle \ddot{a}_{\overline{n}|i}\)
s_n_due ใช้แทนมูลค่าในอนาคตของอนุกรมที่จ่ายต้นงวด
# สัญลักษณ์อย่างย่อ
s_n_due = symbols('s_n_due')\(\ddot{s}_{\overline{n}|i}\) คือรูปแบบเต็มของมูลค่าในอนาคตของเงินงวดต้นงวด ใช้ในกรณีที่เราสนใจผลรวมเงินสะสมที่ปลายงวดสุดท้าย
# สัญลักษณ์เต็ม
s_n_due = symbols('\\ddot{s}_{\\overline{n}|i}')
s_n_due\(\displaystyle \ddot{s}_{\overline{n}|i}\)
1.5.3 เงินงวดชำระไม่เท่ากัน
นอกจากเงินงวดที่มีจำนวนคงที่ทุกงวด (level annuity) ซึ่งใช้บ่อยในการคำนวณเบี้ยประกันหรือเงินสำรอง เรายังพบกับกรณีที่ จำนวนเงินงวดเปลี่ยนแปลงในแต่ละงวด เช่น
เงินงวด เพิ่มขึ้นทีละจำนวนคงที่ เช่น เพิ่มขึ้น 1 หน่วยทุกงวด (Arithmetic Increasing Annuity)
เงินงวด เพิ่มขึ้นแบบทบต้น เช่น เพิ่มขึ้น 5% ทุกงวด (Geometric Increasing Annuity)
เราสามารถกำหนดสัญลักษณ์แทนกรณีเหล่านี้ไว้ล่วงหน้า เพื่อใช้ในสูตรและสมการต่าง ๆ ดังนี้
# เงินงวดเพิ่มขึ้นตามเลขคณิต/เรขาคณิต
Ia_n = symbols('Ia_n') # เงินงวดเพิ่มขึ้น 1 หน่วย/งวด (Arithmetic)
Ga_n = symbols('Ga_n') # เงินงวดเพิ่มขึ้นแบบ geometric1.5.4 Yield และ Internal Rate of Return (IRR)
ในโลกของการเงินและการลงทุน การประเมินผลตอบแทนจากการลงทุนระยะยาว เช่น พันธบัตร ประกันชีวิตแบบมีเงินปันผล หรือการลงทุนในสินทรัพย์ทางการเงินอื่น ๆ จำเป็นต้องใช้แนวคิด อัตราผลตอบแทนภายใน (IRR) หรือ ผลตอบแทนของพันธบัตร (YTM)
IRR (Internal Rate of Return) คือ อัตราดอกเบี้ยที่ทำให้มูลค่าปัจจุบันของกระแสเงินสดเท่ากับศูนย์
YTM (Yield to Maturity) คือ อัตราผลตอบแทนที่ผู้ลงทุนจะได้รับหากถือพันธบัตรจนครบกำหนด
การกำหนดตัวแปรสัญลักษณ์เหล่านี้จะช่วยให้เขียนสมการคำนวณกระแสเงินสดในลักษณะทั่วไปได้อย่างยืดหยุ่น
IRR = symbols('IRR', positive=True)
YTM = symbols('YTM', positive=True)1.6 การเปลี่ยนฟังก์ชันสัญลักษณ์เป็นฟังก์ชันเชิงตัวเลข
สาเหตุที่ต้องการแปลงฟังก์ชันเชิงสัญลักษณ์เป็นฟังก์ชันเชิงตัวเลขก็เพื่อใช้สำหรับการวาดแผนภาคหรือกราฟที่สวยงามกว่าในการวาดกราฟด้วยซิมไพ ดังตัวอย่างต่อไปนี้
from sympy import symbols, lambdify
import numpy as np
import matplotlib.pyplot as plt
# สร้างตัวแปรเชิงสัญลักษณ์ t
t = symbols('t')
# เงินสะสมของดอกเบี้ยทบต้นที่อัตราดอกเบี้ย 5% ณเวลาที่ t
expr = (1.05)**t
# แปลงเป็นฟังก์ชัน Python (numerical FV =(1.05)^t
FV = lambdify(t, expr, modules=['numpy'])
# สร้าง array เริ่มจากจุด 0 ไปถึง 100 จำนวน 100 จุด
T = np.linspace(0, 100, 100)
Fv = FV(T)
# สร้างกราฟ
plt.plot(T, Fv)
plt.title('FV = (1.05)^t')
plt.grid(True)
plt.show()from sympy import symbols, Lambda, simplify
# สร้างตัวแปรสัญลักษณ์
i, t, n = symbols('i t n', positive=True)
# นิยามฟังก์ชันคณิตศาสตร์การเงินแบบ symbolic ด้วย Lambda
pv = Lambda((i, t), 1 / (1 + i)**t) # Present Value: PV(i, t)
fv = Lambda((i, t), (1 + i)**t) # Future Value: FV(i, t)
a_n = Lambda((i, n), (1 - (1 + i)**(-n)) / i) # Present value of ordinary annuity
# Present value of annuity-due
a_n_due = Lambda((i, n), ((1 - (1 + i)**(-n)) / i) * (1 + i))
s_n = Lambda((i, n), ((1 + i)**n - 1) / i) # Future value of ordinary annuity
# Future value of annuity-due
s_n_due = Lambda((i, n), (((1 + i)**n - 1) / i) * (1 + i)) # ทดสอบแสดงนิยาม
print('PV(i, t) =', simplify(pv(i, t)))
print('FV(i, t) =', simplify(fv(i, t)))
print('a_n(i, n) =', simplify(a_n(i, n)))
print('a_n_due(i, n) =', simplify(a_n_due(i, n)))
print('s_n(i, n) =', simplify(s_n(i, n)))
print('s_n_due(i, n) =', simplify(s_n_due(i, n)))PV(i, t) = (i + 1)**(-t)
FV(i, t) = (i + 1)**t
a_n(i, n) = 1/i - 1/(i*(i + 1)**n)
a_n_due(i, n) = (i + 1)**(1 - n)*((i + 1)**n - 1)/i
s_n(i, n) = ((i + 1)**n - 1)/i
s_n_due(i, n) = (i + 1)*((i + 1)**n - 1)/i
Lambda() และ lambdify() ดูคล้ายกัน แต่ทำงานต่างกัน อย่างสิ้นเชิง
สรุปเปรียบเทียบ
| ฟังก์ชัน | Lambda() (ของ SymPy) |
lambdify() (ของ SymPy) |
|---|---|---|
| ประเภท | symbolic function | numeric function wrapper |
| การประเมินค่า | ยังคงอยู่ในโลกสัญลักษณ์ (symbolic) | แปลงเป็น ฟังก์ชัน Python ปกติ (หรือ NumPy) |
| ใช้กับอะไร | งาน symbolic เช่นนิยามฟังก์ชันในสูตร | งาน plotting, คำนวณตัวเลข, หรือใช้ร่วมกับ NumPy |
| Return type | sympy.Lambda |
ฟังก์ชัน Python (def หรือ lambda แบบ runtime) |
Lambda()นิยามฟังก์ชันเชิงสัญลักษณ์ (symbolic)
from sympy import symbols, Lambda
x = symbols('x')
f = Lambda(x, x**2 + 1)f # ค่าx ส่งไปยังฟังก์ชัน f = x^2+1\(\displaystyle \left( x \mapsto x^{2} + 1 \right)\)
f(x) # ใส่ตัวแปรเชิงสัญลักษณ์ x เข้าไปในฟังก์ชัน f\(\displaystyle x^{2} + 1\)
f(3) # ใส่เลข 3 ลงไปยังฟังก์ชัน 3\(\displaystyle 10\)
f(3) ทำงานได้เพราะ 3 ถูกแปลงเป็น symbolic Integer(3) โดยอัตโนมัติ
lambdify()แปลงเป็นฟังก์ชัน Python/NumPy สำหรับคำนวณจริง
from sympy import lambdify
f_num = lambdify(x, x**2 + 1)
f_num <function _lambdifygenerated(x)>
f_num(x)\(\displaystyle x^{2} + 1\)
f_num(3)10
ใช้กับ np.linspace(), plotting, numerical methods ได้ทันที
x_vals = np.linspace(-10, 10, 5)
print(f_num(x_vals))[101. 26. 1. 26. 101.]
แต่ ถ้าเป็นฟังก์ชันที่สร้างจาก Lambda จะไม่สามารถใช้งานได้
f(x_vals) ผู้เขียนไม่ได้แสดงค่าความผิดพลาด (error) ในหนังสือนี้เนื่องจากเป็นข้อความที่ยาวเกินไป ให้ผู้อ่านลองเขียนคำสั่งและดูผลที่เกิดขึ้นด้วยตนเอง
ฟังก์ชัน f ที่สร้างขึ้นไม่รองรับอาเรย์ x_vals ทำให้ไม่สามารถวัดวาดกราฟด้วย matplotlib ได้
# Lambda แบบ numeric สำหรับ plot
expr = x**2 -x +2
f_num = lambdify(x, expr, 'numpy')
x_vals = np.linspace(-10, 10, 100)
y_vals = f_num(x_vals)
plt.plot(x_vals, y_vals)
plt.title('Graph of x² - x + 2')
plt.grid()
plt.show()สำหรับฟังก์ชันที่ซิมไพอื่นๆ ที่เกี่ยวข้องจะทยอยนำเสนอในบทต่อๆ ไป

