การใช้ Sympy/Python เพื่อแก้สมการและปัญหาทางคณิตศาสตร์

Sympy เป็น package ที่เกี่ยวกับสัญลักษณ์ทางคณิตศาสตร์ ใช้ในการจัดรูปสมการ, กระจายเทอม, การจัด factor, การแก้สมการและการคำนวณทาง calculus

การใช้งานเพียงแต่ import sympy เข้ามา ซึ่งทำได้สามวิธีคือ

1. import sympy as sp จากนั้นทุกๆคำสั่งของ sympy ให้ขึ้นต้นว่า sy.คำสั่งที่ต้องการ วิธีนี้จะไม่มีปัญหาเมื่อใช้คำสั่งที่มีชื่อเหมือนกันจากแพคเกจที่ต่างกัน เป็นวิธีที่ถูกต้องที่สุด

2. from sympy import * วิธีนี้ง่ายที่สุดทำให้เราพิมพ์คำสั่งของ sympy ได้โดยตรงโดยไม่ต้องพิมพ์ sympy. หรือ sy. นำหน้า แต่จะมีปัญหาหาก import หลาย package ที่มีชื่อคำสั่งตรงกันจึงไม่ควรใช้และโปรแกรมจะแจ้งเตือน แต่ถ้าคุณต้องการทดสอบ code สั้นๆเฉพาะกิจก็ใช้ได้

3. from sympy import ชื่อคำสั่ง1, ชื่อคำสั่ง2 เหมือนวิธีที่สองแต่จะ import เฉพาะคำสั่งที่ต้องการใช้โอกาสที่จะสับสนกับแพคเกจอื่นที่มีชื่อคำสั่งเดียวกันจะน้อยลง

เนื่องจากในตอนนี้เรากำลังใช้ sympy ตัวเดียวซึ่งวิธีที่ง่ายที่สุดคือแบบที่สอง แต่ตัวอย่างในบทความนี้จะใช้แบบที่สามเพื่อให้คุณเห็นที่หัวว่าต้องใช้คำสั่งใดบ้าง

สมการตัวแปรเดียว

สมมติว่าเราต้องการป้อนสมการนี้เข้าไปผ่าน sympy

f(x)=x^2+6x+8
from sympy import Symbol
x = Symbol('x')
eq = x**2 + 6*x + 8
print(eq)

ซึ่งเอาท์พุทก็คือ x**2 + 6*x + 8

สมการหลายตัวแปร

หากมีตัวแปรหลายตัวให้ใช้คำสั่ง symbols แทนจะสะดวกกว่าที่ต้องมาใช้ Symbol ทีละบรรทัด

from sympy import symbols
x, y = symbols('x y')
eq = x**2 + 6*x + y
print(eq)

ซึ่งเอาท์พุทก็คือ x**2 + 6*x + y

สมการซ้อนสมการ

หากเรามีสมการยาวๆหรือซับซ้อนเราสามารถแยกเป็นสมการย่อยๆแล้วใช้วิธีแทนที่ตัวแปร เช่น

from sympy import symbols, sqrt
x, y = symbols('x y')
y = x**2 
y = x/(x+1)*sqrt(y)
print(y)

เราต้องการสมการ $\frac{x \sqrt{x^2}}{x+1}$ แต่เราไม่ใส่เข้าไปตรงๆแต่แยกเป็น y=x2 ก่อนจากนั้นก็แทนลงในสมการ $\frac{x \sqrt{y}}{x+1}$

Sympy มีการเรียงลำดับตัวแปรใหม่

sympy มีข้อเสียอย่างหนึ่งตรงที่สมการที่พิมพ์ออกมาจะเรียงตามตัวอักษรของตัวแปร ตามกำลังสูงไปต่ำและตามด้วยตัวเลข เช่น

from sympy import symbols
x, b = symbols('x b')
eq = x**2 + 6*x + 5
print(eq)
eq = x**2 + 6*x + b
print(eq)

เอาท์พุทแรกคือ x**2 + 6*x + 5 ซึ่งตรงกับที่เราคาดหวัง แต่เอาท์พุทต่อไปคือ b + x**2 + 6*x ซึ่งผิดไปจากที่เราคาดหวังคือ x**2 + 6*x + b ทั้งนี้เพราะเทอมในสมการจะถูกจัดเรียงใหม่ตามตัวอักษรเพราะ b อยู่ก่อน x เลขยกกำลังของ x เรียงจากสูงไปต่ำจาก 2 ไป 1 ตามเดิม

ตัวอย่างของรูปสมการที่เปลี่ยนไปอีกอันหนึ่ง

from sympy import symbols
x, a = symbols('x a')
eq = (x - a)**2 
print(eq)

เอาท์พุทคือ (-a + x)**2 สมการเช่นนี้เรามักจะใช้ในกรณีที่เราต้องการให้ a เป็นตัวแปรไว้ก่อนจากนั้นค่อยมาเปลี่ยน a ทีหลัง แต่ถ้าเราไม่ print สมการออกมาก็จะไม่ใช่ปัญหาอะไร

การใช้ subs แทนที่ตัวแปร

ใช้เปลี่ยนตัวแปร

หากเรามีสมการเดิมอยู่แล้วและต้องการเปลี่ยนตัวแปรใหม่ก็ทำได้ด้วยคำสั่ง subs (substitute=แทนที่)

from sympy import symbols
x, y = symbols('x y')
eq = x**2 + 6*x + 8
eq = eq.subs(x, y)
print(eq)

ซึ่งเอาท์พุทก็คือ y**2 + 6*y + 8

การแทนที่ไม่จำเป็นต้องเป็นตัวแปรที่นิยามด้วย Symbol หรือ symbols อาจเป็นฟังก์ชั่นคณิตศาสตร์ก็ได้

from sympy import symbols, sin
x, y = symbols('x y')
eq = x**2 + 6*x + 8
eq = eq.subs(x, sin(y))
print(eq)

ซึ่งเอาท์พุทก็คือ sin(y)**2 + 6*sin(y) + 8 หรือ

sin(y)^2 + 6sin(y) + 8

ข้อสังเกต

subs ไม่ใช่คำสั่งใน package ของ sympy โดยตรงจึงไม่ต้อง import เข้ามา ตามหลักของภาษาแบบ OOP (Object-Oriented Programming ซึ่ง python เป็นหนึ่งในนั้น) คำสั่งอะไรที่นำหน้าด้วยจุดเรียกว่า method เป็นคำสั่งที่ฝังอยู่ใน object ที่อยู่ก่อนหน้าจุด ในกรณีนี้ eq คือ object ที่เป็นตัวแทนของสมการซึ่งถูกสร้างขึ้นมาจาก object ชื่อ x และ y อีกที เรา import เฉพาะ symbols (หรือ Symbol) แล้วเรียกใช้ method ของมัน

ใช้แทนค่าตัวแปร

หากแทนที่ด้วยตัวเลขก็จะเป็นการแทนค่าลงไปในสมการเพื่อหาคำตอบ

from sympy import symbols
x = Symbol('x')
eq = x**2 + 6*x + 8
print( eq.subs(x, 1) )
print(eq)

คำตอบคือ 15 และ x*2 + 6x*y + 8

หรือหากมีตัวแปรสองตัว

from sympy import symbols
x, y = symbols('x y')
eq = x**2 + 6*x*y + 8
print( eq.subs( {x:1, y:2} ) )
print( eq.subs( [ (x, 1), (y, 2) ] ) )
print(eq)

เอาท์พุทคือ 21 และ x*2 + 6x*y + 8 , โดยบรรทัดที่ 4 และ 5 เป็นการแทนค่า x=1 และ y=2 เหมือนกันให้เลือกใช้แบบใดแบบหนึ่ง

สังเกตจากสองตัวอย่างหลังว่าเราแทนที่โดยไม่เอาผลใส่กลับเข้าไปใน eq (คือไม่ได้ใช้คำสั่ง eq = eq.subs( [ (x, 1), (y, 2) ] ) ดังนั้นสมการเดิมยังคงอยู่

ข้อสังเกต

subs จะคำนวณให้เฉพาะสมการ polynomial เท่านั้นหากในสมการมีฟังก์ชั่น sin, cos, exponential หรืออื่นๆจะไม่คำนวณให้ยังคงค้างเป็นชื่อฟังก์ชั่นเอาไว้ เช่น

from sympy import Symbol, sin, cos, exp
x = Symbol('x')
eq = x**2 + 2*sin(x)*cos(x) + exp(3*x)
print( eq.subs(x, 2) )

เอาท์พุทคือ 2sin(2)cos(2) + 4 + exp(6), สังเกตว่าคำนวณเฉพาะ x**2 = 4 นอกนั้นแทนค่า x=2 ค้างเอาไว้ ซึ่งหากต้องการคำนวณให้จบต้องใช้ lambdify

ใช้ evalf คำนวณ

from sympy import sqrt, sin, pi, Symbol
print( sqrt(2).evalf() ) 
print( sin(pi).evalf() )
x = Symbol('x')
eq = x2 + 1
print( eq.evalf(subs={x:2}) ) 
print( (x2 + 1 ).evalf(subs={x:2}) )

ใช้ lambdify คำนวณ

โดยหลักการเป็นคำสั่งที่ออกแบบมาให้คำนวณเร็วขึ้น ควรใช้เมื่อมีการคำนวณแบบวนลูปกับสมการที่ซับซ้อน คำสั่งนี้อาจดูยุ่งยากกว่าเล็กน้อยเพราะเราต้องนิยามสมการให้อยู่ในรูปฟังก์ชั่นทางคณิตศาสตร์ก่อนโดยผ่านคำสั่ง lambdify

from sympy import Symbol, lambdify
x = Symbol('x')
eq=x**2
y=lambdify(x, eq) 
print( y(3) )

เอาท์พุทของ lambdify(x, eq) คือฟังก์ชั่น, x หมายถึงโดเมน, eq หมายถึง range ที่เป็นฟังก์ชั่นของโดเมน(ซึ่งในที่นี้ก็คือ x) คำสั่งนี้จึงเป็นการนิยามฟังก์ชั่น y(x) = x2, เราต้องการหาค่า y เมื่อ x=3 ซึ่งก็คือคำสั่ง y(3) เอาท์พุทคือ 9

(หรือเขียนแบบรวบรัดยุบบรรทัดที่ 3, 4 เป็น y=lambdify( x, x**2) )

หากมีโดเมนมากกว่าหนึ่งเช่น x, y ก็เปลี่ยนคำสั่งเป็น

from sympy import symbols, lambdify
x, y = symbols('x y')
eq = x**2 + 3*y
z = lambdify( [x, y], eq )
print( z(1, 2) )

เรานิยามฟังก์ชั่น z(x, y) = x2 + 3y แล้วคำนวณค่า z(1, 2) ซึ่งเอาท์พุทคือ 7

จากตัวอย่างสมการก่อนหน้าที่ทำไม่จบด้วยคำสั่ง subs

from sympy import Symbol, sin, cos, exp, lambdify
x = Symbol('x')
eq = x**2 + 2*sin(x)*cos(x) + exp(3*x)
f = lambdify(x, eq)
print( f(2) )

เอาท์พุทคือ 406.6719909974272,

การแยก factor

เรารู้ว่า

x^2+6x+8=(x+2)(x+4)

ทำโดยคำสั่ง factor

from sympy import Symbol, factor
x = Symbol('x')
eq = x**2 + 6*x + 8
eq = factor(eq)
print(eq)

เอาท์พุทคือ (x + 2)*(x + 4)

อีกตัวอย่าง

cos(x)^2-sin(y)^2
from sympy import symbols, sin, cos, factor
x, y = symbols('x y')
eq = cos(x)**2-sin(y)**2
eq = factor(eq)
print(eq)

เอาท์พุทคือ (-sin(y) + cos(x))*(sin(y) + cos(x)) หรือ

(\cos x-\sin y)(\cos x+\sin y)

การกระจายเทอม expand

หากต้องการกระจายเทอมก็ใช้คำสั่ง expand

from sympy import Symbol, expand
x = Symbol('x')
eq = (x + 2)*(x + 4)
eq = expand(eq)
print(eq)

เอาท์พุทคือ x**2 + 6*x + 8

การทำให้สมการอยู่ในรูปที่ง่ายขึ้นด้วย simplify

คำสั่งนี้เป็นคำสั่งทั่วไปที่ช่วยลดรูปสมการให้ดูง่ายขึ้นในหลายกรณีให้ผลคล้ายกับคำสั่ง factor เรารู้ว่า

x^2+yx=x(x+y)
from sympy import symbols, simplify  
x, y = symbols('x y')
eq = x**2 + y*x  
eq2 = simplify(eq)
print( eq2 )

ในกรณีนี้ simplify มีผลเหมือนคำสั่ง factor คุณลองเปลี่ยน simplify เป็น factor ใน code ตัวอย่างดูก็จะให้ผลเหมือนกัน จุดต่างคือ simplify แยกองค์ประกอบเท่านั้นแต่ไม่ได้แยก factor คุณลองเปลี่ยนบรรทัดที่ 3 เป็น eq = x**2 + 6*x + 8 จะเห็นว่า simplify ไม่ได้แยก factor เป็น (x+2)(x+4) ดังนั้นหากไม่ใช่เป็นการแยก factor ของสมการในฟอร์มแบบ polynomial คำสั่งนี้(โดยทั่วไป)จะให้ผลเหมือนกับคำสั่ง factor

อีกตัวอย่างเรารู้ว่า

x-1 = \frac{(x-1)(x+2)}{x+2}=\frac{x^2+x-2}{x+2}
from sympy import Symbol, simplify, factor
x = Symbol('x')
eq = (x**2+x-2)/(x+2)  
eq2 = simplify(eq)
#eq2 = factor(eq)
print( eq2 )

ลองสลับใช้ simplify กับ factor ดู(สลับเครื่องหมาย # หน้าคำสั่งซึ่งเป็นตัวบอกว่าคำสั่งนั้นเราไม่เอา-เครื่องหมาย comment) จะได้เอาท์พุทเหมือนกันคือ x-1, ตัวอย่างนี้แสดงให้เห็นว่าคำสั่ง factor ทำหน้าที่แบบเดียวกับคำสั่ง simplify

** ข้อแตกต่างที่แท้จริงของ simplify คือการลดรูปสมการอื่นๆที่ไม่ใช่ polynomial เช่น

from sympy import Symbol, simplify, sin, cos
x = Symbol('x')
eq = sin(x)/cos(x)  
eq2 = simplify(eq)
print( eq2 )

เอาท์พุทคือ tan(x), ลองเปลี่ยนบรรทัดที่ 3 เป็น eq = sin(x)**2 + cos(x)**2 เอาท์พุทคือ 1

ใช้ simplify แบบเร่งด่วน

ถ้าจุดประสงค์ของคุณคือต้องการทำให้สมการดูง่ายขึ้นคุณไม่จำเป็นต้องใช้คำสั่ง Symbol หรือ symbols เพื่อสร้างสัญลักษณ์ x, y, z, … ขึ้นในสมการ เช่นเราต้องการลดรูป

2sin(x)cos(x)=sin(2x)
from sympy import simplify
eq = simplify('2sin(x)cos(x)')
print( eq )

เอาท์พุทคือ sin(2*x),

สังเกตว่า หนึ่ง เราไม่ต้องนิยาม Symbol(‘x’) , สอง เราใส่สมการเข้าไปตรงๆใน simplify ได้เลยแต่ต้องอยู่ภายใต้เครื่องหมาย ” , สาม เราใช้ฟังก์ชั่น sin, cos แต่เราไม่จำเป็นต้อง import เข้ามา

ข้อสังเกต

ถ้าสร้างสมการด้วย simplify จะไม่สามารถใช้ subs หรือ lambdify เพื่อทำการคำนวณได้เพราะตัวแปรในสมการไม่มีอยู่จริง ดังนั้นคำสั่งต่อไปนี้จึงใช้ไม่ได้

from sympy import lambdify
eq = simplify('x*2+2sin(x)cos(x)+exp(3x)')
print( eq.subs(x,2) )
#f = lambdify(x, eq)
print( f(2) )

เอาท์พุทคือ NameError: name ‘x’ is not defined, เพราะการแทนที่หรือคำนวณด้วย subs หรือ lambdify (ทดลองเลือกบรรทัดที่ 3 หรือ 4)จะต้องมีการสร้างตัวแปรด้วยคำสั่ง Symbol หรือ symbols มาก่อน เพราะฉะนั้นวิธีนี้ใช้กับการลดรูปสมการเท่านั้น แต่คุณยังคงใช้ Symbol หรือ symbols ร่วมได้หากต้องการคำนวณ ตามตัวอย่างนี้หากเพิ่ม import Symbol และ x = Symbol(‘x’) ก็สามารถคำนวณได้ตามปกติ

เอกลักษณ์ทางตรีโกณมิติ

คำสั่ง expand ในตัวอย่างข้างต้นใช้ได้กับสมการแบบ quadratic เท่านั้น หากเป็นฟังก์ตรีโกณจะมีคำสั่งเฉพาะ

กระจายด้วย expand_trig

sympy กระจาย identity (เอกลักษณ์) ของฟังก์ชั่นตรีโกณ(trigonometry) ด้วยคำสั่ง expand_trig

from sympy import symbols, sin, expand_trig
x, y = symbols('x y')
eq = sin(2 * x)
eq = expand_trig(eq)  
print(eq)

เอาท์พุทคือ 2*sin(x)*cos(x)

ลดรูปด้วย trigsimp

ในทางกลับกันเราสามารถลดรูปหรือทำให้สมการง่ายลงด้วยคำสั่ง trigsimp (trigonometry simplify) ซึ่งเมื่อต้องการทำกลับจากตัวอย่างข้างต้น

from sympy import Symbol, sin, cos, trigsimp
x = Symbol('x')
eq = 2*sin(x)*cos(x)
eq = trigsimp(eq)  
print(eq)

เอาท์พุทคือ sin(2*x), สังเกตว่าใช้ simplify ตามตัวอย่างก่อนหน้าได้เหมือนกัน

อีกตัวอย่างหนึ่ง เอกลักษณ์ทางตรีโกณพื้นฐานคือ

cos^2(x)+sin^2(x)=1
from sympy import Symbol, sin, cos, trigsimp
x = Symbol('x')
eq = cos(x)**2 + sin(x)**2
eq = trigsimp(eq)
print(eq)

เอาท์พุทคือ 1, คำสั่งนี้ดูเหมือนทำการคำนวณค่า $cos^2(x)+sin^2(x)$ จริงๆไม่ใช่แต่เป็นการลดรูปเทอมดังกล่าวลงให้อยู่ในรูปที่ง่ายที่สุด(เท่าที่ sympy จะทำได้) และมีผลเหมือนกับ simplify ในตัวอย่างก่อนหน้า

ในทางกลับกันคุณอาจคาดหวังว่า expand_trig จะกระจาย 1 กลับไปเป็น $cos^2(x)+sin^2(x)$

from sympy import Symbol, expand_trig
x = Symbol('x')
eq = 1
eq = expand_trig(eq)  
print(eq)

แต่เอาท์พุทคือ 1, นั่นคือ sympy ไม่คิดว่า 1 จำเป็นจะต้องเป็น $cos^2(x)+sin^2(x)$ เสมอไป จึงไม่ทำอะไร

ใช่ว่าจะได้ตามที่ต้องการ

ลองเล่นกับเอกลักษณ์ที่ซับซ้อนขึ้น

\sin(\alpha+\beta) = \sin(\alpha)\cos(\beta) + \cos(\alpha)\sin(\beta)
\cos(\alpha+\beta)=\cos(\alpha)\cos(\beta) - \sin(\alpha)\sin(\beta)
from sympy import symbols, sin, cos, trigsimp
a, b = symbols('a b')
eq = sin(a)*cos(b)+cos(a)*sin(b) + cos(a)*cos(b)-sin(a)*sin(b)
eq = trigsimp(eq)  
print(eq)

เอาท์พุทที่เราคาดหวังคือ sin(a + b)+cos(a+b) แต่ผลที่ได้คือ sqrt(2)*sin(a + b + pi/4) หรือ

\sqrt{2}sin(a+b+\frac{\pi}{4})

ซึ่งเท่ากันแต่ไม่ตรงตามที่คาดหวัง

แสดงสมการให้ดูเป็นปกติ

ที่ผ่านมาถ้าสมการซับซ้อนมากเอาท์พุทที่แสดงใน console จะอยู่ในรูปที่ยากแก่การอ่าน เราสามารถแปลงเอาท์พุทเหล่านี้ให้อยู่ในรูปสมการปกติโดยเปลี่ยนให้เป็นรูปกราฟฟิคแบบ png ซึ่งสามารถ copy ไปแสดงในที่อื่นๆได้

from sympy import latex
from IPython.display import Image, display
from IPython.lib.latextools import latex_to_png
def equToPng(equ, show=False):
     lt = latex(equ)
     data = latex_to_png(lt, wrap=True, color='white')
     if show:
         display(Image(data=data))
x, y = symbols('x y')
eq = x**2 + 6*x*y + 8
equToPng(eq, True)
eq = sqrt(2)*sin(x)**2 + sqrt(x*y**2)/2
equToPng(eq, True)

ให้คุณ copy code ในบรรทัดที่ 1-8 แทรกเข้าไปข้างบนของทุกโปรแกรม จากนั้นเปลี่ยนคำสั่งจาก print(eq) ไปเป็น equToPng(eq, True) ก็จะได้รูปสมการปกติปรากฏใน console ซึ่งเป็นรูป png ที่สามารถ save ไว้ได้

การใช้ sympy แก้สมการ

การใช้ sympy ในการแก้สมการมีรายละเอียดมากนิดหน่อย ในตอนนี้จะยกเพียงตัวอย่างง่ายๆให้ดูก่อนโดยยังไม่อธิบายรายละเอียดคำสั่ง คุณลองทดลองเปลี่ยนสมการในบรรทัด eq = … ดู

สมการ Quadratic

สมมติเราต้องการแก้สมการ

x^2 = 4

เรารู้ว่าคำตอบคือ x = +2 หรือ -2 เมื่อต้องการให้ sympy แก้สมการให้ย้ายข้างให้เป็นศูนย์ด้านใดด้านหนึ่ง

x^2-4=0 \;\;หรือ\;\; 4-x^2=0
from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
result = solve(x**2 - 4, x)
print(result)
result = solve(4 - x**2, x)
print(result)

เอาท์พุทคือ [-2, 2] ทั้งสองกรณี (ต้องทำความเข้าใจว่าเครื่องหมาย [] ไม่ใช่หมายถึงช่วงปิดในทางคณิตศาสตร์แต่เป็นเครื่องหมายของ list ใน python) อ่านว่าคำตอบคือ -2 หรือ 2

อสมการ

ตัวอย่าง 1

x^2-4 < 0

มีคำตอบเป็น

(x-2)(x+2)<0
(x-2)<0 \;\; and \;\; (x+2)>0 \;\;=>\;\; x<2 \;\; and \;\; x>-2\\
or \\
(x-2)>0 \;\; and \;\;(x+2)<0 \;\;=>\;\; x>2 \;\;and\;\;x<-2

คำตอบคือช่วงเปิด (-2, 2)

from sympy import Poly, Symbol, solve_poly_inequality
x = Symbol('x')
eq = x**2 - 4 < 0
lhs = eq.lhs
p = Poly(lhs, x)
rel = eq.rel_op
result = solve_poly_inequality(p, rel)
print( result )

เอาท์พุทคือ [Interval.open(-2, 2)] หมายถึงช่วงเปิด (-2,2)

ตัวอย่าง 2

\frac{x-2}{x+2}<0

มีคำตอบเป็น

x-2<0 \;\;and\;\; x+2>0 \\
or \\
x-2>0 \;\;and\;\; x+2<0

ซึ่งก็คือช่วงเปิด (-2, 2) เหมือนตัวอย่างก่อนหน้า

from sympy import Poly, Symbol, solve_rational_inequalities
ieq = ((x-2)/(x+2)) < 0
lhs = ieq.lhs
numer, denom = lhs.as_numer_denom()
pn = Poly(numer)
pd = Poly(denom)
rel = ieq.rel_op
result = solve_rational_inequalities( [[((pn, pd), rel)]] )
print( result )

เอาท์พุทคือ [Interval.open(-2, 2)] หมายถึงช่วงเปิด (-2,2)

ตัวอย่าง 3

e^x>1

คำตอบคือช่วงเปิด (0, ∞)

from sympy import Symbol, solve_univariate_inequality, exp
x = Symbol('x')
ieq = exp(x) > 1
result = solve_univariate_inequality(ieq, x, relational=False)
print( result )

เอาท์พุทคือ Interval.open(0, oo)

สรุป

คงจะพอให้เห็นภาพรวมของการใช้ sympy กับงานทางคณิตศาสตร์ ง่ายๆคือเริ่มจากการเขียนสัญลักษณ์(symbolic หรือ sym ตามชื่อ package)ก็จะได้สมการจากนั้นก็ค่อย expand, factor, caculate และ solve ตามต้องการ ให้ลองทดลองเปลี่ยนสมการเล่นดู รายละเอียดที่ซับซ้อนพบได้ในตอนต่อไป