matlab 混沌,分形


對於函數f(x)=λsin(πx),λ∈(0,1],使用matlab計算隨着λ逐漸增大,迭代x=f(x)的值,代碼如下:

function y=diedai(f,a,x1)

N=32;

y=zeros(N,1);

for i=1:1e4

    x2=f(a,x1);

    x1=x2;

    y(mod(i,N)+1)=x2;

end

end

 

%f=@(a,x)a*x*(1-x);

f=@(a,x)a*sin(pi*x);

%x0=0.1;

hold on;

for x0=-1:0.05:1

    for a=0:0.01:1

        y=diedai(f,a,x0);

        for count=1:32

            plot(a,y(count),'k.');

            hold on;

        end

    end

end

 

 

得到的圖像如下:其中橫軸為λ,縱軸為x

 

 

可以看到隨着λ的逐漸增大,出現了倍周期分叉的情況。

由圖中可以看出第一個分叉值大約在0.3附近,第二個在0.73到0.75之間,第三個在0.8到0.85之間,混沌大約出現在0.86附近。接下來編寫代碼計算分叉值,代碼如下:

format long;

x0=0.1;

 for a=0.3182:0.0000001:0.3183

    y=diedai(f,a,x0);

    if max(y)>0.001

        disp(a);

        break;

    end

 end

 

得到第一個分叉值大約為0.3182298

 

format long;

x0=0.1;

 for a=0.7199:0.000001:0.72

    y=diedai(f,a,x0);

    if max(y)-min(y)>0.001

        disp(a);

        break;

    end

 end

 

得到第二個分叉值大約為0.719911

format long;

x0=0.1;

 for a=0.8332:0.000001:0.8333

    y=diedai(f,a,x0);

    if abs(y(32)-y(30))>0.001

        disp(a);

        break;

    end

 end

 

得到第三個分叉值大約為0.833267

 

利用Feigenbaum常數估計第三個分叉值,得到0.805939

 

分形圖

周常青

畫mandelbrot分形圖,主要使用了三個函數:iter=mandelbrot1(x0,y0,maxIter),用來計算迭代后是否收斂,方程z=z2+z0。c=color(iter,maxIter)計算顏色值,返回[r g b]。draw_mandelbrot1用來繪制圖像。

function iter=mandelbrot1(x0,y0,maxIter)

x=x0;

y=y0;

    for i=1:1:maxIter

        if (x*x+y*y)>=4

            iter=i;

            break;

        else

            tem=x*x-y*y+x0;

            y=x*y*2+y0;

            x=tem;

        end

        iter=i;

    end

end

--------------------------------------------------------------------------------------------------------

function c=color(iter,maxIter)

    if iter==maxIter

        c=[1,0,0];

    else

        c1=abs(mod((iter*20+255),510)-255);

        c2=abs(mod((iter*15+85+255),510)-255);

        c3=abs(mod((iter*30+171+255),510)-255);

        c=[c1/255,c2/255,c3/255];

    end

end

-------------------------------------------------------------------------------------------------------

 

function  draw_mandelbrot1

for y=0:ymax

    for x=0:xmax

        xt=2*r*x/xmax+x0-r;

        yr=r*ymax/xmax;

        yt=2*yr*y/ymax+y0-yr;

        iter=mandelbrot1(xt,yt,maxIter);

        %c=color(iter,maxIter);

        c=color(iter,maxIter);

        plot(xt,yt,'.','color',c);

        hold on;

      

    end

end

end

輸入draw_mandelbrot1(-0.5,300,0,200,2,300),得到的圖像如下:

 

 

對收斂部分的顏色也進行繪制,畫julia分形圖,主要使用了三個函數[xList,yList,iter]=julia1(x0,y0,maxIter,jx0,jy0),c=color2(iter,maxIter,xList,yList),draw_julia1(x0,xmax ,y0,ymax, r,maxIter,jx0,jy0)。其中julia1使用方程z=z2+zm進行迭代,z0=x0+j*y0,zm=jx0+j*jy0;返回iter為迭代次數,color2根據不同的iter,和x,y值進行差值,計算出c=[r g b],draw_julia1進行繪圖。

 

在matlab里輸入draw_julia1(0,300,0,200,1.6,50,-0.78888,0.212325),得到如下圖

 

 

代碼如下:

function [xList,yList,iter]=julia1(x0,y0,maxIter,jx0,jy0)

xList(1)=x0;

yList(1)=y0;

M=256;

lnln_m=log(abs(log(M)));

xbck=0;

ybck=0;

x=x0;

y=y0;

for i=1:maxIter

    if (x*x+y*y>=M)

%         iter=i;

        break;

    end

    xbck=x;

    ybck=y;

    tem=x*x-y*y+jx0;

    y=x*y*2+jy0;

    x=tem;

    xList(i+1)=x;

    yList(i+1)=y;

end

if i~=maxIter

    lnln_z=log(abs(log(x*x+y*y)));

    lnln_zbak=log(abs(log(xbck*xbck+ybck*ybck)));

    iter=i-2-(lnln_z-lnln_m)/(lnln_z-lnln_zbak);

else

    iter=i;

end

 

end

 

----------------------------------------------------------------------------------------------------

function c=color2(iter,maxIter,xList,yList)

% xList=xyList(1:length(xyList)/2);

% yList=xyList(length(xyList)/2:length(xyList));

sincolorf=@(x)(sin(x*2*pi/510-pi*0.5)+1)*0.5*255;

 

if iter==maxIter

    x=xList(maxIter);

    y=yList(maxIter);

    z=sqrt(x*x+y*y);

    zd=z-sqrt(xList(maxIter-1)*xList(maxIter-1)+yList(maxIter-1)*yList(maxIter-1));

    r1=sincolorf(z*2000);

    g1=sincolorf(y*x*1000);

    b1=sincolorf(zd*1000);

%     errcolor(1)=errcolor(1)+r1;

%     errcolor(2)=errcolor(2)+g1;

%     errcolor(3)=errcolor(3)+b1;

else

    r1=sincolorf(iter*20);

    g1=sincolorf(iter*15+85);

    b1=sincolorf(iter*30+171);

%     errcolor(1)=errcolor(1)+r1;

%     errcolor(2)=errcolor(2)+g1;

%     errcolor(3)=errcolor(3)+b1;

end     

 

% result_r=fTcolor(errcolor(1));

% result_b=fTcolor(errcolor(2));

% result_g=fTcolor(errcolor(3));

 

r=r1/255;

g=g1/255;

b=b1/255;

 

c=[r g b];

end

 

-----------------------------------------------------------------------------------------------------------------------------

function draw_julia1(x0,xmax ,y0,ymax, r,maxIter,jx0,jy0)

for y=1:ymax

    for x=1:xmax

        xt=2*r*x/xmax+x0-r;

        yr=r*ymax/xmax;

        yt=2*yr*y/ymax+y0-yr;

        [xList,yList,iter]=julia1(xt,yt,maxIter,jx0,jy0);

%         xyList=[xList yList];

        c=color2(iter,maxIter,xList,yList);

        plot(xt,yt,'.','color',c);

        hold on;

        %drawnow;

    end

end

end

 

可以看到,通過color2對收斂區域內部的顏色進行計算,可以得到色彩更為豐富的分形圖,但是總體來說,因為對於相關知識的欠缺,比較難找到合適的顏色方案。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM