aboutsummaryrefslogtreecommitdiffstats
path: root/buch/chapters/040-rekursion/images/fibonacci.m
diff options
context:
space:
mode:
Diffstat (limited to 'buch/chapters/040-rekursion/images/fibonacci.m')
-rw-r--r--buch/chapters/040-rekursion/images/fibonacci.m136
1 files changed, 136 insertions, 0 deletions
diff --git a/buch/chapters/040-rekursion/images/fibonacci.m b/buch/chapters/040-rekursion/images/fibonacci.m
new file mode 100644
index 0000000..4c9754e
--- /dev/null
+++ b/buch/chapters/040-rekursion/images/fibonacci.m
@@ -0,0 +1,136 @@
+#
+# fibonacci.m
+#
+# (c) 2022 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule
+#
+global phi1;
+phi1 = (1+sqrt(5)) / 2;
+phi2 = (1-sqrt(5)) / 2;
+global logphi1;
+logphi1 = log(phi1)
+global logphi2;
+logphi2 = log(phi2)
+
+global s;
+s = 0.1;
+
+A = [ 1, 1; phi1, phi2 ];
+b = [ 0; 1 ];
+global a;
+a = A \ b
+
+global xmin;
+xmin = 0;
+global xmax;
+xmax = 10;
+global ylim;
+ylim = 10;
+
+global N;
+N = 200;
+
+function retval = fibonacci(n)
+ global a;
+ global logphi1;
+ global logphi2;
+ retval = a(1,1) * exp(n * logphi1) + a(2,1) * exp(n * logphi2);
+endfunction
+
+for n = (0:10)
+ fibonacci(n)
+endfor
+
+function punkt(fn, z)
+ if (abs(z) > 100)
+ z = 100 * z / abs(z);
+ endif
+ fprintf(fn, "(%.5f,%.5f)", real(z), imag(z));
+endfunction
+
+function drawline(fn, p, color,lw)
+ global N;
+ fprintf(fn, "\\draw[color=%s,line width=%.1fpt] ", color, lw);
+ punkt(fn, p(1));
+ for i = (2:N+1)
+ fprintf(fn, "\n\t--");
+ punkt(fn, p(i));
+ endfor
+ fprintf(fn, ";\n");
+endfunction
+
+function realline(fn, x, ymin, ymax, color, lw)
+ global N;
+ h = (ymax - ymin) / N;
+ fprintf(fn, "%% real line for x = %f, h = %f\n", x, h);
+ count = 1;
+ for y = ymin + (0:N) * h
+ z(count) = fibonacci(x + i * y);
+ count = count + 1;
+ endfor
+ drawline(fn, z, color, lw);
+endfunction
+
+function imaginaryline(fn, y, xmin, xmax, color, lw)
+ global N;
+ h = (xmax - xmin) / N;
+ fprintf(fn, "%% imaginary line for y = %f, h = %f\n", y, h);
+ count = 1;
+ for x = xmin + (0:N) * h
+ z(count) = fibonacci(x + i * y);
+ count = count + 1;
+ endfor
+ drawline(fn, z, color, lw);
+endfunction
+
+function fibmapping(fn, n, name, lw)
+ global s;
+ fprintf(fn, "\\def\\%s{\n", name);
+ for x = n + s*(-5:5)
+ realline(fn, x, -5*s, 5*s, "red", lw);
+ endfor
+ for y = s*(-5:5)
+ imaginaryline(fn, y, n-5*s, n+5*s, "blue", lw);
+ endfor
+ fprintf(fn, "}\n");
+endfunction
+
+function fibgrid(fn, lw)
+ global s;
+ fprintf(fn, "\\def\\fibgrid{\n");
+ for y = s*(-5:5)
+ imaginaryline(fn, y, -0.5, 6.5, "gray", lw);
+ endfor
+ for x = s*(-5:65)
+ realline(fn, x, -0.5, 0.5, "gray", lw);
+ endfor
+ fprintf(fn, "}\n");
+endfunction
+
+function fibcurve(fn, lw)
+ fprintf(fn, "\\def\\fibcurve{\n");
+ imaginaryline(fn, 0, 0, 6.5, "white", 1.2*lw);
+ imaginaryline(fn, 0, 0, 6.5, "darkgreen", lw);
+ for n = (0:6)
+ z = fibonacci(n);
+ fprintf(fn, "\\fill[color=darkgreen] ");
+ punkt(fn, z);
+ fprintf(fn, " circle[radius=0.08];\n");
+ fprintf(fn, "\\fill[color=white] ");
+ punkt(fn, z);
+ fprintf(fn, " circle[radius=0.04];\n");
+ endfor
+ fprintf(fn, "}\n");
+endfunction
+
+fn = fopen("fibonaccigrid.tex", "w");
+fibmapping(fn, 0, "fibzero", 1);
+fibmapping(fn, 1, "fibone", 1);
+fibmapping(fn, 2, "fibtwo", 1);
+fibmapping(fn, 3, "fibthree", 1);
+fibmapping(fn, 4, "fibfour", 1);
+fibmapping(fn, 5, "fibfive", 1);
+fibmapping(fn, 6, "fibsix", 1);
+fibgrid(fn, 0.3);
+fibcurve(fn, 1.4);
+
+fclose(fn);