25 ธันวาคม 2558

Published ธันวาคม 25, 2558 by with 0 comment

เขียนโปรแกรมแก้สมการเชิงเส้นด้วย SymPy กับภาษาไพทอน

สวัสดีผู้อ่านทุกท่านครับ ผู้อ่านคงเคยได้เรียนเรื่องการแก้ระบบสมการเชิงเส้นกันมาไม่มากก็น้อย (หรืออาจเคยได้แก้สมการกันเป็นสองสามหน้า - - ") การมาของคอมพิวเตอร์ทำให้การแก้สมการเชิงเส้นเป็นไปได้ง่ายขึ้น และ สามารถหาคำตอบได้เลย (ไม่ต้องแก้สมการสองสามหน้าแล้วไล่ตรวจสอบอีก) ตัวอย่างโปรแกรมในด้านนี้ที่มีชื่อเสียง คือ wolframalpha.com

บทความนี้ผมจะพาผู้อ่านไปเขียนโปรแกรมแก้สมการเชิงเส้นด้วย SymPy กับภาษาไพทอนกันครับ

เนื่องจากภาษาไพทอนได้มีโมดูลสารพัดประโยชน์ที่ภาษาอื่นอาจไม่มี คือ โมดูล SymPy เป็นโมดูลด้านระบบพีชคณิตคอมพิวเตอร์ในภาษาไพทอน

สามารถอ่านรายละเอียดโมดูล SymPy ได้จากบทความ คำนวณสัญลักษณ์พีชคณิตใน Python

บทความนี้ใช้ความรู้จาก เรื่อง Python Regular Expressions

ก่อนอื่นเรามาศึกษาการหาคำตอบจากสมการเชิงเส้นด้วยโมดูล SymPy กันก่อนครับ
เริ่มด้วยการ import โมดูลเข้ามา

from sympy import *
from sympy.solvers import solve
from sympy.parsing.sympy_parser import parse_expr

ในสมการ หากเราใช้ตัวแปร x , y เราต้องประกาศตัวแปรเหล่านี้ก่อนด้วยคำสั่ง

x,y = symbols('x y')

แล้วเราจะได้ตัวแปร x , y ที่พร้อมนำไปใช้ในการทำงานกับโมดูล SymPy
หาคำตอบจากสมการ ใช้คำสั่ง
solve(สมการเชิงเส้นที่จัดให้ = 0)

ตัวอย่างเช่น

print(solve(x+4-5)) #มาจากสมการ x+4=5

ผลลัพธ์

[1]

แต่หากเราไม่ต้องการย้ายข้างสมการให้ = 0 สามารถใช้คำสั่ง

print(solve(Eq(x+4,5))) #มาจากสมการ x+4=5 โดยเปลี่ยนจาก = เป็น , แทน

ผลลัพธ์

[1]

คำสั่งที่ควรรู้ คือ คำสั่ง parse_expr เป็นคำสั่ง parse จากสตริงออกมาเป็นตัวแปรที่โมดูล SymPy ยอมรับ (คำสั่ง solve ไม่ยอมรับการแก้สมการจากข้อมูลที่อยู่ในสตริง)




เรามาลงมือเขียนโปรแกรมแก้สมการเชิงเส้นด้วย SymPy กับภาษาไพทอนกันได้เลยครับ
มีโจทย์สมการเชิงเส้นโดยมีตัวแปร x , y ดังนี้
2*x+y=23
4*x-y=19
ผมต้องการหาค่า x , y มาลงมือเขียนโค้ดกันเลยครับ
ผลลัพธ์

{x: 7, y: 9}

การนำไปประยุกต์ต่อยอด
มาถึงขั้นนี้แล้ว ผู้อ่านคงนึกอะไรออกแล้ว ลองลงมือทำเลยครับ

หาเอกสารหลักของโมดูล SymPy ได้ที่ http://docs.sympy.org/latest/index.html
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)