From eadfe1d1a700a40308619d232e5ee64a86cf7d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Sun, 2 Jan 2022 19:41:12 +0100 Subject: komplexe Fibonacci-Zahlen --- buch/chapters/040-rekursion/images/fibonacci.m | 136 +++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 buch/chapters/040-rekursion/images/fibonacci.m (limited to 'buch/chapters/040-rekursion/images/fibonacci.m') 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); -- cgit v1.2.1