© אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ קורס תוכנת מטלב ויישומיה קורס תוכנת מטלב ויישומיה שיעור מס' :10פונקציות כארגומנטים ביצוע חוזר של פעולה ללא לולאה קיימות במטלב פקודות לביצוע פעולה מסוימת על סדרה של נתונים ,כאשר לא ניתן להשתמש ביכולות הרגילות של מטלב לטיפול במערכים .המתכנת צריך לספק לפקודות אלה הגדרה כלשהי של הפעולה אותה הוא רוצה לבצע על כל נתון בסדרה .הגדרה זו נתונה ע"י פונקציה המבצעת את הפעולה ,והיא מועברת לפקודה כארגומנט קלט מסוג .function handle מנגנון כללי זה נקרא callbackומשתמשים בו בכל פעם שמטלב מבצע אלגוריתם כללי ,כאשר המתכנת מגדיר על מה ייושם אלגוריתם זה( .במקרה של ביצוע פונקציה על סדרה של נתונים ,האלגוריתם הוא לולאה שעוברת על כל נתון ומפעילה עליו את הפונקציה) .דוגמאות נוספות לכך נרא ה בהמשך שיעור זה וכן בשיעור הבא ,על כתיבת ממשקי משתמש. פעולה בין מערך חד-ממדי לכל השורות או העמודות של מערך דו-ממדי הפקודה ) bsxfun(fun,A,Bמבצעת את הפונקציה funבין המערכים A,Bכאשר יש למערכים אלה מימד משותף. הפונקציה funמקבלת שני מערכים עם מימדים זהים ומבצעת את הפעולה בין איברים מתאימים משני המערכים. ;)x = linspace(0,5,1000 ◄דוגמא :1 יצירת סיגנל שיני-משור ע"י הטור. U N x 8n sin 22nx : n1 4n 1 ))plot(x,d10sawtooth(x,20 N 4 3 הפונקציה d10sawtoothמקבלת כארגומנטים מערך -שורה של ערכי 2 xואת מספר האיברים בטור ,Nומחזירה את ערך הטור מחושב עבור 1 כל ערכי .x 0 המטריצה sin 2nx תלויה בסדרת ערכי ( nמערך עמודה) וערכי x -1 (מערך שורה) .כדי לכפול כל עמודה במטריצה בעמודת המקדמים, -2 -3 נשתמש בפקודה .bsxfun 5 4.5 4 3.5 3 2.5 2 1.5 1 0.5 0 -4 פעולה על כל אחד מן התאים במערך-תאים הפקודה ) cellfun(fun,C1,C2,...מבצעת את הפונקציה funבהתאמה בין התאים במערכי-התאים .C1,C2,...מספר מערכי התאים הוא כמספר משתני הקלט של הפונקציה .funהתוצאה היא מערך אחד מסוג אחד ,כאשר הדבר אפשרי. במידה ולא ,יש לציין 'uniformOutput',falseואז תוצאת כל פעולה בין התאים בהתאמה מציירת תא נפרד ,ותוצאת הפקודה היא מערך-תאים. עמ' 1מתוך 7 })H = {'abc' rand(5,1) eye(2 ;f3 = @(x) numel(x)>3 )g3 = cellfun(f3,H =H ''abc ][5x1 double ][2x2 double =g3 0 1 1 ;)]ff = @(x) x([1 end )cellfun(ff,H,'uniformOutput',false = ans ''ac ][2x1 double ][1x2 double שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ דרכים ליצירת function handle כאשר מגדירים פונקציה אנונימית ,מקבלים משתנה שהוא .function-handle במקרים רבים החישוב לא ניתן לביצוע בפקודה אחת ,ואז יש צורך לכתוב פונקציה בפורמט מלא. אם קיימת פונקציה עם שורת-כותרת בשם ,fcnאז ה handle-שלה הוא .@fcn ניתן ליצור function-handleלפונקציה בשם נתון ,שמוגדרת באחת מן האפשרויות הבאות: פונקציה ראשית בקובץ נפרד (אשר נמצא ב.)path- פונקציה משנית באותו קובץ (שבו מגדירים את ה.)handle- פונקציה פנימית (לפונקציה שבה מגדירים את ה.)handle- ביצוע אלגוריתמים באנליזה נומרית על ביטוי מתמטי כללי התכנסות בשיטת ההצבה :משוואה כללית בדוגמא מס' 1בשיעור על פונקציות (מס' )8הוצגה הפונקציה d8lionשמחשבת את פתרון המשוואה f(x)=0ע"י שיטת "אריה במדבר" .המשוואה הוגדרה בפונקציה נפרדת בשם נתון .d8my_fun :צורה זו מאפשרת גמישות בהגדרת הפונקציה (יש לשנות רק ב d8my_fun-ולא בפונקציה d8lionהמבצעת את האלגוריתם) אבל היא עדיין מגבילה את השימוש לפונקציה בשם נתון .צורה זו מתאימה לפונקציות שנכתבות ע"י המתכנת אבל לא לפונקציות מובנות במטלב. הפתרון לקושי זה הוא שימוש ב function-handle-כארגומנט-קלט לפונקציה המבצעת את אלגוריתם ההתכנסות ( d8lionבדוגמא זו) .מאחר ש function-handle-הוא משתנה לכל דבר ,ניתן להעבירו לפונקציה כפי שמעבירים כל משתנה קלט אחר. ◄דוגמא :2שימוש ב פונקציה אנונימית בדומה לדוגמא 1בשיעור ,8הפונקציה d10lionמחשבת פתרון למשוואה f(x)=0עד דיוק epsilonומספר מקסימלי של איטרציות ,MaxItersובהינתן תחום חיפוש התחלתי .r0הפונקציה מחזירה 3משתני פלט :הפתרון ,מס' האיטרציות שבוצעו ,וכן האם הושגה התכנסות .חישוב המשוואה נעשה באמצעות הפונקציה אשר ה handle-שלה הוא .fכאן אין צורך להעביר לפונקציה d10lionאת הפרמטר pמאחר שהוא "מוטבע" בתוך הפונקציה .f פתרון המשוואה epx-x=0עבור p=0.5 פתרון המשוואה ) x=cos(axעבור a=1 עמ' 2מתוך 7 ;p = -0.5 exp_p = @(x) exp(p*x)-x = exp_p @(x)exp(p*x)-x )][x,n]=d10lion(exp_p,0.001,9,[0.5 1 = x 0.7041 = n 9 ;a = 1 cos_a = @(x) cos(a*x)-x = cos_a @(x)cos(a*x)-x )][x,n,flag]=d10lion(cos_a,0.001,20,[0 1 = x 0.7393 = n 10 = flag 1 שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ אם לא ניתן להגדיר את הביטוי המחושב )][c,n,flag]=d10lion(@d10spiral,0.001,20,[1 2 כפונקציה אנונימית ,ניתן להפוך פונקציה = c 1.9521 הכתובה בקובץ ל.function handle- = n 1 ◄דוגמא :3שימוש ב.function handle- 10 = flag 1 0.5 נחפש את מספר הפיתולים של ספירלה אשר 0 אורכה שווה להיקף מעגל ברדיוס הספירלה. -0.5 הפונקציה d10spiralמחשבת את ההפרש בין -1 אורך הספירלה של nפיתולים ,להיקף מעגל -1.5 ברדיוס שלה. 1.5 2 1 0.5 0 -0.5 -1 -1.5 כל פקודות מטלב המבצעות אלגוריתמים נומריים על ביטוי התלוי במשתנים ,מקבלות את הביטוי בצורת function- .handleסדר ההפעלה הוא: האלגוריתם הנומרי של מטלב מטפל רק פונקציה לחישוב ביטוי (משתמש) אלגוריתם נומרי (מטלב) הסביבה הקוראת (משתמש) במשתנה -הבעיה .xלכן יש להגדיר ב פונקציה לחישוב הביטוי רק את משתני הקלט שמטלב מטפל בהם. פקודות מטלב באנליזה נומרית המקבלות פונקציות כארגומנטים fzero מציאת פתרון נומרי של משוואה עם נעלם אחד f(x)=0 fminsearch מציאת מינימום של פונקציה של מספר ארגומנטים )f(x,y,z,... quad quadl quadgk quadv אינטגרציה נומרית (ההבדל בין הפקודות השונות הוא בשיטה הנומרית) ode45 ode15s ode23tb פתרון נומרי של מערכת מד"ר ,בעיית ערכי-התחלה ()IVP (ההבדל בין הפקודות השונות הוא בשיטה הנומרית) פתרון משוואה טרנסצנדנטית עם נעלם אחד )x=fzero(fcn,x0 מציאת = xנקודה בה ) fcn(xמשנה סימן. אם x0סקלר ,אז הוא נקודת ההתחלה לחיפוש הפתרון. אם x0מערך עם שני איברים ,אז הם מציינים את גבולות המרווח לחיפוש הפתרון. קביעת פרטי מהלך הפתרון opt :הוא structureהמציין אופציות שונות )x=fzero(fcn,x0,opt (השדות מפורטים בתיעוד). )opt=optimset(pname,pvalue מתן ערך לשדה pnameב structure-האופציות. ;a = 1 zcos=@(x) cos(a*x)-x = zcos דוגמאות פתרון המשוואה ) x=cos(axעבור a=1 @(x)cos(a*x)-x )fzero(zcos,1 = ans 0.7391 עמ' 3מתוך 7 שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ ;)opt_strc=optimset('TolX',0.01 )fzero(zcos,1,opt_strc = ans חישוב עד דיוק של ( 0.01במקום ברירת המחדל) 0.7341 חיפוש מינימום במרחב רב-ממדי נתונה פונקציה של מספר משתנים .f(x,y,z,...) :מחפשים x0,y0,z0...עבורם הפונקציה מינימלית. במטלב מגדירים פונקציה ) f(rכאשר rמערך הארגומנטים r1=x,r2=y,r3=z... :ומעבירים handleלפונקציה זו כארגומנט לפקודת fminsearchשמחפשת את המינימום. )rmin = fminsearch(f,r0 מציאת מינימום לפונקציה fעם ניחוש ראשוני .r0 )[rmin,fmin] = fminsearch(f,r0 קבלת ערך הפונקציה בנקודת המינימום: )r = fminsearch(f,r0,opt קביעת פרטי מהלך הפתרון opt :הוא structureהמציין אופציות שונות (השדות מפורטים בתיעוד) .נקבע ע"י פקודת .optimset d10banana ◄דוגמא :4חקירת הביטוי: = rmin f(x,y) = a(y-x2)2+(b-x)2 4.0000 הסקריפט d10bananaמחשב ומציג את 2.0000 = fmin הביטוי עבור תחום של ערכי .x,y 7.1040e-11 מוצא את נקודת המינימום ע"י fminsearch ומציג אותה על הגרף. פתרון של מערכת משוואות טרנסצנדנטיות נתונה סדרה של משוואות בנעלמים .x,y,z,...המשוואות הן ביטויים לא-אלגבריים: Eq1x, y, z,... 0 Eq 2x, y, z,... 0 Eq3x, y, z,... 0 וכו' .יש למצוא את הנעלמים עבורם הביטויים מתאפסים. עמ' 4מתוך 7 שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ מגדירים מערך pשהוא סדרת הנעלמים. לצורך החישוב מגדירים את פונקציות-מטלב הבאות: .1פונקציה שמקבלת את סדרת הנעלמים pומחזירה מערך ,שבו האלמנט ה-nי הוא צד שמאל של )eqn(p משוואה .n )S=@(p) sum(eqn(p).^2 )psolution=fminsearch(S,p0 .2פונקציה לחישוב השגיאה ,לה מחפשים מינימום :מאחר שהצבת הפתרון במשוואות מאפס אותן ,אם יימצא פתרון אז הוא יביא למינימום את סכום ריבועי איברי המערך. ◄דוגמא :5נפתור את מערכת המשוואות: x2 y 2 1 0 ex y 0 ;])eqn=@(p) [p(1)^2+p(2)^2-1,exp(p(1))-p(2 ;)S=@(p) sum(eqn(p).^2 )]psolution=fminsearch(S,[0.5 0.5 = psolution -0.0000 1.0000 פתרון מערכות של מד"ר מערכת של מד"ר מסדר ראשון היא סדרה של ביטויים עבור הנגזרת הראשונה של פונקציות )( y1(x),y2(x),…yN(xהנעלמים): y1 f1 x, y1 , y 2 ,... y N y 2 f 2 x, y1 , y 2 ,... y N פתרון נומרי של המשוואות הוא חישוב ערכי הפונקציות בסדרה של ערכי המשתנה הבלתי תלוי xבתחום מבוקש. ... y N f N x, y1 , y 2 ,... y N )dy = fcn(x,y במטלב מגדירים מערך yופונקציה: xמשתנה בלתי-תלוי y ,ערכי הפונקציות בנקודה dy ,xערכי הנגזרות בנקודה x )[t,Y] = solver(fcn,tspan,y0 פתרון מד"ר (אחת או יותר): ) fcn(t,yפונקציה המגדירה את המד"ר tspanערכים לאינטגרציה .אם מערך בן שני איברים ,אז מציין התחלה וסוף .אם יותר ,מציין את הערכים עצמם. solverפונקציה לביצוע האלגוריתם ,למשל ,ode45 ,ode23tb ,ode15sאו כמפורט בתיעוד. y0ערכי הפונקציות בנקודת ההתחלה .מס' האיברים ב- y0צריך להשתוות למספר הערכים ש fcn-מחזירה. )opts = odeset('poperty1,value1,... שליטה על מהלך החישוב: )[t,Y] = solver(fcn,tspan,y0,opts הערכים האפשריים ב opts-מפורטים בתיעוד. מד"ר מסדרים גבוהים יותר ,בהן נתונים ערכי הפונקציה וערכי הנגזרות מכל הסדרים בנקודת ההתחלה ,ניתן להמיר למערכות של משוואת מסדר ראשון ע"י הוספת פונקציות ומשוואות. למשל ,כדי לפתור משוואה אחת מסדר שלישי: y f y, y, y, x נגדיר: y 2 y y1 y y0 y y0 y1 y1 y 2 ונקבל מערכת של 3משוואות עם 3נעלמים: y 2 f y 2 , y1 , y0 , x ;fdy = @(t,y) -y^2 ◄דוגמא :6פתרון המשוואה y''=-y2 ;)[t,y]=ode45(fdy,[0 10],1 עם תנאי התחלה :y(0)=1, y'(0)=10 עמ' 5מתוך 7 שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ ;])semilogy(t,y), yL=[min(y) max(y solution of y'=-y2 )title('solution of y''=-y^2','fontsize',20 1 0.9 0.8 0.7 )set(gca,'Ylim',yL,'Ytick',0.1:0.1:1 0.6 0.5 0.4 0.3 0.2 0.1 10 9 8 7 6 5 3 4 2 0 1 העברת פרמטרים לפונקציה עליה מפעילים את האלגוריתם פונקציות מטלב המבצעות אל גוריתמים נומריים מפעילות את הפונקציות שהמשתמש מעביר להן עם ארגומנטים שרלוונטיים לאלגוריתם עצמו בלבד .בדרך כלל פונקציות-המשתמש מקבלות גם ארגומנטים שהם פרמטרים (משתנים שנשארים קבועים במהלך ביצוע האלגוריתם) .מאחר שאין למשתמש גישה לתהליך ביצוע האלגוריתם ,יש להעביר פרמטרים באחד מן האופנים הבאים: פונקציה אנונימית אם ניתן לבצע את החישוב בפקודה אחת ,יש להבנות את הפרמטרים בתוך הגדרת הפונקציה ,כפי שמודגם למעלה. במקרה של חישוב מורכב שלא ניתן לבצעו בפקודה אחת ,קיימות שתי אפשרויות להעברת פרמטרים: פונקציית "מעטפת" פונקצי ה של יותר מפקודה אחת (ויכולה להיות גם עשרות שורות קוד) מחשבת את הביטוי עליו )my_calc(x,p רוצים לבצע את האלגוריתם הנומרי שתלוי ב .x-הפונקציה מקבלת כארגומנט גם פרמטרים .p בסביבה הקוראת ,ערכי הפרמטרים pידועים .נגדיר פונקציה: )fcn=@(x) my_calc(x,p הפונקציה fcnכוללת כבר את הפרמטרים ,כפי שראינו בדוגמאות למעלה .על פונקציה זו מפעילים את האלגוריתם הנומרי ע"י שימוש בפקודת מטלב המתאימה. ◄דוגמא :7פתרון מד"ר המתארות דינמיקה של אוכלוסיות במערכת אקולוגית ( water, grass, deer, .)lions הפונקציה d10equationsמחשבת את הנגזרות, בהינתן כמות האוכלוסיות .פוקציה זו תלויה בפרמטרים של הסימולציה ,אך לא בזמן .כדי להשתמש בפונקציה זו לפתרון המשוואות במטלב ,יש לכתוב פונקציית dW t S pW Gt dt dGt Gt cG W t kG pG Dt dt dDt Dt cD Gt kD pD Lt dt dLt Lt cL Dt kL dt מעטפת שמקבלת את הארגומנטים t,yלפי הפורמט של מטלב ,ומעבירה ל d10equations-את הארגומנטים המתאימים. עמ' 6מתוך 7 שיעור 10 מאי 15 קורס תוכנת מטלב ויישומיה © אגף התקשוב ,אוניברסיטת בר אילן ד"ר סמדר שץ d10ecology הסקריפט d10ecologyמאתחל את הפרמטרים של הסימולציה ,מגדיר את פונקציית המעטפת וכן את 350 הפרמטרים לתוכנית הפתרון של מטלב. 300 250 200 150 100 50 100 90 80 70 60 50 40 30 20 10 0 0 פונקציה פנימית בסביבה ממנה מפעילים את פקודת מטלב שמחשבת את האלגוריתם הנומרי ,יש פונקציה פנימית ) my_calc(xעם כמה פקודות המחשבת את הביטוי עליו רוצים לבצע את האלגוריתם הנומרי שתלוי ב .x-הפונקציה משתמשת בחישוב גם במשתנה פרמטרי ,pאבל pאינו ארגומנט אלא משתנה משותף לפונקציה ולסביבה הקוראת .בסביבה הקוראת, ערכי הפרמטרים pידועים .לכן כאשר פקודת מטלב מפעילה את ) ,my_calc(xלמשתנה pבתוך הפונקציה כבר יש ערך (אותו קיבל בסביבה הקוראת). ◄דוגמא :8נבצע את הדוגמא הקודמת ,פתרון מערכת משוואות של אוכלוסיות ,באמצעות פונקציה פנימית .הפונקציה הראשית היא .d10internal עמ' 7מתוך 7 שיעור 10 מאי 15
© Copyright 2024