2017-01-31, 22:59
  #1
Medlem
starke_adolfs avatar
Jag vill undersöka kaos genom att plotta f(x_{n+1}) = f(x_n) stegvis för något kul. Det var jättelänge sedan jag skrev matlabkod sist men jag slängde ihop någonting snabbt som kanske kan vara en start. Tänker mig att undersöka en logistisk mappning (http://mathworld.wolfram.com/LogisticMap.html) till att börja med men jag får inte till den där fina plotten. Det ser förjävligt ut för mig, får inga häftiga bifurkationer eller antydan till någon struktur alls. Med andra ord måste jag göra något dramatiskt fel, men vad?

Undersöker f(x) = kx(1-x) för 0<k<4 med startvärde x0=0.5 för 1000 iterationer. Plottar k mot x.

Kod:
close all
clear all

f = @(x,k) k*x*(1-x);

x = [0.5]; y = []; k=[];
iter = 1000;
for i=1:iter
    k(1,i)=4*rand;
    y(1,i) = f(x(i),k(i));
    x(1,i+1) = y(i);
end
x = x(1,1:end-1); % Ta bort sista elementet för att få rätt storlek på vektorn

plot(k,x);
Citera
2017-01-31, 23:24
  #2
Medlem
inneskos avatar
Citat:
Ursprungligen postat av starke_adolf
Jag vill undersöka kaos genom att plotta f(x_{n+1}) = f(x_n) stegvis för något kul. Det var jättelänge sedan jag skrev matlabkod sist men jag slängde ihop någonting snabbt som kanske kan vara en start. Tänker mig att undersöka en logistisk mappning (http://mathworld.wolfram.com/LogisticMap.html) till att börja med men jag får inte till den där fina plotten. Det ser förjävligt ut för mig, får inga häftiga bifurkationer eller antydan till någon struktur alls. Med andra ord måste jag göra något dramatiskt fel, men vad?

Undersöker f(x) = kx(1-x) för 0<k<4 med startvärde x0=0.5 för 1000 iterationer. Plottar k mot x.

Kod:
close all
clear all

f = @(x,k) k*x*(1-x);

x = [0.5]; y = []; k=[];
iter = 1000;
for i=1:iter
    k(1,i)=4*rand;
    y(1,i) = f(x(i),k(i));
    x(1,i+1) = y(i);
end
x = x(1,1:end-1); % Ta bort sista elementet för att få rätt storlek på vektorn

plot(k,x);

Jag antar att du menar att du vill undersöka mappningar som x_{n + 1} = f(x_n)? Vilken bild är det du tänker att du ska reproducera, är det bifukationsdiagrammet?
Citera
2017-01-31, 23:28
  #3
Medlem
starke_adolfs avatar
Citat:
Ursprungligen postat av innesko
Jag antar att du menar att du vill undersöka mappningar som x_{n + 1} = f(x_n)? Vilken bild är det du tänker att du ska reproducera, är det bifukationsdiagrammet?
Ja och ja

Edit: Visst ska parametern k slumpas vid varje iteration?
__________________
Senast redigerad av starke_adolf 2017-01-31 kl. 23:31.
Citera
2017-01-31, 23:34
  #4
Medlem
inneskos avatar
Citat:
Ursprungligen postat av starke_adolf
Ja och ja

Okej, notera då att det som ligger på x-axeln (dvs den vertikala axeln) i det diagrammet visar dom stabila noderna. Så för ett givet k värde så ska du ta ett x-värde och iterera det många många gånger så att det hamnar nära en stabil punkt.

Så något mer liknande följande

Kod:
close all
clear all

f = @(x,k) k*x*(1-x);

iter = 1000;
x = zeros(iter, 1);
k = zeros(iter, 1);
for i=1:iter
    k(i) = 1 + 3*rand;
    x(i) = f(0.1 + 0.8*rand, k(i));
    for j = 1:10000
        x(i) = f(x(i), k(i));
    end
end

plot(k,x, '.');

bör ge en bättre bild.
Citera
2017-01-31, 23:58
  #5
Medlem
starke_adolfs avatar
Citat:
Ursprungligen postat av innesko
Okej, notera då att det som ligger på x-axeln (dvs den vertikala axeln) i det diagrammet visar dom stabila noderna. Så för ett givet k värde så ska du ta ett x-värde och iterera det många många gånger så att det hamnar nära en stabil punkt.

Så något mer liknande följande

Kod:
close all
clear all

f = @(x,k) k*x*(1-x);

iter = 1000;
x = zeros(iter, 1);
k = zeros(iter, 1);
for i=1:iter
    k(i) = 1 + 3*rand;
    x(i) = f(0.1 + 0.8*rand, k(i));
    for j = 1:10000
        x(i) = f(x(i), k(i));
    end
end

plot(k,x, '.');
bör ge en bättre bild.
örstår jag rätt om jag säger att man:
(i) slumpar parametern k mellan 1 och 4 (såg att du fixat till 1<k<4 som i plotten på sidan) för varje startvärde.
(ii) ansätter en massa olika startvärden x_i (närmare bestämt 1000 st godtyckliga) sådana att 0.1 < x_i < 0.9.
(iii) itererar varje startvärde vart och ett 10000 gånger enligt x_{n+1} = f(x_n)
(iv) plottar det slutgiltiga värdet av varje startvärde (efter att det itererats 10000 gånger) mot parametern

Det jag tar med mig är helt enkelt att jag måste undersöka systemet för många olika startvärden och låta varje startvärde itereras många gånger. Inte bara välja ett startvärde och låta det intereras många gånger.

Tack så mycket för hjälpen!
Citera
2017-02-01, 00:11
  #6
Medlem
inneskos avatar
Citat:
Ursprungligen postat av starke_adolf
örstår jag rätt om jag säger att man:
(i) slumpar parametern k mellan 1 och 4 (såg att du fixat till 1<k<4 som i plotten på sidan) för varje startvärde.
(ii) ansätter en massa olika startvärden x_i (närmare bestämt 1000 st godtyckliga) sådana att 0.1 < x_i < 0.9.
(iii) itererar varje startvärde vart och ett 10000 gånger enligt x_{n+1} = f(x_n)
(iv) plottar det slutgiltiga värdet av varje startvärde (efter att det itererats 10000 gånger) mot parametern

Det jag tar med mig är helt enkelt att jag måste undersöka systemet för många olika startvärden och låta varje startvärde itereras många gånger. Inte bara välja ett startvärde och låta det intereras många gånger.

Tack så mycket för hjälpen!

Ja du har förstått det rätt.

I brist på annat så tog jag mig tiden att matlabifiera koden också, om det möjligen är intressant så är den här
Kod:
close all
clear all

f = @(x,k) k.*x.*(1-x);

points = 1000;
k = 1 + 3*rand(points, 1);
x = f(0.1 + 0.8*rand(points, 1), k);
for i = 1:10000
    x = f(x, k);
end

plot(k,x, '.');
Citera
2017-02-01, 00:18
  #7
Medlem
starke_adolfs avatar
Citat:
Ursprungligen postat av innesko
Ja du har förstått det rätt.

I brist på annat så tog jag mig tiden att matlabifiera koden också, om det möjligen är intressant så är den här
Kod:
close all
clear all

f = @(x,k) k.*x.*(1-x);

points = 1000;
k = 1 + 3*rand(points, 1);
x = f(0.1 + 0.8*rand(points, 1), k);
for i = 1:10000
    x = f(x, k);
end

plot(k,x, '.');
Stiligt. Mycket mer kompakt, men jag tycker att det är mycket svårare att tolka matlabifierad kod av någon anledning. Hur stor är prestationsskillnaden? Antar att for-loopar inte är lika effektiva som det "inbyggda" systemet.
Citera
2017-02-01, 00:21
  #8
Medlem
inneskos avatar
Citat:
Ursprungligen postat av starke_adolf
Stiligt. Mycket mer kompakt, men jag tycker att det är mycket svårare att tolka matlabifierad kod av någon anledning. Hur stor är prestationsskillnaden? Antar att for-loopar inte är lika effektiva som det "inbyggda" systemet.

Jag tog inte och profilerade koden så jag vet faktiskt inte hur mycket snabbare den går (om den nu går snabbare ). Men generellt sett så kan man se ganska stora prestandaförbättringar genom att skriva den på det där sättet, på grund av anledningen du säger, "inbyggda" systemet är snabbare än for-loopar.
Citera
2017-02-01, 00:31
  #9
Medlem
starke_adolfs avatar
Citat:
Ursprungligen postat av innesko
Jag tog inte och profilerade koden så jag vet faktiskt inte hur mycket snabbare den går (om den nu går snabbare ). Men generellt sett så kan man se ganska stora prestandaförbättringar genom att skriva den på det där sättet, på grund av anledningen du säger, "inbyggda" systemet är snabbare än for-loopar.
Testade att köra med matlabifierade koden och det var märkbart stor skillnad verkligen. Fan att det är så svårt att läsa och skriva sådan kod bara. Kanske är en vanesak, men när jag läste numerisk analys och gjorde en massa matlab-labbar tyckte jag aldrig att det blev lätt med den sortens kod ändå.

Nu är det sovdags, godnatt!
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in