- หากต้องการ จัดการและคำนวณนิพจน์ทางคณิตศาสตร์โดยตรงภายในโค้ด Python, SymPy รองรับทั้งการใช้งานแบบโต้ตอบและการฝังไว้ในแอปพลิเคชัน
- เป็นซอฟต์แวร์ฟรีภายใต้ ไลเซนส์ BSD โดยทั้งภาษาที่ใช้พัฒนาและภาษาที่ผู้ใช้ต้องใช้งานเป็น Python
- มี dependency เพียงตัวเดียวคือ mpmath ซึ่งเป็นไลบรารี Python ล้วนสำหรับการคำนวณเลขทศนิยมความแม่นยำตามต้องการ ทำให้ติดตั้งและนำไปใช้ได้ไม่ยุ่งยาก
- เครื่องมือด้านวิทยาศาสตร์ คณิตศาสตร์ และการพัฒนาหลายตัว เช่น Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder และ PyTorch TorchInductor ใช้ SymPy
- ขอบเขตการใช้งานครอบคลุมตั้งแต่พีชคณิตเทนเซอร์ เคมี ทฤษฎีสัมพัทธภาพทั่วไป การวิเคราะห์วงจร การเพิ่มประสิทธิภาพ พลศาสตร์ การสร้างโค้ด ไปจนถึงการรองรับ dynamic shape และ stride
ไลบรารีคณิตศาสตร์เชิงสัญลักษณ์บน Python
- SymPy คือไลบรารีสำหรับจัดการคณิตศาสตร์เชิงสัญลักษณ์ใน Python
- ให้ใช้งานได้อย่างเสรีภายใต้ไลเซนส์ BSD
- เขียนด้วย Python ทั้งหมด และภาษาที่ใช้ใน SymPy ก็เป็น Python เช่นกัน
- มี dependency เพียงตัวเดียวคือ mpmath
- mpmath เป็นไลบรารี Python ล้วนสำหรับการคำนวณเลขทศนิยมความแม่นยำตามต้องการ
- สามารถใช้เป็นเครื่องมือแบบโต้ตอบได้ และสามารถ ฝัง ในแอปพลิเคชันอื่นหรือขยายด้วยฟังก์ชันที่ผู้ใช้กำหนดเองได้
- ดูรายการฟีเจอร์ได้ที่ SymPy's features
โปรเจกต์ที่นำ SymPy ไปใช้
- รายการที่เผยแพร่เป็น รายการที่ไม่สมบูรณ์ ของโปรเจกต์ที่ใช้ SymPy และสามารถขอเพิ่มโปรเจกต์ที่ใช้งานผ่าน mailing list ได้
-
สาขาการคำนวณวิทยาศาสตร์และคณิตศาสตร์
- Cadabra: ใช้ SymPy สำหรับพีชคณิตสเกลาร์ในระบบพีชคณิตเทนเซอร์และทฤษฎีสนามควอนตัม
- ChemPy: เป็นแพ็กเกจด้านเคมีที่เขียนด้วย Python
- EinsteinPy: เป็นแพ็กเกจ Python สำหรับ ทฤษฎีสัมพัทธภาพทั่วไป ทั้งแบบเชิงสัญลักษณ์และเชิงตัวเลข
- OctSymPy: เป็นแพ็กเกจเชิงสัญลักษณ์สำหรับ Octave ที่ใช้ SymPy
- PyDy: จัดการพลศาสตร์ของระบบหลายวัตถุใน Python
- QMCPACK: โปรเจกต์ Quantum Monte Carlo บน C++ ที่ใช้ SymPy เพื่อสร้างค่ามาตรฐานสำหรับ unit test และสร้างโค้ดบางส่วน
- SageMath: เป็นระบบคณิตศาสตร์โอเพนซอร์สที่รวม SymPy ไว้ด้วย
-
เครื่องมือพัฒนาและการสร้างโค้ด
- devito: เป็น DSL เชิงสัญลักษณ์และ JIT compiler สำหรับการคำนวณ stencil ประสิทธิภาพสูง
- Optlang: เป็นแพ็กเกจ Python สำหรับแก้ปัญหาการเพิ่มประสิทธิภาพเชิงคณิตศาสตร์
- PyTorch TorchInductor: ใช้ SymPy เพื่อรองรับ dynamic shape และ stride
- Spyder: เป็นสภาพแวดล้อมพัฒนา Scientific Python และสามารถเปิดใช้งานการรองรับ SymPy แบบเต็มใน IPython Console ได้
- symjit: เป็น JIT compiler น้ำหนักเบาสำหรับนิพจน์ SymPy
- yt: เป็นแพ็กเกจ Python สำหรับวิเคราะห์และแสดงภาพข้อมูลเชิงปริมาตร โดย unyt ซึ่งเป็นระบบหน่วยของ yt ใช้ SymPy
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในงานโรโบติกส์ มักต้องใช้เวกเตอร์ขนาดใหญ่ที่ได้จากผลลัพธ์ของการแปลง 3D และต้องคำนวณ Jacobian ซึ่งเป็นอนุพันธ์เทียบกับตัวแปรสถานะหลายตัว ทำให้สมการรกขึ้นอย่างรวดเร็ว
ผมใช้ SymPy สร้างเวกเตอร์ขนาดใหญ่แบบ declarative คำนวณ Jacobian แล้ว export ผลลัพธ์ออกมาเป็น โค้ด C ที่นำไปใช้ในโปรเจกต์ได้ทันที
เช่น ถ้ามีชุดข้อมูลตำแหน่งหุ่นยนต์กับตำแหน่งเซนเซอร์ และต้องการประมาณตำแหน่งเซนเซอร์อ้างอิงจากจุดศูนย์กลางของหุ่นยนต์ ก็สามารถแก้ระบบ overconstrained ด้วย gradient descent ได้ และคำนวณ residual function กับ Jacobian ที่จำเป็นด้วย SymPy
แนวทางคือเขียนสมการก่อน ปล่อยคณิตศาสตร์ที่น่าเบื่อให้ SymPy จัดการ แล้วแปลง output เป็นโค้ด C
เหตุผลที่ไม่ค่อยเห็นโปรเจกต์ SymPy ในโค้ดผลิตภัณฑ์จริง อาจเป็นเพราะมันถูกใช้ในขั้นคำนวณกลาง ๆ แล้วมีแค่ผลลัพธ์เข้าไปอยู่ในโค้ดผลิตภัณฑ์ ส่วนโค้ดคำนวณเชิงสัญลักษณ์ถูกทิ้งไป
ในสายโรโบติกส์และ computer vision มีไลบรารีดี ๆ ที่ใช้ SymPy ทำงานแบบนี้ชื่อว่า symforce: https://github.com/symforce-org/symforce
อยากลองอัปเดตตำแหน่งของแต่ละ node ทีละตัวด้วยขั้น Newton โดยตรึง node อื่นไว้
มันคำนวณ Jacobian ได้อย่างมีประสิทธิภาพโดยไม่ต้องออกจาก Python และถ้าต้องการก็ใช้ GPU ได้ด้วย แถม API ยังเข้ากันได้กับ NumPy
SymPy ยอดเยี่ยมจริง ๆ และผมใช้เป็น เครื่องมือการสอน มาหลายปี
เหตุผลที่มองว่าเป็นตัวเลือกที่ดีที่สุดเมื่อเทียบกับ Mathematica หรือ Maple ฯลฯ คือฟังก์ชัน API ตรงกับคำกริยาที่นักเรียนใช้ตอนเรียนคณิตศาสตร์พอดี เช่น solve, expand, factor
มีทิวทอเรียลสั้น ๆ สำหรับคนเริ่มต้น: https://minireference.com/static/tutorials/sympy_tutorial.pd...
มีรูปแบบ notebook ที่รันได้ด้วย: https://colab.research.google.com/github/minireference/sympy... แบบอ่านอย่างเดียว: http://nbviewer.ipython.org/github/minireference/sympytut_no...
ถ้าอยากลองโดยไม่ต้องติดตั้ง ก็มี SymPy live shell: https://live.sympy.org/ ด้วย WebAssembly ทำให้ Python และ SymPy รันในเบราว์เซอร์ได้
เวลาจัดการสมการที่ผู้ใช้ป้อนเข้ามา จะยากขึ้นเพราะต้อง parse สมการเองเพื่อดูว่าใช้ตัวแปรอะไรบ้าง หรือให้ผู้ใช้ระบุสัญลักษณ์เองด้วยมือ
คณิตศาสตร์เชิงสัญลักษณ์ ถูกสอนน้อยเกินไปอย่างมากในระดับปริญญาตรี และแม้จะได้สัมผัส ก็มักถูกผูกกับซอฟต์แวร์ proprietary อย่าง Mathematica หรือ MATLAB
มันถูกสอนในฐานะเครื่องมือที่ขยายวิธีคิดแบบกระดาษกับปากกาได้อย่างไม่สมบูรณ์ และเมื่อจัดการเนื้อหาขั้นสูงกว่าด้วยซอร์สโค้ด ยิ่ง abstraction ลึกขึ้นก็ยิ่งไม่เสถียร
เช่น ผมทำงานในสาขาคณิตศาสตร์/วิศวกรรมที่ต้องคำนวณ tensor เยอะ โดยหลักใช้ Maxima แต่แพ็กเกจที่เกี่ยวข้องมีจำกัดและใช้งานยุ่งยาก: https://arxiv.org/pdf/cs/0503073.pdf
สำหรับการคำนวณที่ซับซ้อนกว่านี้ ตอนนี้ใช้ SymPy ไม่ใช่เพราะการประมวลผลเชิงสัญลักษณ์ดีกว่าเอง แต่เพราะ abstraction ที่ Python มีอยู่แล้ว
สักวันอาจอ่าน Principles ของ Norvig แล้วแก้ Maxima ให้ตรงกับความต้องการของตัวเอง และถ้ามีแหล่งอ้างอิงที่ดีกว่าเกี่ยวกับซอร์สโค้ด Maxima หรือ implementation ของการคำนวณ tensor รวมถึง symbolic tensor/geometric algebra ก็อยากทราบ
เท่าที่รู้ Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage ฯลฯ ล้วนพึ่งพาข้อความแบบพิมพ์ดีดเวลาเขียนและป้อนสมการคณิตศาสตร์
แค่เหตุผลข้อนี้ข้อเดียวก็ทำให้ Maple เป็นตัวเดียวที่เข้าถึงผมได้ เพราะสามารถป้อนในรูปแบบเดียวกับที่เขียนด้วยมือ และผมไม่เข้าใจว่าทำไมฟีเจอร์นี้ถึงไม่แพร่หลายกว่านี้
สงสัยว่านี่เป็นอุปสรรคสำหรับคนอื่นด้วยหรือเปล่า
สำหรับเขา มันเป็นเครื่องมือทำงานหนักที่ใช้ได้จริงมาก
นานมาแล้วผมเคยลองเล่น Derive5 ซึ่งตอนนั้นเป็น computer algebra system ที่ถูกที่สุด และได้เรียนการเขียนโปรแกรมด้วยภาษาโปรแกรมบรรทัดเดียวแปลก ๆ ที่ต้องลบช่องว่างทั้งหมดและต้องคอยระวังให้วงเล็บสมดุลเสมอ
คงต้องไปหาไฟล์เก่า ๆ มาอัปขึ้น GitHub และจริง ๆ ก็อยากนำการคำนวณเหล่านั้นมา implement ใหม่ด้วย computer algebra system ที่ทันสมัยกว่า เพื่อวาดกราฟตระกูลโค้งฟังก์ชันเลขชี้กำลังที่มีความยาวเท่ากันบริเวณใกล้จุด (0,1) ให้ละเอียดขึ้น
มีเบนช์มาร์กระหว่าง SymPy กับ Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
ดูจากผลลัพธ์ Mathematica แก้โจทย์ไม่ได้ 1,523 ข้อ ส่วน SymPy แก้ไม่ได้ 48,529 ข้อ
ยังมีส่วนที่ต้องไล่ตามอยู่อีกพอสมควร
อีกอย่าง SageMath ซึ่งพึ่งพา SymPy น่าจะเป็นผลิตภัณฑ์ที่ใกล้เคียงกว่าในฐานะคู่เทียบ และฝั่งนี้ก็เป็นโอเพนซอร์สด้วย
เช่น อยากรู้ว่าแนวทางของ SymPy มีข้อบกพร่องเชิงพื้นฐานหรือไม่
SymPy: https://en.wikipedia.org/wiki/SymPy
“How should logarithms be taught?” ใช้ Python และ SymPy: https://news.ycombinator.com/item?id=28518565#28519356
“SymPy - a Python library for symbolic mathematics” (2020): https://news.ycombinator.com/item?id=23767513
NumPy for Matlab users: https://numpy.org/doc/stable/user/numpy-for-matlab-users.htm...
SymPy vs Matlab: https://github.com/sympy/sympy/wiki/SymPy-vs.-Matlab
กำลังใช้ SymPy เหมือนเป็น เครื่องคิดเลข ร่วมกับ https://github.com/idanpa/calcpy
รู้สึกว่า SymPy แบบพื้นฐานใช้งานค่อนข้างยุ่งยากเล็กน้อย
SymPy ทำงานได้ดีมากใน Jupyter
ต่อไปนี้เป็นโน้ตบุ๊กเดโม SymPy ที่ทำเอง
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... การแก้สมการกำลังสองหลายตัวแปรและการแสดงผลสูตรคณิตศาสตร์ให้สวยงาม
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... ชีตสรุปการพล็อต NumPy/pylab แบบรวดเร็ว พร้อมตัวอย่าง SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... ตัวอย่างการทำอนุพันธ์เชิงสัญลักษณ์ของฟังก์ชัน Python เดิมด้วย SymPy เพื่อหาค่าต่ำสุดแบบรูปปิด
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... การวิเคราะห์วงจรพื้นฐานและแคลคูลัสเบื้องต้นด้วย SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... การลองปรับแต่งรูปแบบ MathJax และ SymPy หลายวิธี รวมถึงการวิเคราะห์อัลกอริทึมวงกลมของ Minsky จาก HAKMEM
เมื่อ 10 ปีก่อน ตอนสนใจ ทฤษฎีสัมพัทธภาพทั่วไป เคยอยากทำโปรแกรมง่าย ๆ สำหรับจัดการการคำนวณเชิงสัญลักษณ์ของสมการสนามของ Einstein
เป็นแนวทางที่เริ่มจากเมตริก แล้วคำนวณการเชื่อมต่อแบบ affine, เทนเซอร์ Ricci ฯลฯ และเพราะคุ้นกับ Python อยู่แล้ว SymPy จึงดูเหมือนเป็นตัวเลือกที่ดี แต่ใช้งานยากและทำให้ทำงานจริงไม่ได้
ตอนนั้นใช้ Mathematica เป็นครั้งแรกก็ทำสำเร็จได้ภายในไม่กี่ชั่วโมง จากนั้นขยายต่อและนำไปใช้กับการคำนวณจำนวนมากใน论文เรื่องหลุมดำที่ตีพิมพ์ภายหลัง
ลองเช็กตอนนี้พบว่า SymPy ในสายงานนี้พัฒนาไปมาก และมีไลบรารีดี ๆ ที่สร้างอยู่บนมันแล้ว: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
ตอนนี้ยังมีตัวอย่าง Jupyter notebook สำหรับจัดการเมตริก Schwarzschild ด้วย: https://github.com/sympy/sympy/blob/master/examples/intermed...
สร้างอยู่บน SageMath แต่เข้าใจว่าสามารถใช้ SymPy เป็นเอนจินคำนวณได้ด้วย
สำหรับ “นักฟิสิกส์” ที่ทำงานคำนวณเชิงตัวเลข SymPy ให้ความรู้สึกเหมือนเป็น ผู้กอบกู้ ทีเดียว
เหมาะสำหรับทำต้นแบบโมเดลขั้นสูงกว่าก่อน แล้วค่อยไปปรับแต่งประสิทธิภาพใน C++ ภายหลัง
แม้จะไม่ได้ใช้ Mathematica มากนัก แต่ยังรู้สึกว่า Mathematica มีความสามารถด้านการประมวลผลเชิงสัญลักษณ์ที่แข็งแกร่งกว่า SymPy หรือใช้งานแล้วต้องลงมือน้อยกว่า
อยากให้คนที่มีประสบการณ์กับ Mathematica มากกว่าช่วยอธิบายความแตกต่างจริง ๆ ให้ชัดเจน
Maple ทำได้ดีในอินทิกรัลบางประเภท
ข้อเสียคือภาษาเหล่านั้นไม่ค่อยเหมาะจะเป็นภาษาทั่วไปนัก และเมื่อการจัดรูปพีชคณิตที่ต้องทำไม่ได้ซับซ้อนขนาดนั้น ก็จะอยากทำงานในภาษา “จริง ๆ” มากกว่า
Python อาจไม่ใช่ตัวเลือกที่ดีที่สุด แต่ก็ใช้งานได้ดีพอ และนี่เป็นอีกกรณีหนึ่งที่ได้ประโยชน์จากระบบนิเวศทั่วไปขนาดใหญ่ของมัน
SymPy ทำสิ่งที่ควรทำได้
ปกติมักใช้ภายในไลบรารีคอมบิเนทอริกส์ของ SageMath เลยสงสัยว่าวิธีนั้นยังเป็นแนวทางมาตรฐานอยู่ไหม หรือว่าตอนนี้ SymPy พัฒนามาถึงขั้นใช้เดี่ยว ๆ ได้แล้ว
เพราะดูเหมือนจะขาดความสอดคล้องภายใน ทำให้วิธีทำงานน่าจะไม่คงเส้นคงวา
อยากรู้ว่าพอใช้งานจริงแล้วประเด็นนี้ให้ความรู้สึกอย่างไร