יום ראשון, 28 באוגוסט 2011

עניין של זמן (דגימה)

"הרשו לי לפנות את הבמה בפוסט הזה לטובת בלוגר אורח – רוני פאר, אשר התארח בבלוג הזה בדיוק לפני שנה. רוני עובד יחד עמי בחברת סיסטמטיקס, ומתמחה בכלי MathWorks לתחומי מערכות הבקרה והמידול הפיסי"

אחד מהיתרונות המשמעותיים של Simulink הוא שאלמנט הזמן מוטמע בו בצורה אינהרנטית. סימולינק שולט על צעד הזמן, ובשונה מ-MATLAB, לא צריך לייצר וקטור של זמנים ולהוסיף לולאה הדואגת לקדם את צעד הזמן.



ל-Simulink שני מנגנונים לקידום צעד הזמן – צעד קבוע (Fixed Step) או צעד
משתנה (Variable Step). במנגנון הראשון, ממש כמו בעולם הדיגיטלי, צעד הדגימה הינו קבוע והסימולציה תרוץ במרווחי זמן קבועים. שיטה זו מתאימה כשאנחנו רוצים לבחון אלגוריתם כפי שירוץ במימושו הסופי.



שיטת הצעד המשתנה היא לרוב המהירה יותר - במקום לדגום במרווחי זמן קבועים, אשר לרוב צריכים להיות מספיק קטנים, Simulink יכול לשנות את צעדי הזמן במרווחים גדולים, לבדוק האם השתנה משהו במודל, ובמידה וכן – הוא יחזור צעד זמן אחד אחורה, יקטין את גודל הצעד, ואז ינסה לאתר במדוייק את השינוי שאירע. כיצד הוא מבצע זאת? זה כבר נושא לפוסט אחר...


אחת המסקנות מהרשום למעלה הינה שאם אנחנו מריצים מודל Simulink, קשה לצפות מראש מה מספר צעדי הדגימה שיילקחו. אם ברצוננו לאסוף ממוצע של מספר ריצות שונות של אותו המודל – הרי שזה יכול להוביל לבעיה של ממש, שכן כל אחד מהאותות יהיה בעל אורך שונה, ויידגם בזמני דגימה שונים. ניתן כמובן לפתור בעיה זו ע"י כתיבת קוד MATLAB שיבצע סינכרון בין האותות השונים, אך יש פתרון פשוט יותר. הרי אם כתיבת קוד MATLAB היתה הפתרון – כל הפוסט הזה היה מיותר...


האלטרנטיבה הינה לבצע שימוש באובייקטי timeseries. אובייקטים אלו, הקיימים ב-MATLAB, הם וקטורי מידע הדגום לאורך הזמן, ולמעשה מכילים את השינוי הדינמי שחל באות כלשהו כפונקציה של הזמן. לאובייקטים אלו ישנן פונקציות (methods) רבות, המאפשרות לבצע פעולות כמו סינון, שינוי, דגימה מחדש, שרשור ועוד.


בקטע הקוד הבא מוצגים לדוגמא שני אותות מתוך שתי ריצות שונות של Simulink, שנדגמו בזמני דגימה שונים:


אם ברצוננו לחשב את הממוצע של אותות אלו, עלינו ליצור מהם אובייקטי timeseries:



כעת, לאחר שיצרנו אובייקטים אלו, ניתן לסנכרן בין הזמנים השונים, באמצעות שימוש ב-method שנקראת synchronize. האופציה 'Union' מגדירה כי ברצוננו לחבר את האותות, ולייצר אותות הכוללים את כל זמני הדגימה, ולא רק את החיתוך ביניהם. ניתן להגדיר כאן פרמטרים נוספים, כמו שיטת האינטרפולציה בה יש לעשות שימוש בין כל שתי דגימות זמנים שונות:
ועכשיו, כל שנותר הוא לחשב את הממוצע, ולהציג את האות החדש לצד האותות המקוריים, כאשר כולם מסונכרנים מבחינת זמני הדגימה:
והערה לסיום - ניתן לבצע את כל הפעולות שבוצעו לעיל גם על ידי שימוש ב-GUI מיוחד שפותח לצורך כך, ושאותו ניתן לפתוח על ידי הקשת tstool . ממשק זה מאפשר ליצור timeseries, להציג אותם, לשרשר אותם, לנתח אותם, ועוד. אז זכרו - אם יש לכם משימה מסויימת שאתם רוצים לבצע ב-MATLAB, תמיד אפשר לכתוב קוד - אבל לא תמיד צריך.

האם הכרתם את אובייקטי timeseries ? באילו ממשקי משתמש אחרים של MATLAB אתם משתמשים על מנת לבצע פעולות בצורה אינטראקטיבית במקום לכתוב שורות קוד?