Maxima vs MuPAD vs Maple ตอนที่หนึ่ง


ช่วงนี้มีความจำเป็นต้องใช้ Symbolic tools ในการคำนวณต่าง ๆ หลังจากที่เคยได้ลองใช้ Mathematica เมื่อหลายปีก่อน ผมกลับมาเริ่มใช้งานโปรแกรมพวกนี้จาก Maxima ก่อน แล้วข้ามไป Maple แล้วก็พึ่งมาเห็นว่า Matlab ก็มี MuPAD แน่นอนทุกตัวที่กล่าวมามี GUI แสดงผลแบบกราฟฟิคกันหมดแล้ว ตัว Maxima น่าสนใจเพราะจากบรรพบุรุษที่ไม่ฟรี กลายมาเป็นของฟรีที่ทุกคนทั่วโลกร่วมกันพัฒนา ในขณะที่ MuPAD เคยมีเวอร์ชันแจกฟรีกลายมาเป็นสมบัติของ Matlab เต็มตัวไปซะแล้ว Matlab คงเสียใจไ่ม่น้อยที่ Maple ในปีนี้จะเปลี่ยนสัญชาติจากแคนาดาไปเป็นญี่ปุ่นแล้ว แทนที่จะเป็นอเมริกา

Maple12 Screenshot.jpg

MuPAD running on Windows Vista

WxMaxima 0.7.1 screenshot.png

เปรียบเทียบหน้าตา เรียงกันมา Maple MuPad และ Maxima

ว่าแล้วในเครื่องเมื่อมีทั้งสามตัวก็ลองเลยแล้วกัน  โจทย์ก็เอามาจาก 131 mainly mathematical problems proposed by M. Wester 1994; see http://math.unm.edu/ wester/cas/Paper.ps. กับ Maxima vs Mupad สำหรับโปรแกรมในบทความนั้นค่อนข้างเก่า และสำหรับ Maxima นั้นผมใช้ wxMaxima ซึ่งคุณสามารถคัดลอกผลลัพธ์ในรูป LaTeX ได้เลย สะดวกมาก ๆ  ในการทดสอบเครื่องมือทุกตัวรันบนเครื่องเดียวกันหมด เปิดใช้งานพร้อมกันบน windows XP ไม่พบปัญหาอะไร ส่วนโจทย์ที่ไม่น่าตื่นเต้นผมก็จะเขียนถึงสั้น ๆ นะครับ

  1. หาคำตอบของ 50! โห Matlab ตอบ 3.0414e+064 ในขณะที่ตัวอื่นให้คำตอบออกมาทั้ง 65 หลักอย่างรวดเร็ว คือ
    30414093201713378043612608166064768844377641568960512000000000000
  2. ข้อนี้ให้หาตัวประกอบที่เป็นค่าจำนวนเฉพาะของ 50! ว่าง ๆ ก็ลองทำด้วยมือสิครับ  โจทย์ข้อนี้ทุกตัวให้ผลลัพธ์เร็วมาก ๆ โดยที่ Maxima กับ Mupad ใช้คำสั่ง factor(50!) ส่วน Maple ใช้คำสั่ง ifactor(50!) ส่วนคำตอบคือ
    2^{47}\, 3^{22}\, 5^{12}\, 7^8\, 11^4\, 13^3\, 17^2\, 19^2\, 23^2\, 29\, 31\, 37\, 41\, 43\, 47
  3. ข้อสามให้หา \dfrac{1}{2} + \cdots + \dfrac{1}{10}
    • Maxima สั่ง sum(1/k, k, 2, 10);
    • ส่วน MuPad กับ Maple ใช้เหมือนกันคือ sum(1/k, k=2..10)
    • และทุกตัวให้คำตอบเป็น \dfrac{4861}{2520} ยอดเยี่ยมไปเลย
  4. ให้หาค่า e^{\pi\sqrt{165}} จำนวน 50 หลัก
    • Maxima สั่ง exp(%pi*sqrt(165)), bfloat, fpprec : 50 ; งงไปเลย
    • MuPad สั่ง DIGITS := 50: float(exp(PI*sqrt(163)))
    • ข้อนี้ Maxima กับ MuPad ให้คำตอบตรงกันคือ
      2.6253741264076874399999999999925007259719818568888B17
      262537412640768743.99999999999925007259719818568888
      ตามลำดับ ซึ่งก็คือคำตอบเดียวกัน
    • ส่วน Maple สั่ง Digits := 50 : evalf(exp(PI*sqrt(163))) แต่คำตอบที่ได้คือ 2.6253741264076874399999999999925007259719818568865 10^17
      ต่างกันที่สองหลักสุดท้าย ไม่รู้ทำไมเหมือนกัน ลองเพิ่มเป็น 60 หลัก สองตัวแรกก็ได้คำตอบเหมือนกัน แต่ Maple ก็เพี้ยนตามเคย
  5. ข้อถัดไปคือ แสดงค่าเป็นตัวเลขของ 1/7 มันง่ายมากเลยนะ ขอนี้ใช้ float สำหรับ Maxima กับ MuPad ส่วน Maple ใช้ evalf มีจุดน่าสังเกตุคือ คำตอบมันเป็น 0.142857142857…. ซึ่งจะเห็นว่าทศนิยมมันวนลูปไปเรื่อย ๆ ใน MuPad สามารถใช้คำสั่ง  numlib::decimal(1/7) แล้วจะได้ผลลัพธ์ดังนี้ 0,[1,4,2,8,5,7] ซึ่งทำให้ชนะขาดไป
  6. คำนวณหาค่าตัวเลขของ J_2(1+i) โดยที่ J คือฟังก์ชัน Bessel
    • ข้อนี้ผมไม่สามารถทำให้ Maxima หาคำตอบได้ครับ
    • Maple ใช้คำสั่ง BesselJ)2,1.0+I);
    • Mupad ใช้คำสั่ง besselJ(2,1.0+I);
    • ได้คำตอบคือ 0.0415799+0.247398I
  7. ข้อนี้ให้แสดง \pi   ในลักษณะ continued fraction  ก็ทำได้ทุกตัวนะครับคือ
    3+\dfrac{1}{7+\dfrac{1}{15+\dfrac{1}{1+\dfrac{1}{292}}}}

    • Maxima สั่ง cfdisrep(cf(float(%pi)));
    • Mupad สั่ง contfrac(PI,5)
    • Maple สั่ง with(numtheory): cfrac(PI,5);
  8. ให้แสดง \sqrt{2\sqrt{3}+4} ในรูปอย่างง่าย
    • Maxima สั่ง load(sqdnst)$ sqrtdenest(sqrt(2*sqrt(3)+4));
    • Maple กับ Mupad ใช้คำสั่งเดียวกัน simplify(sqrt(2*sqrt(3)+4),sqrt)
    • ผลลัพธ์คือ \sqrt{3}+1
  9. ให้แสดง \sqrt{14+3\sqrt{3+2\sqrt{5-12\sqrt{3-2\sqrt{2}}}}} ในรูปอย่างง่าย
    • Maxima นั้นไม่สามารถสั่งแบบเดิมได้ ต้องแก้ไขเล็กน้อยดังนี้   load(sqdnst)$ sqrtdenest(scanmap(lambda([u], radcan(sqrtdenest(u))), sqrt(14+3*sqrt(3+2*sqrt(5-12*sqrt(3-2*sqrt(2))))) )); จำเห็นว่าต้องใสตัวเลือกเพิ่มคือ scanmap(lambda[u],radcan(sqrtdenest(u)))
    • Maple กับ Mupad ก็เหมือนกันตามเคย (Matlab ฉลาด) คือสั่งแบบข้อ 7 นั่นแหละครับ
    • ผลลัพธ์ที่ได้คือ $latex\sqrt{2}+3 $
  10. ข้อนี้สุดยอดมาก ให้หาคำตอบอย่างง่ายของ 2\infty - 3 ทำมือได้ไหมครับ
    • Maxima สั่ง limit(2*inf -3);
    • Maple กับ Mupad สั่ง 2*infinity -3
    • ได้คำตอบเหมือนกันคือ \infty

ถึงข้อ 10 นี้ Mupad ชนะเลิศครับ ไว้ต่อคราวหน้านะครับ คราวนี้ขี้เกียจหล่ะ

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s