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

%[email protected](a,x)a*x*(1-x);

[email protected](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));

[email protected](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对收敛区域内部的颜色进行计算,可以得到色彩更为丰富的分形图,但是总体来说,因为对于相关知识的欠缺,比较难找到合适的颜色方案。

时间: 2024-08-24 12:09:49

matlab 混沌,分形的相关文章

混沌分形之逻辑斯蒂(Logistic)映射系统

前几天,有个同事看到我生成的一幅逻辑斯蒂分岔图像后,问我:“这是咪咪吗?”我回答:“淫者见淫.”好吧,这里将生成几种分岔映射图形,包括逻辑斯蒂映射系统,正弦映射系统和曼德勃罗映射系统.实际上这几种图形算不上分形,只不过它与我写的其他分形对象使用相同的基类,所以也将其列入混沌分形的范畴. 关于基类FractalEquation的定义及相关软件见:混沌与分形 (1)逻辑斯蒂映射系统 // 逻辑斯蒂映射系统 class LogisticMap : public FractalEquation { pu

混沌分形之电子云

      电子云是物理学中的一项概念.电子在原子核外很小的空间内作高速运动,其运动规律跟一般物体不同,它没有明确的轨道.根据量子力学中的测不准原理,我们不可能同时准确地测定出电子在某一时刻所处的位置和运动速度,也不能描画出它的运动轨迹.因此,人们常用一种能够表示电子在一定时间内在核外空间各处出现机会的模型来描述电子在核外的的运动.在这个模型里,某个点附近的密度表示电子在该处出现的机会的大小.密度大的地方,表明电子在核外空间单位体积内出现的机会多:反之,则表明电子出现的机会少.由于这个模型很像在

混沌分形之迭代函数系统(IFS)

IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于1985年发展了这一分形构型系统,并命名为迭代函数系统(Iterated Function System,IFS),后来又由Stephen Demko等人将其公式化,并引入到图像合成领域中.IFS将待生成的图像看做是由许多与整体相似的(自相似)或经过一定变换与整体相似的(自仿射)小块拼贴而成.算法: 1.

混沌分形之朱利亚集(JuliaSet)

朱利亚集合是一个在复平面上形成分形的点的集合.以法国数学家加斯顿·朱利亚(Gaston Julia)的名字命名.我想任何一个有关分形的资料都不会放过曼德勃罗集和朱利亚集.这里将以点集的方式生成出朱利亚集的图形. 关于基类FractalEquation的定义及相关软件见:混沌与分形 class JuliaSet : public FractalEquation { public: JuliaSet() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0

混沌分形之谢尔宾斯基(Sierpinski)

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形. (1)谢尔宾斯基三角形 给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理: a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置: b.将计算出的中点做为当前点,再重新执行操作a 相关代码如下: class SierpinskiTriangle : public FractalEquation { public: SierpinskiTriangle() { m_StartX = 0.0f; m_StartY = 0.0

混沌分形之马丁(Martin)迭代

我不记得从什么地方看到的这种分形图形生成方式,再到网上找竟然一时没查到任何相关资料.没关系,总之这种图形也很漂亮多变,并且其算法比较简单.只是我最后生成的图像有点瘆人,密集恐惧症患者慎入. 相关代码如下: class MartinIterate : public FractalEquation { public: MartinIterate() { m_StartX = 1.0f; m_StartY = 1.0f; m_StartZ = 0.0f; m_ParamA = 0.68f; m_Par

混沌分形之填充集

通过分形来生成图像,有一个特点是:不想生成什么样的图像就写出相应的算法,而是生成出来的图像像什么,那算法就是什么.总之,当你在写这个算法时或设置相关参数时,你几乎无法猜测出你要生成的图像是什么样子.而生成图像的时间又比较久,无法实时地调整参数.所以我这使用了填充集的方式,先计算少量的顶点,以显示出图像的大致轮廓.确定好参数后再进行图像生成.所谓填充集,就是随机生成顶点位置,当满足要求时顶点保留,否则剔除.这里将填充集的方式来生成Julia集,曼德勃罗集和牛顿迭代集. (1)Julia集 // 填

混沌与分形

混沌与分形理论的关系密切,混沌中有时包容有分形,而分形中有时又孕育着混沌.分形更注重形态或几何特性,图形的描述.混沌偏重于数理的动力学及动力学与图形结合的多方位的描述和研究.分形则更看中有自相似性的系统.混沌涉及面似乎比分形更广,对所有的有序与无序,有序与有序现象都感兴趣.特别是混沌中的分叉,分支现象与分形关系最密切.分形可以是混沌研究中一种手段或方法.一般认为非线性,随机性,以及耗散性是出现分形结构的必要物理条件. 非线性是指运动方程中含有非线性项(迭代),状态演化(相空间轨迹)发生分支,是混

混沌图像---马丁迭代【密集恐惧症患者慎入】

马丁迭代是我必需要讲的一个方程,因为之前看到一段由它生成图像的代码,我才开始研究混沌生成图像,并写了这个软件:YChaos生成混沌图像.马丁迭代图像的生成过程,如同生物的生长,一层层,一圈圈不停地变大变深变粗.虽然最终生成的图像看上去都差不多,但每一个参数下的图像的生成过程都不一样.最能体现混沌的是,马丁迭代的参数中,只要对任意一项,哪怕是极小的修改也会导致最终生成的数据完全不一样. 似乎网上关于它的资料很少,我只找到这么几句: 受Mandelbrot集产生思想的影响,Martin提出了一对公式