יום חמישי, 21 ביולי 2016

טיפוס סימפטי

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

נניח שיש לנו אוסף של נתונים המכיל, בין היתר, נתונים שהערכים שלהם מגיעים מתוך סט סופי של אפשרויות (הערה – אוסף הנתונים יכול להיות מורכב כולו מכאלה נתונים).

למשל, נסתכל על הטבלה a (גם table הוא טיפוס נתונים שהתווסף בגרסת R2013b). הטבלה מכילה נתונים נומרים על מדידות שונות (שתי העמודות השמאליות), וכן החלטה על הצלחה או כישלון של ניסוי (עמודה ימנית).



ניתן להפעיל את פקודת whos על המשתנה a, ולהתרשם שגודלו הינו 2418 bytes.

הצלחה או כשלון של ניסוי – זה כמובן נתון שהערך שלו מגיע מתוך סט סופי של אפשרויות, ועל כן ניתן להמיר את העמודה הזו, אשר הינה מטיפוס נתונים מסוג cell, לטיפוס מידע מסוג categorical. הנ"ל מתבצע באמצעות הפקודה הבאה (נא לשים לב להבדל לעומת הטבלה אשר הובאה למעלה):



הפעלה של פקודת whos על המשתנה a כעת, מראה שגודלו נהיה קטן יותר בעקבות הפעולה, והוא כעת 2169 bytes. לכאורה זה נראה כרווח זניח, אך אם מסתכלים רק על העמודה הימנית – מגלים שגודלה כעת הינו 58% מגודלה המקורי, וכמובן שאם העמודה הימנית היתה מורכבת ממספר גדול יותר של איברים, החסכון ב-bytes היה גדול יותר, שכן משתנה מסוג categorical צריך לאחסן מספר מצומצם של ערכים אפשריים, ולכן צורך פחות זיכרון ממערכים נומריים או ממערכים של מחרוזות (strings).

למען הסר ספק, משתנה categorical יכול להכיל יותר משתי אפשרויות, לדוגמה:




במקרים בהם המידע רב, ורוצים לדעת במהירות מה אוסף האפשרויות של משתנה ה- categorical, כל מה שנדרש לעשות הוא להשתמש בפקודה categories:




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




ניתן לשלוט על שמות הקטגוריות על ידי הכנסתם בתור קלטים נוספים לפונקציה categorical, וניתן אפילו להגדיר היררכיה בנתונים. למשל, אם הערך "1" שקול למידה "small", הערך "2" למידה "medium", והערך "3" למידה "large", ניתן להגדיר משתנה שבו יהיה ל-MATLAB ברור ש"small" קטן מ-"medium", ו-"medium" קטן מ-"large". לדוגמה (אפשר ללחוץ על התמונה להגדלה):




ובדיקה האם האיבר השני אכן גדול מהאיבר הראשון, תניב (כצפוי) תוצאה שלילית:




יש לטיפוס הנתונים categorical יתרונות נוספים, למשל, ניתן בעזרתו להפעיל כל מיני פונקציות עזר דוגמת gscatter (הצגת scatter plot של השורות השונות במידע שלנו, תוך הבדלה ויזואלית בין נקודות מקטגוריות שונות).

למעוניינים במידע נוסף על טיפוס הנתונים הסימפטי הזה – לחצו פה.

יום ראשון, 26 ביוני 2016

GUI ליצירת GUIs

ממשק משתמש גרפי (GUI) הוא חלק בלתי נפרד ממערכות תוכנה רבות. גם בשפת MATLAB ניתן לכתוב ממשקי משתמש המפעילים פונקציות MATLAB, אבל למה לכתוב, אם אפשר להשתמש בממשק משתמש אינטראקטיבי ליצירת ממשקי משתמש ?

למי שלא מכיר, את ה-GUI ליצירת GUI-ים אפשר להעלות באמצעות הפקודה guide.

נבחר באופציה Blank GUI לצורך יצירת GUI חדש, ולצורך הדוגמה – נכין GUI עם מערכת צירים בה יוצג גרף של 10 מספרים אקראיים שיוגרלו ויוצגו לאחר לחיצה על לחצן ייעודי בממשק המשתמש.
את מערכת הצירים נצייר בעזרת לחצן ה-Axes (חץ ירוק), ואת הלחצן שבעקבות לחיצה עליו יוגרלו המספרים האקראיים ויוצגו על מערכת הצירים – נצייר בעזרת לחצן ה-Push Button (חץ אדום):

GUIDE - ניתן ללחוץ להגדלה

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

אם נלחץ על לחצן ה-Push Button ב-GUI שנוצר – לא יקרה דבר – וזה הגיוני בהחלט לאור העובדה שטרם הוגדר מה בדיוק צריך לקרות בעקבות לחיצה עליו. על מנת להגדיר את הפעולה שצריכה להתבצע (הגרלת 10 מספרים אקראיים והצגתם) – אפשר לחפש בקוד ה-MATLAB שנוצר בצורה אוטומטית היכן נמצאת השורה בה יש לכתוב את שורות הקוד הרלוונטיות, אבל יותר פשוט – לחזור לסביבה בה יצרנו את ה-GUI, ללחוץ עם הלחצן הימני של העכבר על ה-Push Button, ולבחור View Callbacks ואז Callback. בעקבות כך – תסומן ב-m file שהופק שורת הקוד שלאחריה יש לכתוב:
plot(rand(10,1))
את ה-GUI המעודכן אפשר לטעון באמצעות הרצת קוד ה-MATLAB שהרגע נערך (F5), והנה התוצאה:


כמובן שניתן לקמפל את ה-GUI הנ"ל לאפליקציית Stand Alone (קובץ exe) באמצעות ה-MATLAB Compiler, לצורך העברתו למחשב בו אין רישיון MATLAB פעיל, או לארוז את ה-GUI בתור App לצורך העברתו למחשב בו מותקן MATLAB (לחצו לסרטון).

ברור גם שניתן לייצר ממשקים מורכבים יותר (עשינו שימוש רק בשניים מבין הלחצנים שב-GUIDE). למעוניינים – מומלץ לבדוק את הקישור הבא, המכיל 41 דוגמאות ליכולות שימושיות של ממשקי המשתמש הגרפיים בסביבת MATLAB (לחצו פה), וכן את ממשק ה-App Designer שהתווסף ל-MATLAB בגרסת R2016a (לחצו למידע).

יום ראשון, 29 במאי 2016

מידול פיסיקלי

אני מתכבד לארח בפעם הראשונה בבלוג הזה את אסף מוזס, מהנדס אפליקציה העובד יחד עמי בחברת סיסטמטיקס, האחראי הטכני אצלנו על תחום המידול הפיסיקלי:

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

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

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

להלן סקירה של יכולות הכלים השונים של חברת MathWorks למידול פיסיקלי:

Simscape
Simscape הינו כלי למידול וסימולציה עבור מערכות פיסיקליות רב-תחומיות, המאפשר ליצור בצורה מהירה מודלים של מערכות פיסיקליות בסביבת התכנות הגרפי Simulink, ולסמלץ אותם. בעזרת הכלי, ניתן למדל מערכות כגון מנועים חשמליים, מיישרי זרם, מפעילים הידראולים, מערכות קירור ועוד, וזאת על ידי שילוב רכיבים בסיסיים לתוך דיאגרמת בלוקים אחת.
בנוסף, Simscape עוזר לפתח מערכות בקרה ולבחון ביצועים ברמת המערכת (System-Level). בעזרת ה- Simscape Language, ניתן ליצור רכיבים, ספריות ותחומים חדשים המבוססים על בלוקים פיסיקליים גנריים. כמו כן, ניתן להשתמש בביטויים ופרמטרים מסביבת ה- MATLAB ולסגור חוגי בקרה בסביבת ה- Simulink.
כפי שנכתב לעיל, קיימים כלים מתקדמים נוספים עבור מידול פיסיקלי, כלים היושבים על גבי פלטפורמת ה- Simscape והמספקים בלוקים מורכבים יותר ויכולות ניתוח נוספות. כל הכלים הללו, וכמובן Simscape, מאפשרים יצירת קוד C מתוך דיאגרמת הבלוקים במטרה לפרוס ולהריץ את המערכות הממודלות בסביבות סימולציה אחרות (HIL: hardware-in-the-loop).
למידע נוסף - לחצו פה.

Simscape Multibody
Simscape Multibody (ובשמו הקודם: SimMechanics) מאפשר סימולציה עבור מערכות מכאניות בתלת-מימד כגון מערכות רובוטיות, מתלים לרכב, ציוד מכאני כבד ומערכות תעופתיות. בעזרת הכלי ניתן למדל מערכות מורכבות באמצעות בלוקים המייצגים חוליות, מפרקים, אילוצים, אלמנטים של כוחות/מומנטים וחיישנים. לאחר הגדרת כל האלמנטים, ניתן ליצור הדמייה תלת-מימדית ולבחון את דינאמיקת המערכת. ניתן לשלב כלי זה עם כלים פיסיקלים נוספים במטרה למדל את המערכת קרוב ככל האפשר למציאות. הכלי מגדיר ומחשב את משוואות התנועה עבור מערכת מכאנית שלמה. כמו כן, הכלי מאפשר לייבא לתוך המודל הרכבות CAD שלמות ואת המידע הרלוונטי עבורן: מסות, אינרציות, מפרקים, אילוצים וגאומטריות תלת-מימד.
למידע נוסף - לחצו פה.

Simscape Electronics
Simscape Electronics (ובשמו הקודם: SimElectronics) מספק ספריות רכיבים עבור מידול וסימולציה של מערכות אלקטרוניות ומערכות אלקטרומכאניות. הכלי כולל בלוקים המיצגים סוגי מנועים שונים, ממירי A/D, D/A, חיישנים, מפעילים ומוליכים למחצה (הרכיבים של המוליכים למחצה כוללים השפעות דינאמיות ולא לינאריות של הטמפרטורה על המערכת). ניתן להשתמש ברכיבי הכלי בכדי לפתח מערכות הפעלה אלקטרומכאניות ולבנות את התנהגות המודל במטרה להעריך ארכיטקטורות של מעגלים אנלוגים. הכלי מאפשר שילוב של תחומים פיסיקלים נוספים כגון: מכאניקה, חשמל, מעבר חום ועוד ממשפחת הכלים הפיסיקלים של Simscape. כמו כן, Simscape Electronics מאפשר פיתוח מערכות מורכבות כגון אלקטרוניקה של גוף הרכב, מכאניזם של מנועי סרבו בכלים תעופתיים, מגבירי שמע ועוד.
למידע נוסף - לחצו פה.

Simscape Driveline
Simscape Driveline (ובשמו הקודם: SimDriveline) מספק ספריות רכיבים עבור מידול וסימולציה של מערכות מכאניות מסוגים של סיבוב ו/או העתקה ומרכיבי רכב שונים כגון: מנועים, צמיגים, תמסורות גירים וממירי מומנט. ניתן להשתמש בכלי זה בכדי למדל תמסורות מכאניות מורכבות של מסוקים, ציוד תעשייתי כבד, מערכות העברת אנרגיה ועוד. בנוסף, הכלי מאפשר לשלב מערכות פיסיקליות מתחומים מגוונים: חשמל, הידראוליקה, פנאומטיקה ועוד ממשפחת הכלים הפיסיקלים של Simscape.
למידע נוסף - לחצו פה.

Simscape Fluids
Simscape Fluids (ובשמו הקודם: SimHydraulics) מספק ספריות רכיבים עבור מידול וסימולציה של מערכות נוזלים. הכלי מכיר רכיבים המתארים משאבות הידראוליות, שסתומים, מפעילים, צינורות ומחליפי חום. ניתן להשתמש בכלי זה עבור פיתוח מערכות כוח הידראוליות כגון: היגון כוח, כני נסע ועוד. הכלי מאפשר גם למדל מנועי קירור, חומרי סיכה עבור גירים ומערכות הספקת דלק. הכלי מאפשר שילוב של תחומים פיסיקלים נוספים כגון: מכאניקה, חשמל, מעבר חום ועוד ממשפחת הכלים הפיסיקלים של Simscape.
למידע נוסף - לחצו פה.

Simscape Power Systems
Simscape Power Systems (ובשמו הקודם: SimPowerSystems) מספק ספריות רכיבים עבור מידול, סימולציה וניתוח של מערכות זרם חזק (הספק). הכלי כולל מודלים של רכיבי הספק חשמליים, מכונות תלת-פאזיות, מנועים חשמליים, רכיבים לתמסורות מערכות זרם חילופין (FACTS) ורכיבים למידול מערכות אנרגיה מתחדשת. בנוסף, Simscape Power Systems מאפשר לחקור את ביצועי המערכת המתוכננת: ניתוח הרמוניות וחישוב עיוותי הרמוניות כולל (THD). הכלי מאפשר שילוב של תחומים פיסיקלים נוספים כגון: מכאניקה, חשמל, מעבר חום ועוד ממשפחת הכלים הפיסיקלים של Simscape.
למידע נוסף - לחצו פה.

מצורף תרשים מסכם של משפחת הכלים השונים של חברת MathWorks למידול פיסיקלי (ניתן ללחוץ להגדלה). כלים אלה הולכים ותופסים חלק משמעותי יותר ויותר בתהליכי פיתוח בארץ ובעולם, ומגרסה לגרסה נוספות להם עוד ועוד יכולות אשר מסייעות במידול נכון, מהיר וקל של העולם האמיתי.


יום חמישי, 21 באפריל 2016

פחית משקה אופטימלית

נניח שעליכם לתכנן פחית משקה על פי אילוצים מסויימים. למשל, גובה הפחית (h) חייב להיות קטן מ-15 ס"מ (בגלל המרווח בין מדפים בסופרמרקט). אילוץ נוסף שעליכם להתחשב בו, למשל, הוא שכמות המשקה בפחית צריכה להיות 300 מ"ל (נסמן את רדיוס הפחית באות r, ואז למעשה יש לעמוד בתנאי h*pi*r^2=300). כמו כן, משיקולי יציבות של הפחית – נדרש לשמור על יחס מסוים בין גובהה ורדיוסה – למשל, על גובה הפחית לא להיות גדול מארבע פעמים הרדיוס שלה (או, אם נעביר אגף, נקבל: 4*r-h>=0). ולסיום, משיקולי עלות של חומר הגלם המשמש לייצור מעטפת הפחית – יש למזער את פונקציית המחיר S(r,h)=2*pi*r*h+2*pi*r^2, המורכבת משטח המכסים (עליון ותחתון) ומשטח מעטפת הגליל שביניהם. אם נוציא גורם משותף ונגדיר וקטור x המכיל את משתני התכנון גובה ורדיוס, הרי שפונקצית המטרה sodaCost הינה:


האם יש דרך נוחה לפתור את בעיית האופטימיזציה הזו ?

התשובה היא כמובן כן, בעזרת MATLAB.

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

נפתח את ממשק המשתמש המוזכר לעיל בעזרת הפקודה optimtool, ונזין לתוך חלקו השמאלי את הנתונים השונים כפי שמופיע בתמונה למטה (ניתן ללחוץ עליה להגדלה). יש לשים לב שפרט לקריאה לפונקצית המחיר (תוך שימוש באופרטור ה-@), הוזנו אי-השיוויון הלינארי (שיקולי היציבות של הפחית, אחרי שהבאנו אותם לצורה A*x<=b), הגבול התחתון של פרמטרי התכנון (רדיוס וגובה אי-שליליים), הגבול העליון שלהם (כאמור גובה קטן מ-15 ס"מ, אין מגבלה על הרדיוס) האילוץ הלא-לינארי (כמות המשקה בפחית. הפונקציה fooNonLin מובאת בהמשך, וגם לה קוראים בעזרת אופרטור ה-@) וערכים התחלתיים לאלגוריתם האופטימיזציה (רדיוס של 5 ס"מ, גובה של 4 ס"מ).



לאחר לחיצה על start, מתחיל תהליך האופטימיזציה, ובתמונה הבאה ניתן לראות מה פרמטרי התכנון שנמצאו כאופטימליים (מסומן בירוק - רדיוס של 3.6 ס"מ, גובה של 7.2) ולאיזה ערך הם הביאו את פונקציית המטרה (בצהוב). את התוצאות (ואף את הגדרת הבעיה) ניתן להעביר ל-workspace באמצעות האופציה המתאימה בתפריט File.


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