1 คะแนน โดย GN⁺ 2024-03-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • หากต้องการ จัดการและคำนวณนิพจน์ทางคณิตศาสตร์โดยตรงภายในโค้ด 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 ความคิดเห็น

 
GN⁺ 2024-03-01
ความคิดเห็นจาก Hacker News
  • ในงานโรโบติกส์ มักต้องใช้เวกเตอร์ขนาดใหญ่ที่ได้จากผลลัพธ์ของการแปลง 3D และต้องคำนวณ Jacobian ซึ่งเป็นอนุพันธ์เทียบกับตัวแปรสถานะหลายตัว ทำให้สมการรกขึ้นอย่างรวดเร็ว
    ผมใช้ SymPy สร้างเวกเตอร์ขนาดใหญ่แบบ declarative คำนวณ Jacobian แล้ว export ผลลัพธ์ออกมาเป็น โค้ด C ที่นำไปใช้ในโปรเจกต์ได้ทันที
    เช่น ถ้ามีชุดข้อมูลตำแหน่งหุ่นยนต์กับตำแหน่งเซนเซอร์ และต้องการประมาณตำแหน่งเซนเซอร์อ้างอิงจากจุดศูนย์กลางของหุ่นยนต์ ก็สามารถแก้ระบบ overconstrained ด้วย gradient descent ได้ และคำนวณ residual function กับ Jacobian ที่จำเป็นด้วย SymPy

    • เคยใช้ SymPy ในลักษณะคล้ายกันเพื่อจัดการอนุพันธ์รก ๆ ที่จำเป็นสำหรับการคำนวณ orbital mechanics
      แนวทางคือเขียนสมการก่อน ปล่อยคณิตศาสตร์ที่น่าเบื่อให้ SymPy จัดการ แล้วแปลง output เป็นโค้ด C
      เหตุผลที่ไม่ค่อยเห็นโปรเจกต์ SymPy ในโค้ดผลิตภัณฑ์จริง อาจเป็นเพราะมันถูกใช้ในขั้นคำนวณกลาง ๆ แล้วมีแค่ผลลัพธ์เข้าไปอยู่ในโค้ดผลิตภัณฑ์ ส่วนโค้ดคำนวณเชิงสัญลักษณ์ถูกทิ้งไป
    • ไลบรารีนี้อาจน่าสนใจ: https://github.com/symforce-org/symforce
    • เมื่อก่อนเคยเห็นคนทำงานแบบนี้ด้วย Maple ตอนนี้ดีใจที่มี ตัวเลือกโอเพนซอร์ส แล้ว
      ในสายโรโบติกส์และ computer vision มีไลบรารีดี ๆ ที่ใช้ SymPy ทำงานแบบนี้ชื่อว่า symforce: https://github.com/symforce-org/symforce
    • วันนี้เพิ่งทำงานนี้พอดีตอนสร้าง cloth simulator
      อยากลองอัปเดตตำแหน่งของแต่ละ node ทีละตัวด้วยขั้น Newton โดยตรึง node อื่นไว้
    • สงสัยว่าเคยพิจารณา jax หรือยัง
      มันคำนวณ 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 รันในเบราว์เซอร์ได้

    • ข้อเสียใหญ่ที่สุดของ 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 ก็อยากทราบ

    • สงสัยว่ามีแอปพลิเคชันอื่นนอกจาก Maple ที่รองรับ การป้อนแบบจัดรูปตามที่เห็น เหมือน Maple หรือไม่
      เท่าที่รู้ Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage ฯลฯ ล้วนพึ่งพาข้อความแบบพิมพ์ดีดเวลาเขียนและป้อนสมการคณิตศาสตร์
      แค่เหตุผลข้อนี้ข้อเดียวก็ทำให้ Maple เป็นตัวเดียวที่เข้าถึงผมได้ เพราะสามารถป้อนในรูปแบบเดียวกับที่เขียนด้วยมือ และผมไม่เข้าใจว่าทำไมฟีเจอร์นี้ถึงไม่แพร่หลายกว่านี้
      สงสัยว่านี่เป็นอุปสรรคสำหรับคนอื่นด้วยหรือเปล่า
    • เพื่อนสนิทคนหนึ่งเคยพูดอยู่บ่อย ๆ ว่าที่ Coherence เขาสร้าง production notebook ด้วย Mathematica Notebook สำหรับคำนวณด้าน optics และความร้อน
      สำหรับเขา มันเป็นเครื่องมือทำงานหนักที่ใช้ได้จริงมาก
      นานมาแล้วผมเคยลองเล่น 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 ข้อ
    ยังมีส่วนที่ต้องไล่ตามอยู่อีกพอสมควร

    • SymPy เป็น โอเพนซอร์ส แต่ Mathematica ไม่ใช่
      อีกอย่าง 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...

    • น่าลองดู Sage Manifolds: https://sagemanifolds.obspm.fr/
      สร้างอยู่บน SageMath แต่เข้าใจว่าสามารถใช้ SymPy เป็นเอนจินคำนวณได้ด้วย
  • สำหรับ “นักฟิสิกส์” ที่ทำงานคำนวณเชิงตัวเลข SymPy ให้ความรู้สึกเหมือนเป็น ผู้กอบกู้ ทีเดียว
    เหมาะสำหรับทำต้นแบบโมเดลขั้นสูงกว่าก่อน แล้วค่อยไปปรับแต่งประสิทธิภาพใน C++ ภายหลัง
    แม้จะไม่ได้ใช้ Mathematica มากนัก แต่ยังรู้สึกว่า Mathematica มีความสามารถด้านการประมวลผลเชิงสัญลักษณ์ที่แข็งแกร่งกว่า SymPy หรือใช้งานแล้วต้องลงมือน้อยกว่า
    อยากให้คนที่มีประสบการณ์กับ Mathematica มากกว่าช่วยอธิบายความแตกต่างจริง ๆ ให้ชัดเจน

    • แม้จะแยก Stephen Wolfram ออกไปต่างหาก Mathematica ก็ยังนำหน้าทางเลือกส่วนใหญ่ในฐานะ ระบบพีชคณิตคอมพิวเตอร์ อยู่มาก
      Maple ทำได้ดีในอินทิกรัลบางประเภท
      ข้อเสียคือภาษาเหล่านั้นไม่ค่อยเหมาะจะเป็นภาษาทั่วไปนัก และเมื่อการจัดรูปพีชคณิตที่ต้องทำไม่ได้ซับซ้อนขนาดนั้น ก็จะอยากทำงานในภาษา “จริง ๆ” มากกว่า
      Python อาจไม่ใช่ตัวเลือกที่ดีที่สุด แต่ก็ใช้งานได้ดีพอ และนี่เป็นอีกกรณีหนึ่งที่ได้ประโยชน์จากระบบนิเวศทั่วไปขนาดใหญ่ของมัน
  • SymPy ทำสิ่งที่ควรทำได้
    ปกติมักใช้ภายในไลบรารีคอมบิเนทอริกส์ของ SageMath เลยสงสัยว่าวิธีนั้นยังเป็นแนวทางมาตรฐานอยู่ไหม หรือว่าตอนนี้ SymPy พัฒนามาถึงขั้นใช้เดี่ยว ๆ ได้แล้ว

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