סיכום הרצאה - אוניברסיטת בר-אילן

‫© אגף התקשוב‪ ,‬אוניברסיטת בר אילן‬
‫ד"ר סמדר שץ‬
‫קורס תוכנת מטלב ויישומיה‬
‫קורס תוכנת מטלב ויישומיה‬
‫שיעור מס' ‪ :10‬פונקציות כארגומנטים‬
‫ביצוע חוזר של פעולה ללא לולאה‬
‫קיימות במטלב פקודות לביצוע פעולה מסוימת על סדרה של נתונים‪ ,‬כאשר לא ניתן להשתמש ביכולות הרגילות של‬
‫מטלב לטיפול במערכים‪ .‬המתכנת צריך לספק לפקודות אלה הגדרה כלשהי של הפעולה אותה הוא רוצה לבצע על כל‬
‫נתון בסדרה‪ .‬הגדרה זו נתונה ע"י פונקציה המבצעת את הפעולה‪ ,‬והיא מועברת לפקודה כארגומנט קלט מסוג‬
‫‪.function handle‬‬
‫מנגנון כללי זה נקרא ‪ callback‬ומשתמשים בו בכל פעם שמטלב מבצע אלגוריתם כללי‪ ,‬כאשר המתכנת מגדיר על‬
‫מה ייושם אלגוריתם זה‪( .‬במקרה של ביצוע פונקציה על סדרה של נתונים‪ ,‬האלגוריתם הוא לולאה שעוברת על כל נתון‬
‫ומפעילה עליו את הפונקציה)‪ .‬דוגמאות נוספות לכך נרא ה בהמשך שיעור זה וכן בשיעור הבא‪ ,‬על כתיבת ממשקי‬
‫משתמש‪.‬‬
‫פעולה בין מערך חד‪-‬ממדי לכל השורות או העמודות של מערך דו‪-‬ממדי‬
‫הפקודה )‪ bsxfun(fun,A,B‬מבצעת את הפונקציה ‪ fun‬בין המערכים ‪ A,B‬כאשר יש למערכים אלה מימד משותף‪.‬‬
‫הפונקציה ‪ fun‬מקבלת שני מערכים עם מימדים זהים ומבצעת את הפעולה בין איברים מתאימים משני המערכים‪.‬‬
‫;)‪x = linspace(0,5,1000‬‬
‫◄דוגמא ‪:1‬‬
‫יצירת סיגנל שיני‪-‬משור ע"י הטור‪. U N x    8n sin 22nx  :‬‬
‫‪n1  4n  1‬‬
‫))‪plot(x,d10sawtooth(x,20‬‬
‫‪N‬‬
‫‪4‬‬
‫‪3‬‬
‫הפונקציה ‪ d10sawtooth‬מקבלת כארגומנטים מערך ‪-‬שורה של ערכי‬
‫‪2‬‬
‫‪ x‬ואת מספר האיברים בטור ‪ ,N‬ומחזירה את ערך הטור מחושב עבור‬
‫‪1‬‬
‫כל ערכי ‪.x‬‬
‫‪0‬‬
‫המטריצה ‪ sin 2nx ‬תלויה בסדרת ערכי ‪( 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,...‬המשוואות הן ביטויים לא‪-‬אלגבריים‪:‬‬
‫‪Eq1x, y, z,...  0‬‬
‫‪Eq 2x, y, z,...  0‬‬
‫‪Eq3x, 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  Gt ‬‬
‫‪dt‬‬
‫‪dGt ‬‬
‫‪ Gt   cG W t   kG  pG  Dt ‬‬
‫‪dt‬‬
‫‪dDt ‬‬
‫‪ Dt   cD  Gt   kD  pD  Lt ‬‬
‫‪dt‬‬
‫‪dLt ‬‬
‫‪ Lt   cL  Dt   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‬‬