Fibonacci, Mönster i naturen

Mönster i naturen Fibonacci , Phylotaxix

Leonardo Fibonacci (född runt 1170, död ca 1250) är en av världens största matematiker. När man läser om Fibonacci så dyker alltid Kaninproblemet upp:

Problemet lyder som följer:

Ett nyfött kaninpar (en hane och en hona) förökar sig på följande
sätt:

  • paret blir könsmoget efter en månad (månad 1)
  • det föder ett kaninpar (hane och hona) varje månad från och
    med månad 2
  • varje nyfött kaninpar bidrar på samma sätt till förökningen som
    urparet
  • inga kaniner dör under loppet av ett år

Fråga: hur många kaninpar finns det just i början av månad 12?

Svaret på det här problemet kan beräknas med något som kallas Fibonaccis talföljd.
Talföljden följer ett mönster där nästkommande tal är summan av de två föregående talen.
0, 1, 1, 2, 3, 5, 8, 13, 21….

För att enkelt beräkna talföljder som följer Fibonaccis mönster skapas ett program.

Före setup() skapas en funktion med namnet fibonacci vilken har två parametrar. Parametern result tar en array med de två första talen i talföljden och parametern len är längden på önskad talföljd. Variabeln num1 kommer att ha värdet av det första elementet i arrayen result (vilken bestäms när funktionen kallas på). num2 är det andra elementet i arrayen. En variabel med namnet next skapas. Den ska senare få värdet av num1 + num2.

En variabel med namnet count skapas och får värdet 2. count häller reda på antal tal som finns i arrayen result. När arrayen kallas på så kommer två tal att anges som argument därför börjas count på två.

function fibonacci(result, len){
  let num1 = result[0];
  let num2 = result[1];
  let next;
  let count = 2;
//slutparentes saknas då mer kod kommer

En while-loop skapas vilken säger att så länge count är mindre än den len (vilken anges som argument två när funktionen kallas på) ska koden inom parenteserna loopas. Direkt när en while-loop skapas kan man ta för vana att skriva in vad det är som ska ökas så att loopen tar slut någon gång, annars finns risk för en “infinite loop” vilket kraschar browsern.
Här sker ökningen genom count ++.

I loopen sätts next till summan av num1 + num2
Därefter sätts num1 till värdet av num2
num2 sätts sen till värdet av next
next pushas  in i arrayen result.

 Om du har svårt att följa koden så ta gärna papper och penna och rita ett flödesschema eller annan “kludd” för att förstå vad som sker med num1 och num2

 while( count < len){
  next = num1 + num2;
  num1 = num2;
  num2 = next;
  result.push(next);

  count ++;
}
//slutparentes saknas då mer kod kommer

Sist i funktionen sänds arrayen result till konsolen

console.log(result);
} // slutparentes för funktionen

I setup() kallar man sen på funktionen med de två argumenten

function setup(){
  fibonacci([1,1], 12);
}

I konsollen står då hela fibonacci-talföljden och det sista talet anger antal kaniner enligt frågeställningen i början av den här sidan.

Fibonacci och naturen

Det är fascinerande hur man kan finna samband mellan Fibonaccis talserie och vår natur.
Naturen har arrangerat ett flertal växter på ett sätt så att blad och spiraler är ett visst Fibonaccital till antalet.

Om man ger sig ut i naturen och tittar närmare på växter och annat finns ett tydligt mönster. Om man tittar tillräckligt nära går det att räkna och se att talföljderna på kronblad mm följer Fibonaccis talföljd.

 Läs på webben om Fibonacci och bland annat det Gyllene Snittet

Sättet som blad är arrangerade på stjälkar, till exempel i spiralform kallas för phyllotaxis.

Phyllotaxis

Ett program som ritar ut phyllotaxis

Följande ekvationer behövs för att koda phyllotaxis

x = r*cos(θ)
y = r*sin(θ)
r, θ kan variera - 
därför används polär form för koordinaterna istället för kartesisk
r = c*sqrt(n) // c är en skalfaktor
θ = n*137.5°  //n är antal prickar som ska ritas ut

Vad är då polär form gällande koordinater?

Punkten P kan skrivas med kartesiska koordinater x och y vilka anger hur långt på x-axeln respektive y-axeln som punkten är placeras. Med polarkoordinater kan samma punkt skrivas som r cos(vinkeln) respektive r sin(vinkeln). Att det behövs polära koordinater här beror på att det är vinkeln och radien som kommer att ändras för att rita ut mönstret.

Två variabler skapas en för n och en för c och sätts till 0 respektive 4.
I setup() skapas en canvas som är 400 * 400 pixlar. koden anger vinklar i grader (för p5.js är standard radianer) så angleMode() måste specificeras till DEGREES. När färg ska anges använder vi HSB istället för RGB. HSB står för Hue(nyans), Saturation (mättnad), Brightness(ljusstyrka). Hue antar värden mellan 0 och 360, saturation och brightness antar värden mellan 0 och 100.
Bakgrunden sätts till svart. Att bakgrunden sätts i setup() gör att den inte ritar över det som ritas ut i draw():

let n = 0;
let c = 4;
function setup() {
  createCanvas(400, 400);
  angleMode(DEGREES);
  colorMode(HSB);
  background(0);
}

I draw() skapas en variabel med namnet angle vilken sätts till  n * 137,5 (helt enligt formeln som visats ovan. En variabel med namnet radius sätts till värdet 100.
Variablerna x och y skapas och används för att konvertera kartesiska koordinater till polära koordinater(enligt tidigare formler). Sen ritas en ellips ut vid x och y och med diametern 4. Färgen på ellipsen sätts till HSB nyans som är beroende av vinkeln.
Sist i koden ökas n med 1 för varje loop i draw().

function draw() {
  let angle = n * 137.5;
  let radius = 100//c * sqrt(n);
  let x = radius * cos(angle) + width/2;
  let y = radius* sin(angle) + height/2;
  noStroke();
  fill(angle % 360, 100, 100);
  ellipse(x, y, 4, 4);
  n++;
}

Kod i Editorn


Nu  ritas en cirkel ut. Det är dags att komplettera koden med  den sista ekvationen som specificerades tidigare.
var radius = c * sqrt(n);
I stället för let radius = 100– ändra till let radius = c * sqrt(n);

Sist i draw() läggs ett villkor in som säger att om n är större än 600 så ska draw-loopen stoppas.

if(n > 600){
  noLoop(); 
}

Kod i editorn


Titta på bilden av solrosens mitt.  Spiralerna liknar de spiraler som nu kodats med Phyllotaxis. Överallt i naturen finns mönster och former som kan beskrivas matematiskt. Naturen och matematiken hör verkligen ihop på så många sätt.

 Ändra vinkelns värde till n * 137,3 respektive  n * 137,6 och se de mönster som då ritas ut.

 Ändra värden på c för att se vad som då påverkas.