Dynamische Prozesse 
und Wachstumsmodelle

Freies Wachstum 

FreiesWachstumNtesElement(B0, g, s, n) := 
block([B, q], 
 B:B0, q:1+g-s, 
 for i:1 step 1 thru n do B:B*q,
return(B));

FreiesWachstumNtesElement(1,2,0,10);

FreiesWachstumAnfangsstueck(B0, gr, sr, n) :=  
block([B:B0, G:0, S:0, L:[[0,0,0,B0]] ], 
 for i:1 thru n do    /* step 1 kann weggelassen werden */  
  (G : gr*B,    S : sr*B,    B : B+G-S, 
   L : append(L, [[i, G, S, B]]) ),  
return(L) );

FreiesWachstumAnfangsstueck(1,2,1,15);

FreiesWachstumAnfangsstueck(5,2.15,0.96,15);

Freies_Wachstum_mit_Tabellen_Ausdruck(B0, gr, sr, n) :=  
block([B:B0, G:0, S:0, L:[[0,0,0,B0]] ], 
 print( " i        G             S             B"),
 for i:1 thru n do 
  (G : gr*B,    S : sr*B,    B : B+G-S,
   printf(true, "~2d ~13,4f ~13,4f ~13,4f ~%", 
                   i, G, S, B) 
  /* in printf:  ~2d :  drucke Ganzzahl, 2 Stellen, rechtsbündig 
             ~13,4f :   drucke Kommazahl (float) rechtsbuendig, 
             13 Stellen insgesamt, davon 4 Nachkommastellen */ 
 ) );

Freies_Wachstum_mit_Tabellen_Ausdruck(1,2,1,15);

FreiesWachstumAnfangsstueckTabellenAusdruck(1,2.15,0.85,12);

F : FreiesWachstumAnfangsstueck(1,2.15,0.85,12);

F;

F1 : map(first, F);

F4 : map(last, F);

wxplot2d([discrete, F1, F4]);

wxplot2d([discrete, map(first, F), map(last, F)]);

wxplot2d([discrete, map(first, FreiesWachstumAnfangsstueck(1,2.15,0.85,12)), 
                  map(last, FreiesWachstumAnfangsstueck(1,2.15,0.85,12))]);

FreiesWachstumGraphischeAusgabe(B0, gr, sr, n) := 
block([F, F1, F4], 
 F : FreiesWachstumAnfangsstueck(B0, gr, sr, n), 
 F1 : map(first, F), 
 F4 : map(last, F),
 wxplot2d([discrete, F1, F4])
);

FreiesWachstumGraphischeAusgabe(1,2.15,0.85,15);

Logistisches Wachstum

LogistischesWachstumNtesElement(B0, gr, mr, n) := 
 block([B : B0],
  for i:1 thru n do B : B + gr*B - mr*B*B ,  
  return(B)  );

LogistischesWachstumNtesElement(20, 0.08, 0.0001, 100);

LogistischesWachstumAnfangsstueck(B0, gr, mr, n) := 
 block([B : B0, G : 0, S : 0, L : [[0, 0, 0, B0]] ], 
  for i:1 thru n do (G : gr*B, S : mr*B*B, B : B+G-S,  
   L : append(L, [[i, G, S, B]]) ), 
    return(L) );

LogistischesWachstumAnfangsstueck(20, 0.08, 0.0001, 10);

TabellenAusdruck(Wachstumsliste) :=  
block([W : Wachstumsliste, W1 : [] ], 
 print( " i        G             S             B"),
 while not emptyp(W) do 
  (W1 : first(W),  
  printf(true, "~2d ~13,4f ~13,4f ~13,4f ~%", 
   first(W1), first(rest(W1)), first(rest(rest(W1))), first(rest(rest(rest(W1)))) ), 
  W : rest(W)  )  );

TabellenAusdruck(LogistischesWachstumAnfangsstueck(20, 0.08, 0.0001, 10));

Das Programm TabellenAusdruck kann auf beliebige Listen der Struktur 
[Ganzzahl, Kommazahl, Kommazahl, Kommazahl] angewandt werden.  
Zum Beispiel auch auf die Ergebnisliste des Freien Wachstums (man vergleiche die Ergebnisse).   

TabellenAusdruck(FreiesWachstumAnfangsstueck(1, 2.15, 0.85, 12));

Textzelle (Kopie von oben)
(%i19) FreiesWachstumAnfangsstueckTabellenAusdruck(1,2.15,0.85,12);
 i        G             S             B
 1        2.1500        0.8500        2.3000 
 2        4.9450        1.9550        5.2900 
 3       11.3735        4.4965       12.1670 
 4       26.1590       10.3419       27.9841 
 5       60.1658       23.7865       64.3634 
 6      138.3814       54.7089      148.0359 
 7      318.2772      125.8305      340.4825 
 8      732.0375      289.4102      783.1099 
 9     1683.6862      665.6434     1801.1527 
10     3872.4782     1530.9798     4142.6511 
11     8906.6999     3521.2535     9528.0976 
12    20485.4098     8098.8829    21914.6244 
(%o19) done

LogistischesWachstumGraphischeAusgabe(B0, gr, sr, n) := 
block([F, F1, F4], 
 F : LogistischesWachstumAnfangsstueck(B0, gr, sr, n), 
 F1 : map(first, F), 
 F4 : map(last, F),
 wxplot2d([discrete, F1, F4])
);

LogistischesWachstumGraphischeAusgabe(20, 0.08, 0.0001, 120);

Bemerkung:  Die obige Plot-Routine ist (unabhängig von der Namensgebung) so geschrieben, 
dass man wahlweise die Ergebnisliste des freien Wachstums oder auch des logistischen 
Wachstums für den Plot verwenden kann.    

Die Zuwachsgeschwindigkeit

LogistischesWachstumZuwachsAnfangsstueck(B0, gr, mr, n) := 
 block([B : B0, G : 0, S : 0, Bneu : 0, L : [] ], 
  for i:1 thru n do (G : gr*B, S : mr*B*B, Bneu : B+G-S,  
   L : append(L, [[i, Bneu -B]]), 
   B : Bneu ), 
   return(L) );

LogistischesWachstumZuwachsAnfangsstueck(20, 0.08, 0.0001, 120);

LogistischesWachstumZuwachsGraphischeAusgabe(B0, gr, sr, n) := 
block([F, F1, F4], 
 F : LogistischesWachstumZuwachsAnfangsstueck(B0, gr, sr, n), 
 F1 : map(first, F), 
 F4 : map(last, F),
 wxplot2d([discrete, F1, F4])
);

LogistischesWachstumZuwachsGraphischeAusgabe(20, 0.08, 0.0001, 120);

 Logistisches Wachstum:  Maximaler Zuwachs

wxplot2d(0.08*y - 0.0001*y^2, [y, -10, 900]);

Räuber-Beutw-Modelle

RaeuberBeuteNtesElement(B0, g, m, R0, bR, u, v, n) :=  
  block([B : B0, R : R0, Bneu, Rneu], 
    for i:1 thru n do 
     (Bneu : B + g*B - m*B^2 - u*R*B, 
      Rneu : R + bR*R  + v*B*R,  
      B : Bneu,  R : Rneu ),  
    return([B, R]) );

RaeuberBeuteNtesElement(150, 0.3, 0.0, 12, -0.2,  0.025, 0.0015, 60);

RaeuberBeuteAnfangsstueck(B0, g, m, R0, bR, u, v, n) :=     
  block([B : B0, R : R0, Bneu, Rneu, L : [[0, B0, R0]] ],
    for i:1 thru n do 
     (Bneu : B + g*B - m*B^2 - u*B*R,  
      Rneu : R + bR*R + v*B*R,
      B : Bneu,    
      R : Rneu,
      L : append(L, [[i, B, R]]) ),  
    return(L) );

RaeuberBeuteAnfangsstueck(150, 0.3, 0.0, 12, -0.2,  0.025, 0.0015, 10);

L : %;

L;

map(first,L);

map(second, L);

map(third, L);

RaeuberBeuteGraphischeAusgabedraw(B0, g, m, R0, bR, u, v, n) := 
block([L, L1, L2, L3, s1, s2], 
 L : RaeuberBeuteAnfangsstueck(B0, g, m, R0, bR, u, v, n), 
 L1 : map(first, L),
 L2 : map(second, L),  
 L3 : map(third, L),
 s1 : points( L1, L2),
 s2 : points(L1, L3), 
 wxdraw2d( point_type = filled_circle,point_size=1.2, 
s1, color=red, s2) );

RaeuberBeuteGraphischeAusgabeplot(B0, g, m, R0, bR, u, v, n) := 
block([L, L1, L2, L3, s1, s2], 
 L : RaeuberBeuteAnfangsstueck(B0, g, m, R0, bR, u, v, n), 
 L1 : map(first, L),
 L2 : map(second, L),  
 L3 : map(third, L),
 wxplot2d([[discrete, L1, L2], [discrete, L1, L3]] ) );

RaeuberBeuteGraphischeAusgabeplot(150, 0.24, 0.0002, 80, -0.15,  0.0025, 0.0015, 60);

plot_options;

load(draw);

RaeuberBeuteGraphischeAusgabedraw(150, 0.24, 0.0002, 80, -0.15,  0.0025, 0.0015, 60);

plot_options;

draw2d(xrange = [0,10],
             yrange = [0,10],
             point_size = 3,
             point_type = diamant,
             points([[1,1],[5,1],[9,1]]),
             point_type = filled_down_triangle,
             points([[1,2],[5,2],[9,2]]),
             point_type = asterisk,
             points([[1,3],[5,3],[9,3]]),
             point_type = filled_diamant,
             points([[1,4],[5,4],[9,4]]),
  point_type = 5,
             points([[1,5],[5,5],[9,5]]),
             point_type = 6,
             points([[1,6],[5,6],[9,6]]),
             point_type = filled_circle,
             points([[1,7],[5,7],[9,7]]),
             point_type = 8,
             points([[1,8],[5,8],[9,8]]),
             point_type = filled_diamant,
             points([[1,9],[5,9],[9,9]]) )$

xy : [[10, .6], [20, .9], [30, 1.1], [40, 1.3], [50, 1.4]]$


wxplot2d([[discrete, xy], 2*%pi*sqrt(l/980)], [l,0,50],
        [style, points, lines], [color, red, blue], 
        [point_type, bullet],
        [legend, "experiment", "theory"],
        [xlabel, "pendulum's length (cm)"], 
        [ylabel, "period (s)"])$

draw2d(fill_color = "sea-green", /* use doble quotes when you need the - symbol */
 color      = aquamarine,  /* border color; double quotes aren't needed here */
 line_width = 6,
 polygon([[1,1],[3,0],[4,5],[0,3]]),
 transparent = true,
 line_type   = dots,
 color       = "dark-yellow",
 polygon([4,5,7],[6,4,2]),
 line_type   = solid,
 transparent = false,
 fill_color  = violet,
 rectangle([-2,-2],[8,-1]),   /* opposite vertices */
 transparent = true,
 color       = "dark-goldenrod",
 line_width  = 1,
 rectangle([9,4],[2,-1.5]),
 transparent = false,
 fill_color  = grey80,
 line_width  = 2,
 ellipse(0,6,3,2,270,-270),  /* center (x,y), a, b, start & end in degrees */
 transparent = true,
 color       = "NaVy",  /* down-upper case doesn't matter */
 line_width  = 3,
 ellipse(7,6,2,3,30,-90),
 xrange      = [-3,10],
 yrange      = [-3,9] )$