Matlab with LaTeX interpreter

เคยต้องการพล็อตกราฟของสมการคณิตศาสตร์ด้วย Matlab ไหมครับ สิ่งหนึ่งที่น่าปวดหัวคือการผนวกสมการลงไปในกราฟด้วย เช่นอาจจะต้องการพล็อตกราฟ $$e^{2\log x}$$ แล้วต้องการเขียนสมการกำกับที่กราฟ แบบสิ้นคิดทำได้ดังนี้
จะเห็นได้ว่ารูปข้างบนไม่ต้องทำอะไรมาก ใช้คำสั่ง

 text(2,2,'exp(2log(x))')

เป็นอันเสร็จพิธี

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

text(2,2,'$e^{2\log(x)}$','interpreter','latex','fontsize',18)

ซึ่งจะได้ผลของสมการที่สวยงามดังรูป
ซึ่งวิธีการนี้ใช้ได้หมดนะครับ ไม่ว่าจะเป็นคำสั่ง xlabel, ylabel, และ title แต่ช้าก่อนมันใช้กับคำสั่ง legend ไม่ได้ และนี่เป็นที่มาของบทความนี้ ในกรณีที่เราต้องการใช้คำสั่ง LaTeX กับ legend โดยสั่งจาก Matlab โดยตรก ไม่ต้องไปใช้เมาส์คลิ๊กขวาแล้วเลือก เราจะทำอย่างไร สมมติว่าผมพล็อตกราฟ $$x^3$$ และ $$x^2$$ บนแกนเดียวกัน แล้วใช้คำสั่ง

legend('x^3','x^2');

ผมก็จะได้กราฟตามรูป

ซึ่งก็จะได้ $$x^3$$ และ $$x^2$$ ที่ดูดีพอสมควร (กรณีนี้คำสั่ง LaTeX บางคำสั่ง รวมไปถึงอักษรกรีกบางตัวจะใช้ไม่ได้) แต่ถ้าต้องการให้ $$x^3$$ และ $$x^2$$ สวยงามขึ้น เราไม่สามารถใช้วิธีการตามข้างบนได้ จะต้องทำดังนี้

s =  legend('$x^3$','$x^2$');
set(s,'interpreter','latex');

ซึ่งก็จะได้กราฟสวย ๆ ตามต้องการครับ ดังแสดงในรูปข้างล่าง

หวังว่าจะมีประโยชน์ไม่มากก็น้อยนะครับ อนึ่งรูปที่โพสลงไปเป็น png คุณภาพอาจจะไม่ดีนัก แต่ของจริงดูดี รับรอง

การดึงข้อมูลจากกราฟใน Matlab

ใช้ Matlab แล้วเคยประสบปัญหาแบบนี้ไหมครับ

“ต้องการพล็อตกราฟใหม่ให้เหมือนรูปเก่า แต่หา m-file ไม่เจอ”

และมีปัญหาต่อเนื่องมา

“มีรูปสองรูปที่พล็อตไว้แล้วต้องการเปรียบเทียบบนแกนเดียวกัน แต่ข้อมูลที่พล็อตไว้ค่าบนแกน x ไม่เหมือนกัน”

ถ้าไม่เคยมีปัญหาจำพวกนี้ ก็ขอยินดีด้วยครับ ที่คุณเป็นนักจัดการข้อมูลที่เก่งและเป็นระเบียบมาก แต่คนส่วนใหญ่ไม่ใช่อย่างนั้น บางส่วนก็แก้ปัญหาด้วยการทำใหม่ทั้งหมด ซึ่งเสียเวลามาก  บางพวกก็แก้ด้วยการไม่ทำ หรือเปรียบเทียบแบบชุ่ย ๆ (ถ้าเป็นนักเรียนนักศึกษาก็ขึ้นอยู่แต่บุญแต่กรรม บางครั้งอาจารย์ที่ปรึกษาก็ไม่ยอมกับบางงาน บางงานก็ยอมเฉย หาบรรทัดฐานไม่ได้ อาจารย์พวกนี้น่าจะไปขายโอเลี้ยงมากว่าเป็นอาจารย์ครับ เพราะโอเลี้ยงบางทีก็ให้มาก ให้น้อย แตกต่างกันตามอารมณ์) หรือไม่ก็ใช้เคลมว่าของดูเองดีอย่างโน้นดีอย่างนี้ แต่ไม่แสดงการเปรียบเทียบ

โม้ซะเยอะ ถ้าเรามีกราฟ Matlab ในมือ แล้วทำ m-file ที่ใช้งานหาย หรือหาไม่เจอ แล้วต้องการนำข้อมูลจากกราฟที่พล็อตไปพล็อตเปรียบเทียบกับข้อมูลอื่น ในคู่มือ Matlab นั้นมีวิธีการ(ซ่อน)อยู่ในคู่มือ ซึ่งน้อยคนนักที่จะหาเจอ ผมเจอวิธีการนี้ตั้งแต่ปี 2007 ได้จดบันทึกเอาไว้ วันนี้เอามาเขียนใหม่แล้วกันครับ

ให้เลือกกราฟที่เราต้องการ จากนั้นให้ใช้คำสั่ง findobj เพื่อสร้างตัวแปรวัตถุของกราฟนั้น ๆ จากนั้นก็ดึงข้อมูลในแกน x และ y มาใช้ได้เลย ตามคำสั่งข้างล่าง

pts=findobj(gca,'type','line');
x = get(pts,'XData');
y = get(pts,'YData');

ในกรณีมีข้อมูลมากกว่าหนึ่งชุด เราสามารถกำหนดเลขดัชนีสำหรับข้อมูลในกราฟได้ดังนี้

y1 = get(pts(1),'YData');
y2 = get(pts(2),'YData');

เสร็จแล้วเราก็สามารถนำข้อมูลจากกราฟไปใช้ได้ตามชอบใจครับ ความรู้ตรงนี้มีประโยชน์แน่นอนครับ อย่าลืม

Texmaker 2.1 ออกแล้ว

ก่อนอื่นก็ขอให้น้ำลดลงเร็ว ๆ นะครับ โดยเฉพาะที่หาดใหญ่

Texmaker ได้ออกเวอร์ชัน ๒.๑ ตั้งแต่เมื่อวันที่ ๒๖ ตุลาคม เวอร์ชันนี้เป็นเวอร์ชันแก้บัก คุณสมบัติหลักที่เพิ่มขึ้นมาคือ การสนับสนุน synctex ทำให้ในอนาคตการทำ Forward/Inverse Search สำหรับเอกสารที่สร้างด้วย pdflatexนั้นใกล้ความจริงขึ้นมา และก็จะเป็นคู่แข่งที่สำคัญของ Texworks  ใครสนใจใคร่ลองก็ไปหาโหลดได้ที่ Texmaker free cross-platform latex editor