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 คุณภาพอาจจะไม่ดีนัก แต่ของจริงดูดี รับรอง

Advertisements

Control Tutorials for Matlab

ปัจจุบันถ้าใครเข้าเว็บ Matworks บ่อย ๆ จะพบว่าตัวเว็บมีบริการทางการศึกษาฟรี ๆ ให้มากมาย เพียงแค่สมัครสมาชิกก็จะได้รับสิทธิ์เข้าไปดูไฟล์ วิดีโอต่าง ๆ มากมาย รวมทั้งไฟล์ในหนังสือต่าง ๆ ด้วย

ช่วงนี้ต้องกลับมาทำงานกับ Matlab อีกครั้ง ในขณะที่มีความตั้งใจอย่างยิ่งที่จะเปลี่ยนไปใช้ของฟรีอย่าง Scilab ที่นับวันจะยิ่งดูดีขึ้นมาก แต่ต้องขอบอกไว้ก่อนนะครับ โปรแกรมฟรี ๆ เหล่านี้ในอนาคตเมื่อมีคนนิยมมาก สิ่งที่ตามมาก็คือเรื่องของการบริการ ถ้าตัวผู้ผลิตต้องการจะบริการผู้ใช้เต็มเวลา การเรียกเก็บเงินตามค่าแรงก็คงจะมีเป็นปกติ เหมือนเช่น โปรแกรมตระกูล M พวก Maple, Mupad และ Mathematica ที่เมื่อก่อนก็ฟรี แต่ภายหลังต้องใช้เวลาในการตอบคำถามผู้ใช้มาก ๆ ก็ต้องเก็บเงินบ้าง เก็บไปเก็บมาติดใจก็เลยเก็บแพงมาก

เอาหละกลับมาที่เรื่องที่จะพูดในวันนี้ครับ Control Tutorials for Matlab

ซึ่งเป็นบริการติว Matlab ผ่านเว็บ ที่เป็นผลงานมีรางวัลของศาสตราจารย์ Dawn Tilbury คนสวย (สวยจริง ๆ เคยเจอตัวเป็น ๆ) ตอนนี้ทางเจ้าของได้เอาเวอร์ชันที่ไว้ขาย (ผมมีแผ่นที่เมืองไทย ซื้อไว้ตั้งแต่ปี 2000) มาแจกฟรีบนเว็บแล้ว (อาจจะแจกตั้งนานแล้วแต่ผมไม่ได้ดู)

สำหรับผู้ที่สนใจในวิชาวิศวกรรมระบบควบคุม เว็บนี้ดีมาก ๆ สำหรับการใช้งาน Matlab เพื่อออกแบบระบบควบคุม โดยที่ไม่พึ่งเครื่องมือแบบปิดตาใช้มือปรับอย่างเดียวแบบ LTItools เพราะการออกแบบโดยทำตามในเว็บเป็นการออกแบบที่ผู้ออกแบบพึงต้องรู้รายละเอียดในการออกแบบพอสมควร

ตัวเว็บมีตัวอย่างการออกแบบทางเครื่องมือกลต่าง ๆ มากมาย โดยใช้เทคนิคต่าง ๆ กัน รวมไปถึงการแนะนำการใช้งาน Matlab เบื้องต้นด้วย ลองใช้กันดูนะครับ

Defining the Color of Lines for Plotting

ผู้ใช้ MATLAB จะมีความรู้สึกร่วมกันอยู่อย่างหนึ่งคือ คู่มือไม่ดี วันนี้เพื่อนมาถามปัญหาที่ค้างคาใจ
อยู่นาน ซึ่งปัญาคือ

ต้องการพล็อตกราฟ โดยพล็อตกราฟทีละสิบข้อมูล โดยในแต่ละข้อมูลจะต้องมีสีต่างกัน

ไม่เคยทำนะครับ อย่างเก่งผมก็แค่พล็อตทีละสองหรือสามข้อมูลแล้วให้ MATLAB กำหนดสีให้เอง
ซึ่งจะใช้วิธีถึก ๆ ดังนี้

plot(x,y1,x,y2)

MATLAB ก็จะเลือกสีให้ ถ้าข้อมูลเพิ่มเป็นซักสามสิบหล่ะ คือมี y1 ถึง y10 ไอ้การทำแบบข้างบนนั้น
มันไม่ได้ซะแล้ว ที่สำคัญสีที่ให้โดยอัตโนมัตินั้นมีแค่ 8 สีเอง ซึ่งหนึ่งในนั้นเป็นสีขาว

เรามาเริ่มต้นทำความเข้าใจว่าเราจะพล็อตข้อมูล y1 ถึง y10 ในคราวเดียวได้อย่างไรก่อน วิธีการก็
ทำการสร้างเมตริกซ์ของข้อมูลที่จะพล็อต ตัวอย่างเช่น

x = 0:pi/20:4*pi;
A = ones(length(x),10);   % กำหนดขนาดของเมตริกซ์เพื่อเพิ่มความเร็วในการคำนวณ
for i = 1:10
A(:,i) = sin(x-i/5)’;      % เก็บข้อมูลเป็นเวกเตอร์ในคอลัมน์ของเมตริกซ์ A
end

plot(x,A);

ผลที่ได้จะเห็นได้อย่างชัดเจนว่าเริ่มมีสีซ้ำกัน ทางแก้ก็คือกำหนดสีให้ MATLAB ใหม่ดังนี้

C = zeros(10,3);

for i = 1:10
C(i,1) = 0.1*i;
end
set(gcf,’DefaultAxesColorOrder’,C);

แล้วก็ตามด้วยคำสั่งในการพล็อตกราฟข้างต้น

ผลลัพธ์ที่ได้จะเป็นดังข้างบน

และแน่นอนเราหาทางกลับไม่เจอหรอก ต้องพลิกคู่มืออีกหลายตลบแล้วก็ลองผิดลองถูก จริง ๆ ก็แค่

reset(gcf); หรือ set(gcf,’default’);

ทุกอย่างก็จะกลับไปเหมือนเดิม

หมายเหตุ: ทุกอย่างเอามาจากคู่มือของ MATLAB ทั้งหมด

Numerical Differentiation with MATLAB

ช่วงนี้กำลังกลุ้มใจมาก เพราะต้องหา Jacobian ของ Spline ปัญหาคือมันไม่สามารถหาเชิง
วิเคราะห์ได้ จำเป็นต้องหาเชิงเลขบน MATLAB เพราะต้องการหาจุดตรึงของ Spline ที่เหมาะ
สมที่สุด

ทางเลือกหนึ่งคือใช้ฟังก์ชัน fndir ซึ่งมากับ Spline Toolbox อันนี้ไม่ค่อยอยากใช้นักเพราะว่า
เครื่องที่บ้านไม่มี Toolbox อันนี้ (เวอร์ชันนักเรียน) ต้องไปใช้ที่ห้องทำงาน อีกทางเลือกหนึ่ง
ดูเป็นเรื่องทั่วไปกว่า โดยการใช้ Automatic Numerical Differentiation ของคุณ John
 D’Errico ซึ่งยังไม่รู้ว่าดีแค่ไหน

ตัวผมเองไม่ได้สนใจศึกษาเรื่อง Numerical Computing เลย จนหลัง ๆ อ่านมากชักจะชอบ
ไปเจอบทเรียน Numerical Methods in Mechanics ของ Lund University ก็ขอจดไว้
หน่อย รหัสต้นข้างล่างนี้ลอกมาแปะไว้เลย ตัวฟังก์ชันชื่อ jacobian ก็ควรจะเปลี่ยนนะครับเพราะ
ไปซ้ำกับ jacobian แบบ symbolic ของ MATLAB เค้า

function [J]=jacobian(func,x)
% computes the Jacobian of a function
n=length(x);
fx=feval(func,x);                                         %บรรทัดนี้คือการคำนวณค่าฟังก์ชันที่ x
eps=1.e-8; % could be made better
xperturb=x;
for i=1:n
   xperturb(i)=xperturb(i)+eps;
   J(:,i)=(feval(func,xperturb)-fx)/eps;     %อันนี้คือการหาค่าอนุพันธ์
   xperturb(i)=x(i);
end;

 

น่าสนุกดีเหมือนกัน