Skip to main content
Global

8.2: קוד לשני מינים

  • Page ID
    208013
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    להלן קוד מחשב לדינמיקה של שני מינים - הרחבה לוגית של הקוד לדינמיקה של מין אחד שראית קודם לכן. הקוד כאן הפיק את הגרף באיור 8.1.2, ועם ערכים אחרים עבור N i, r i, s i , j, הפיק גם את הגרפים באיורים 8.1.4 ו- 8.1.6.

    N1 =.01; נ2 =.01;

    ר1 = 0.5; ר2 = 0.8;

    s11 = -0.08; s12 = -0.03; s21 = -0.09; s22 = -0.06;

    t = 0; dt =.0001; טמקס = 75; שלב = 0;

    הדפסה (ג (t, N1, N2));

    בעוד (t <tמקסימום)

    {dN1 =( R1+S11* נ1+S12* נ2) * נ1* דט;

    דנ 2 = (R2+S21* נ1+S22* נ2) * נ2* דט;

    נ1 = N1+DN1; אם (נ1 <0) נ1 = 0;

    נ2 = N2+DN2; אם (נ2 <0) נ2 = 0;

    t = t+dt; צעד = צעד+1;

    אם (שלב =1000)

    {הדפסה (c (t, N1, N2)); שלב = 0;}

    קוד זה משתמש בשלב זמן dt של 1/10,000 אך מציג רק כל שלב זמן 1000, באמצעות המשתנה בשם שלב. זוהי דרך אמינה להציג פלט מעת לעת, מכיוון שהצעד לוקח רק ערכים שלמים 0, 1, 2... צפייה במשתנה t לאותה מטרה עשויה שלא להיות אמינה; ל- t יש שגיאות עיגול בחלקו השברירי, אשר בדרך כלל מיוצג רק על ידי המחשב.

    אגב, הנה דרישה מכרעת לקידוד דינמיקה מרובת מינים: עליך לעדכן את כל ה-N i ביחד. אתה עלול להתפתות לקצר את הקוד על ידי כתיבת הדברים הבאים, להיפטר מהמשתנים dN1 ו- dN2.

    נ1 = N1 + (ר1+S11* נ1+S12* נ2) * נ1* דט; אם (נ1 <0) נ1 = 0;

    נ2 = נ2+ (R2+S21*נ1+S22* נ2) * נ2* דט; אם (נ2<0) נ2 = 0;

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

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