分形树__Matlab

合集下载

Matlab实验报告:分形迭代

Matlab实验报告:分形迭代

数学实验报告:分形迭代练习11.实验目的:绘制分形图案并分析其特点。

2.实验内容:绘制Koch曲线、Sierpinski三角形和树木花草图形,观察这些图形的局部和原来分形图形的关系。

3.实验思路:利用函数反复调用自己来模拟分形构造时的迭代过程,当迭代指标n为0时运行作图操作,否则继续迭代。

4.实验步骤:(1)Koch曲线function koch(p,q,n) % p、q分别为koch曲线的始末复坐标,n为迭代次数if (n==0)plot([real(p);real(q)],[imag(p);imag(q)]);hold on;axis equalelsea=(2*p+q)/3; % 求出从p 到q 的1/3 处端点ab=(p+2*q)/3; % 求出从p 到q 的2/3 处端点bc=a+(b-a)*exp(pi*i/3);%koch(p, a, n-1); % 对pa 线段做下一回合koch(a, c, n-1); % 对ac 线段做下一回合koch(c, b, n-1); % 对cb 线段做下一回合koch(b, q, n-1); % 对bq 线段做下一回合end(2)Sierpinski三角形function sierpinski(a,b,c,n) % a、b、c为三角形顶点,n为迭代次数if (n==0)fill([real(a) real(b) real(c)],[imag(a) imag(b) imag(c)],'b');% 填充三角形abchold on;axis equalelsea1=(b+c)/2;b1=(a+c)/2;c1=(a+b)/2;sierpinski(a,b1,c1,n-1);sierpinski(a1,b,c1,n-1);sierpinski(a1,b1,c,n-1);end(3)树木花草function grasstree(p,q,n) % p、q分别为树木花草始末复坐标,n为迭代次数plot([real(p);real(q)],[imag(p);imag(q)]);hold on;axis equalif(n>0)a=(2*p+q)/3;b=(p+2*q)/3;c=a+(b-a)*exp(pi*i/6);%d=b+(q-b)*exp(-pi*i/6);%grasstree(a,c,n-1);grasstree(b,d,n-1);endend5.主要输出:指令:koch(0,1,5); soerpinski(0,1,exp(pi*i/3),5); grasstree(0,i,5);Koch曲线Sierpinski三角形树木花草6.实验结论:以上图案的局部形状与原本图形用某种自相似性,这正是分形的特点。

matlab混沌,分形

matlab混沌,分形

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:1e4x2=f(a,x1);x1=x2;y(mod(i,N)+1)=x2;endend%f=@(a,x)a*x*(1-x);f=@(a,x)a*sin(pi*x);%x0=0.1;hold on;for x0=-1:0.05:1for a=0:0.01:1y=diedai(f,a,x0);for count=1:32plot(a,y(count),'k.');hold on;endendend得到的图像如下:其中横轴为λ,纵轴为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.3183y=diedai(f,a,x0);if max(y)>0.001disp(a);break;endend得到第⼀个分叉值⼤约为0.3182298format long;x0=0.1;for a=0.7199:0.000001:0.72y=diedai(f,a,x0);if max(y)-min(y)>0.001disp(a);break;endend得到第⼆个分叉值⼤约为0.719911format long;x0=0.1;for a=0.8332:0.000001:0.8333y=diedai(f,a,x0);if abs(y(32)-y(30))>0.001disp(a);break;endend得到第三个分叉值⼤约为0.833267利⽤Feigenbaum常数估计第三个分叉值,得到0.805939分形图周常青画mandelbrot分形图,主要使⽤了三个函数:iter=mandelbrot1(x0,y0,maxIter),⽤来计算迭代后是否收敛,⽅程z=z2+z0。

matlab的fraclab计算

matlab的fraclab计算

一、概述计算作为现代科学技术的重要工具,在各个领域有着广泛的应用。

而MATLAB作为一种基于矩阵运算的高级技术计算语言,在科学计算和工程领域也有着非常广泛的应用。

而fraclab作为MATLAB中扩展性工具箱的一种,是专门用于分形计算的工具,它能够方便地进行分形维度、分形谱等方面的计算。

二、fraclab简介1. fraclab是什么?fraclab是一个MATLAB的扩展工具箱,它专门用于分形计算。

其中包含了一系列用于计算分形维度、分形谱以及进行分形图形生成等功能的函数。

2. fraclab的优势- 方便快捷:fraclab提供了一系列方便快捷的函数,能够帮助用户轻松地进行分形计算。

- 多功能性:fraclab不仅仅可以用于计算分形维度和分形谱,还能够用于生成分形图形,对于分形研究来说颇具实用性。

三、fraclab的基本运用1. 分形维度的计算- 使用fraclab中的函数,可以很容易地计算出给定分形结构的分形维度,这对于分形结构的研究和分析有着很大的帮助。

- 可以使用boxcount函数来计算分形维度,只需输入相应的分形结构,即可得到相应的分形维度。

2. 分形谱的计算- fraclab还能够帮助用户计算分形谱,这对于分形图像的分析和特征提取有着很大的作用。

- 通过使用fraclab中的相应函数,可以得到给定分形图像的分形谱,并从中获取有用的信息。

3. 分形图形的生成- fraclab不仅可以用于分形特征的计算,还能够帮助用户生成分形图形,这对于分形算法的验证和实验有着很大的帮助。

- 用户只需要使用fraclab中的相应函数,就可以方便地生成各种形式的分形图形,验证自己的分形算法。

四、fraclab在科学研究中的应用1. 地质学领域- 在地震波形分析中,常常会涉及到地质中的分形结构,而fraclab提供了一系列的功能,方便地进行地震波形的分形维度和分形谱的计算,以及分形图形的生成,对于地震波形的分析具有很大的帮助。

几个分形的matlab实现资料

几个分形的matlab实现资料

几个分形的matlab 实现摘要:给出几个分形的实例,并用matlab 编程实现方便更好的理解分形,欣赏其带来的数学美感关键字:Koch 曲线 实验 图像一、问题描述:从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下图1在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成Koch 分形曲线。

二、算法分析:考虑由直线段(2个点)产生第一个图形(5个点)的过程。

图1中,设1P 和5P 分别为原始直线段的两个端点,现需要在直线段的中间依次插入三个点2P ,3P ,4P。

显然2P 位于线段三分之一处,4P 位于线段三分之二处,3P 点的位置可看成是由4P点以2P 点为轴心,逆时针旋转600而得。

旋转由正交矩阵 ⎪⎪⎪⎪⎭⎫ ⎝⎛-=)3cos()3sin()3sin()3cos(ππππA 实现。

算法根据初始数据(1P 和5P 点的坐标),产生图1中5个结点的坐标。

结点的坐标数组形成一个25⨯矩阵,矩阵的第一行为1P 的坐标,第二行为2P 的坐标……,第五行为5P 的坐标。

矩阵的第一列元素分别为5个结点的x 坐标,第二列元素分别为5个结点的y 坐标。

进一步考虑Koch 曲线形成过程中结点数目的变化规律。

设第k 次迭代产生的结点数为k n ,第1+k 次迭代产生的结点数为1+k n ,则k n 和1+k n 中间的递推关系为341-=+k k n n 。

三、实验程序及注释:p=[0 0;10 0]; %P为初始两个点的坐标,第一列为x坐标,第二列为y坐标n=2; %n为结点数A=[cos(pi/3) -sin(pi/3);sin(pi/3) cos(pi/3)]; %旋转矩阵for k=1:4d=diff(p)/3; %diff计算相邻两个点的坐标之差,得到相邻两点确定的向量%则d就计算出每个向量长度的三分之一,与题中将线段三等分对应 m=4*n-3; %迭代公式q=p(1:n-1,:); %以原点为起点,前n-1个点的坐标为终点形成向量p(5:4:m,:)=p(2:n,:); %迭代后处于4k+1位置上的点的坐标为迭代前的相应坐标 p(2:4:m,:)=q+d; %用向量方法计算迭代后处于4k+2位置上的点的坐标p(3:4:m,:)=q+d+d*A'; %用向量方法计算迭代后处于4k+3位置上的点的坐标p(4:4:m,:)=q+2*d; %用向量方法计算迭代后处于4k位置上的点的坐标n=m; %迭代后新的结点数目endplot(p(:,1),p(:,2)) %绘出每相邻两个点的连线axis([0 10 0 10])四、实验数据记录:由第三部分的程序,可得到如下的Koch分形曲线:图2五、注记:1.参照实验方法,可绘制如下生成元的Koch 分形曲线:图3此时,旋转矩阵为:⎪⎪⎭⎫ ⎝⎛-=⎪⎪⎪⎪⎭⎫ ⎝⎛-=0110)2cos()2sin()2sin()2cos(ππππA 程序和曲线如下:p=[0 0;10 0]; %P 为初始两个点的坐标,第一列为x 坐标,第二列为y 坐标n=2; %n 为结点数A=[0 -1;1 0]; %旋转矩阵for k=1:4d=diff(p)/3; %diff 计算相邻两个点的坐标之差,得到相邻两点确定的向量%则d 就计算出每个向量长度的三分之一,与题中将线段三等分对应 m=5*n-4; %迭代公式q=p(1:n-1,:); %以原点为起点,前n-1个点的坐标为终点形成向量p(6:5:m,:)=p(2:n,:); %迭代后处于5k+1位置上的点的坐标为迭代前的相应坐标 p(2:5:m,:)=q+d; %用向量方法计算迭代后处于5k+2位置上的点的坐标 p(3:5:m,:)=q+d+d*A'; %用向量方法计算迭代后处于5k+3位置上的点的坐标 p(4:5:m,:)=q+2*d+d*A'; %用向量方法计算迭代后处于5k+4位置上的点的坐标 p(5:5:m,:)=q+2*d; %用向量方法计算迭代后处于5k 位置上的点的坐标n=m; %迭代后新的结点数目endplot(p(:,1),p(:,2)) %绘出每相邻两个点的连线axis([0 10 0 10])图4由于中间三分之一部分是一个正方形时,有很多连接的部分。

分形维数--matlab

分形维数--matlab

一维曲线分形维数的matlab程序function D=FractalDim(y,cellmax)%求输入一维信号的计盒分形维数%y是一维信号%cellmax:方格子的最大边长,可以取2的偶数次幂次(1,2,4,8...),取大于数据长度的偶数%D是y的计盒维数(一般情况下D>=1),D=lim(log(N(e))/log(k/e)),if cellmax<length(y)error('cellmax must be larger than input signal!')endL=length(y);%输入样点的个数y_min=min(y);%移位操作,将y_min移到坐标0点y_shift=y-y_min;%重采样,使总点数等于cellmax+1x_ord=[0:L-1]./(L-1);xx_ord=[0:cellmax]./(cellmax);y_interp=interp1(x_ord,y_shift,xx_ord);%按比例缩放y,使最大值为2^^cys_max=max(y_interp);factory=cellmax/ys_max;yy=abs(y_interp*factory);t=log2(cellmax)+1;%叠代次数for e=1:tNe=0;%累积覆盖信号的格子的总数cellsize=2^(e-1);%每次的格子大小NumSeg(e)=cellmax/cellsize;%横轴划分成的段数for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e)begin=cellsize*(j-1)+1;%每一段的起始tail=cellsize*j+1;seg=[begin:tail];%段坐标yy_max=max(yy(seg));yy_min=min(yy(seg));up=ceil(yy_max/cellsize);down=floor(yy_min/cellsize);Ns=up-down;% 本段曲线占有的格子数Ne=Ne+Ns;%累加每一段覆盖曲线的格子数endN(e)=Ne;%记录每e下的N(e)end%对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是Dr=-diff(log2(N));%去掉r超过2和小于1的野点数据id=find(r<=2&r>=1);%保留的数据点Ne=N(id);e=NumSeg(id);P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距D=P(1);。

matlab用结构函数法计算分形维数程序__理论说明

matlab用结构函数法计算分形维数程序__理论说明

matlab用结构函数法计算分形维数程序理论说明1. 引言1.1 概述本文旨在介绍使用结构函数法计算分形维数的程序和相关理论。

分形维数是描述自然界和人工物体中不规则结构复杂程度的重要指标之一,它能够定量衡量对象的自相似性和尺度变换特征。

而结构函数法是一种计算分形维数的常用方法,它通过测量对象的尺度不变性来实现对分形维数的求解。

1.2 文章结构本文共分为四个部分;引言部分即本章首先对文章进行概述和简介;接着第二部分将介绍分形维数的基本概念以及与结构函数法计算之间的关系;第三部分将详细介绍如何在Matlab环境下使用结构函数法来计算分形维数,并给出具体示例数据和结果展示;最后,第四部分将给出总结,回顾研究目的,总结各种方法并展望改进和应用前景。

1.3 目的本文旨在向读者介绍使用Matlab编写程序进行结构函数法计算分形维数的方法,并通过具体数据案例展示其有效性。

通过本文的阅读,读者将了解到什么是分形维数以及在实际研究中如何使用结构函数法来计算分形维数。

同时,本文还将讨论该方法的优缺点,并探究其未来的应用前景和改进方向。

以上是关于“1. 引言”部分的详细内容,希望能对您撰写长文提供帮助。

2. 正文:2.1 分形维数的基本概念分形维数是描述分形对象复杂程度的重要指标。

分形是一类特殊的几何结构,具有自相似性和无限细节等特征。

分形维数通常用于量化描述分形对象的粗糙程度和层级结构。

2.2 结构函数法与分形维数计算的关系结构函数法是一种常用于计算分形维数的方法,其基本思想是通过结构函数来测量物体在不同尺度下的信息量。

结构函数可以通过计算物体上不同区域内对应尺度上像素值差异的平均值来得到。

分析这些差异可以揭示出物体在不同尺度下的内在结构规律,从而计算出其分形维数。

2.3 Matlab中使用结构函数法计算分形维数的程序步骤在Matlab中使用结构函数法计算分形维数需要以下步骤:步骤1: 读取并预处理图像或数据集。

首先将图像或数据集转换为灰度图像,并进行必要的预处理操作(如噪声去除、平滑等),以便更好地提取其结构信息。

分形曲线及matlable算法

分形曲线及matlable算法

分形曲线及matlable算法0 koch分形曲线在线演示从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成koch 分形曲线。

算法分析:由一条线段产生四条线段,故算法中由n 条线段迭代一次后将产生 4n 条线段。

算法针对每一条线段逐步进行,将计算新的三个点。

第一个点位于线段三分之一处,第三个点位于线段三分之二处,第二个点以第一个点为轴心,将第一和第三个点形成的向量正向旋转 60 0 而得。

正向旋转由正交矩阵实现。

MATLAB 程序如下clearp=[0 0;10 0];n=1;A=[cos(pi/3) -sin(pi/3);sin(pi/3) cos(pi/3)];for k=1:5j=0;for i=1:nq1=p(i,:);q2=p(i+1,:);d=(q2-q1)/3;j=j+1;r(j,:)=q1;j=j+1;r(j,:)=q1+d;j=j+1;r(j,:)=q1+d+d*A';j=j+1;r(j,:)=q1+2*d;endn=4*n;clear pp=[r;q2];endplot(p(:,1),p(:,2))koch分形图片flash制作源代码第一祯die=4;bi=1color=0x000000alpha=100stop();第二祯_root.createEmptyMovieClip("koch",1); a=new Array(1025); b=new Array(1025);c=new Array(1025);d=new Array(1025);l=0;n=1;a[1]=100;b[1]=200;a[2]=500;b[2]=200;c[1]=100;d[1]=200;c[2]=500;d[2]=200;for(m=1;m<=die;m++){j=0;with(_root.koch){for(k=1;k<=n;k++){x1=c[k];y1=d[k];x2=c[k+1];y2=d[k+1];j=j+1;a[j]=x1;b[j]=y1;j=j+1;a[j]=x1+(x2-x1)/3;b[j]=y1+(y2-y1)/3;j=j+1;a[j]=x1+(x2-x1)/3+((x2-x1)/3)*Math.cos(Math.PI/3)-((y2-y1)/3)*Math.sin(Math.PI/3); b[j]=y1+(y2-y1)/3+((x2-x1)/3)*Math.sin(Math.PI/3)+((y2-y1)/3)*Math.cos(Math.PI/3);j=j+1;a[j]=x1+2*(x2-x1)/3;b[j]=y1+2*(y2-y1)/3;j=j+1;a[j]=x2;b[j]=y2;l=j;}for(j=1;j<l;j++)< bdsfid="152" p=""></l;j++)<>{if(a[j]==a[j+1]&&b[j]==b[j+1]){ g=j;for(;j<l;j++)< bdsfid="156" p=""></l;j++)<>{a[j]=a[j+1];b[j]=b[j+1];}j=g+1;}}y=l;for(f=1;f<=y;f++){c[f]=a[f];d[f]=b[f];}}n=4*n;}第三祯//k1=1;i=1;_root.koch.onEnterFrame=function() {with(_root.koch){ //for(;i<=k1*10&&i<=y;) {lineStyle(bi,color,alpha);moveTo(c[i-1],450-d[i-1]);lineTo(c[i],450-d[i]);trace(i-1);trace(d[i-1]);i++;}//k1++;if(i>=y){delete _root.koch.onEnterFrame;}}}第四祯_root.koch.clear();stop();1 矩形分形曲线1在线演示顶部从一条直线段开始,将线段中间的三分之一部分用一个正方形的三边代替,形成几字形图形如下在新的图形中,又将图中每一直线段中间的三分之一部分都用一个正方形的三边代替替,再次形成新的图形如此迭代,形成矩形分形曲线 1 。

最小生成树matlab代码

最小生成树matlab代码

最小生成树matlab代码在Matlab中,最小生成树可以通过Kruskal算法和Prim算法来实现。

本文将分别介绍两种算法的代码实现,并对其进行详细解析。

Kruskal算法Kruskal算法是基于贪心算法的最小生成树算法。

其基本思想是将边按照权值从小到大进行排序,然后逐个加入到树中,直到树连通为止。

如果加入一条边使得形成环,则不加入该边。

定义一个函数Kruskal(weight,n)来实现Kruskal算法。

参数weight是一个n*n的矩阵,表示图的邻接矩阵;n表示图中节点的个数。

该函数的返回值为最小生成树的边集。

function edges=Kruskal(weight,n)%初始化[rows,cols,vals]=find(weight);edge_num=length(rows);%边数edges=zeros(n-1,2);%初始化,存放最小生成树的边%边按照权重从小到大排序[~,idx]=sort(vals);rows=rows(idx);cols=cols(idx);%初始化并查集par=1:n;rank=zeros(1,n);%依次加入边n_edge=0;%表示已加入的边数for i=1:edge_num%如果两个节点已经在同一连通块中,则不能加入当前边if FindPar(par,rows(i))==FindPar(par,cols(i))continue;end%将当前边加入到最小生成树中n_edge=n_edge+1;edges(n_edge,:)=[rows(i),cols(i)];%将两个节点合并Union(par,rank,rows(i),cols(i));%如果当前已经加入足够的边,则退出循环if n_edge==n-1break;endendFindPar函数和Union函数是实现并查集的两个函数,用于判断是否形成环以及将两个节点合并。

具体代码如下:%查找节点的祖先function par=FindPar(par,idx)if par(idx)==idxpar=idx;elsepar=FindPar(par,par(idx));end%将两个节点合并function Union(par,rank,x,y)x_par=FindPar(par,x);y_par=FindPar(par,y);if rank(x_par)>rank(y_par)par(y_par)=x_par;elsepar(x_par)=y_par;if rank(x_par)==rank(y_par)rank(y_par)=rank(y_par)+1;endendPrim算法Prim算法也是一种贪心算法,基本思想是从任意一个点开始,找到与该点相邻的最短边,然后将这个边连接的点加入到集合中,继续寻找与该集合相邻的最短边。

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现上星期我们讨论了EZW算法,很高兴收到了一些朋友的email,对算法进行探讨、交流。

这也是我开这个博客的源动力之一,学习就应该开诚布公、交流互助,在探讨中加深对所学知识的理解和掌握。

在弄懂了EZW算法原理并用Matlab实现后,我继续学习EZW的改进算法。

至今有一周的时间没更新博客、写新文章了,其实就是把时间用在EZW的一个改进算法——多级树集合分裂(Set Partitioning in Hierarchical Trees, SPIHT)算法的研究和Matlab实现。

由于EZW是SPIHT的基础,所以在EZW算法的Matlab代码的基础上,我很快就完成了SPIHT的代码编写,但最痛苦的是一开始没吃透算法原理,程序在初始分集上出了错,调试了两天找不出根本问题,昨天从头再看一次算法原理,才发现问题所在……呵呵,小小的粗心就耽搁了我两三天的时间和精力!问题解决后,就编写程序注释了,上次EZW算法的代码都没写注释,让大家看着辛苦,不好意思哦!好,接下来就开始讨论SPIHT 算法的原理,然后给出具体的Matlab代码。

一、SPIHT算法与EZW算法EZW算法是一种基于零树的嵌入式图象编码算法,虽然在小波变换系数中,零树是一个比较有效的表示不重要系数的数据结构,但是,在小波系数中还存在这样的树结构,它的树根是重要的,除树根以外的其它结点是不重要的。

对这样的系数结构,零树就不是一种很有效的表示方法。

A.Said和W.A.Pearlman根据Shapiro零树编码算法(EZW)的基本思想,提出了一种新的且性能更优的实现方法,即基于多级树集合分裂排序(Set Partitioning in Hierarchical Trees, SPIHT)的编码算法。

它采用了空间方向树(SOT:spatial orientation tree)、全体子孙集合D(i,j)和非直系子孙集合L(i,j)的概念以更有效地表示上述特征的系数结构,从而提高了编码效率。

matlab分形

matlab分形

以及相应的一组概率p1 ,, pn ,( p1 pn 1, pi 0). 对于任意选取的初始值 z0 ( x0 , y0 ),以概率 pi 选取变 换 wi 做迭代
zk 1 ( xk 1 , yk 1 ) wi ( xk , yk ), k 0,1, 2,
{zk }0收敛的极限图形称为一个IFS吸引子, 则点列 k
F lim Fk
k
即是所谓的Koch曲线。
Koch曲线的修改规则R是将每一条直线段F0用 一条折线F1替代,称F1为生成元。
生成Koch曲线的Matlab程序
clear clf new=[1 0]; kmax=3; for k=1:kmax old=new; n=length(old)-1; for m=0:n-1;
由生成元产生的分形是一种规则分形,是数学 家按一定规则构造出来的,相当于物理中的模型。 这类图形的构造方式都有一个共同的特点:
最终图形 F 都是按照一定的规则 R 通过 对初始图形 F0 不断修改得到的。
最具代表性的图形有Koch雪花曲线、分形树

Koch雪花曲线:
给定一条直线段F0,将该直线三等分,并将中 间的一段用以该线段为边的等边三角形的另外两边 代替,得到图形F1,然后,再对图形F1中的每一小 段都按上述方式修改,以至无穷。则最后得到的极 限曲线
尽管分形几何的提出只有三十年左右的时间, 但它已经在自然科学的各个领域如数学、物理、 化学、地理、天文、材料、生命乃至经济、社会、 艺术等极其广泛的领域有着广泛的应用。
这里以迭代的观点介绍分形的基本特性以及生 成分形图形的基本方法。

生成元产生的分形图形

由IFS(迭代函数系)所生成的分形图形

基于MATLAB实现分形图形的绘制论文

基于MATLAB实现分形图形的绘制论文

目录前言 (1)第一章 MATLAB介绍 (2)1.1 MATLAB简介 (2)1.2 MATLAB语言 (2)1.2.1 创建向量、向量元素的访问: (2)1.2.2 创建矩阵、矩阵元素的访问 (3)1.2.3 流程控制 (4)1.3 MATLAB语言的传统优点 (5)第二章分形入门知识 (6)2.1 分形理论 (6)2.2 分形几何观及其应用 (7)第三章 Koch雪花的绘制 (7)3.1 von Koch曲线简介 (8)3.2 Koch雪花算法设计 (8)第四章 Frac_tree绘制 (11)第五章 Mandelbort集的绘制 (12)5.1 Mandelbort集简介 (13)5.2 Mandelbort集算法设计 (13)第六章 Julia集的绘制 (17)6.1 Julia集简介 (18)6.2 Julia集的算法设计 (18)6.3 Julia集与Mandelbort集 (20)第七章花篮簇的绘制 (22)总结 (23)主要参考文献: (23)前言分形是描述不规则几何形态的有力工具。

不言而喻,不规则的几何形态在我们的周围处处可见,诸如花草、山脉、烟云、火焰等举目皆是。

至于微观世界的复杂物质结构,宏观世界浩瀚天体的演变,更展现出了层出不穷的不规则几何形态,它们往往都是分形几何的研究对象。

大自然向人类展示其美丽多变形态的同时,也提出了难以回答的询问:怎样描述复杂的自然表象?恰恰是分形几何学,它把自然形态看作是具有无限嵌套层次的精细结构,并且在不同的尺度下保持某种相似的属性,于是在变换与迭代中得到描述自然形态的有效方法。

分形的研究离不开计算机。

如果不是计算机图形图像处理功能的增强,不能想象怎样才能直观地看到Julia集和Mandelbort集的精细结构,更不能想象可以产生具有无限细结的自然景物和高度真实感的三维动画。

反过来,分形理论与方法又极大地丰富了计算机图形学内容,甚至分形的思想会在计算机科学的发展上产生一定的影响。

在MATLAB平台下实现DLA分形聚集生长的模拟

在MATLAB平台下实现DLA分形聚集生长的模拟

第30卷 第1期西南师范大学学报(自然科学版)2005年2月Vol.30 No.1Journal of S outhwest China Normal University (Natural Science )Feb.2005文章编号:10005471(2005)01008304在MAT LAB 平台下实现DLA 分形聚集生长的模拟①高 睿1, 谢淑云2, 陶继东211武汉大学土建学院,湖北武汉430072;21中国地质大学地球科学学院,湖北武汉430074摘要:简要概述了最具代表性的分形结构———扩散限制凝聚(Diffusion 2Limited 2Aggregation ,DL A )模型的生长规则、主要性质,给出了模型模拟分形生长的算法,在MA TL AB615平台上进行了程序设计,在Windows98/2000/XP 下实现了DL A 模型模拟生长的动态过程.关 键 词:DL A 模型;分形生长;MA TL AB 平台中图分类号:O469;TP391177文献标识码:A1981年,美国密捷安大学Witten 和Sander 开创性地提出了一个扩散限制凝聚(Diff usion 2Limited 2Aggregatio n )的分形生长模型[1],简称DL A 模型.最初该模型提出时主要是为了研究悬浮在大气中的煤灰、金属粉末或烟尘扩散的凝聚问题.后来受到不同领域的学者重视,被引入不同的学科,用来解释各种与分形形态有关的生长和凝聚现象.1 DLA 分形生长DL A 模型采用了在晶格原点上置一个初始粒子作为种子,以该点为圆心(原点),r 为半径作一个大圆.在该圆附近随机产生一个微粒在圆上作近似于Brown 运动的随机行走,即以1/4的概率向上下左右方向行走.若微粒与种子颗粒相碰,则令其附着于种子微粒之上,与之结合形成凝聚集团;若微粒行走到圆的边界或离开这个圆,令其被边界吸收而消失,接着再随机地产生第二个微粒并重复以上步骤,直至附着于凝聚集团或被边界吸收.如此不断地进行,当种子集团长大到一定程度后,可以发现,它就形成了以种子微粒为中心的无规分叉图形(图1).图1 DLA 集团示意图Fig 11 The Sketch Map of DLA Cluster DL A 模型的主要性质和特点是:这类分形结构在形成过程中都遵从可动边界的拉普拉斯方程,以凝聚生长为例,凝聚粒子在拉普拉斯浓度场中作无规扩散运动,生长集团的界面具有复杂的性质和不稳定的性质,生长过程是一个远离平衡的动力学过程,是一个非线性的、非平衡态的进化过程.可以说,DL A 模型的出现,深化了人们对非平衡生长现象的认识,吸引了大批数学、物理、化学、生物科学家投入其中,研究有关物理的、化学的、医学的生长现象,并已经取得了令人鼓舞的进展[2].尽管自然界中的分形生长现象屡见不鲜,但是生长过程的复杂程度众所周知,要想建立起理想的动力学方程来研究分形生长目前还没有统一的定论,然而,通过计算机模拟分形生长过程,可以得到许多有关DLA 团簇(cluster )构造的结果,已经成为时下研究其物理机制的一种重要手段[3].同时,使用计算机模拟还可以随意设定或改变各种参数,而①收稿日期:20040426基金项目:国家自然科学基金重点资助项目(40373003,49633120);国土资源部自由探索科技资助项目(2000401).作者简介:高 睿(1975),男,湖北鄂州人,讲师,主要从事土木建筑结构和地理信息系统研究.且编写的程序能够自动执行、完成大量繁琐的工作,其方便、快捷的运行特点得到了广泛的认同.计算机模拟微粒聚集生长过程有许多研究,除了Witten 和Sander 开创性地提出的DLA 模型,后来又有许多研究者在此基础上提出了各种改进模型,也有各种不同的实现方法[4].本文根据经典的DL A 模型,用功能强大的快速开发工具MA TL AB615实现了DLA 模型的动态生长过程,并在Windows98/2000/XP 运行,效果良好.2 DLA 模型分形生长的计算机模拟选取一个L ×L 的正方形点阵,在该平面中央设置一固定粒子作为“种子”.程序开始时,调用随机函数rand 在平面内随机地产生一个粒子,该粒子以布朗运动方式在平面上作无规则运动.产生的粒子与“种子”相碰并附着于“种子”上,形成粒子簇;如此重复,直至在点阵中央形成一个树枝状的凝聚体.下面给出了这一DL A 模拟分形生长算法的MA TLAB 源代码.f unction DL Amodel%Fractal growt h modeling by DLAL =151;axis ([0L 0L ])set (gcf ,‘color ’,‘w ’) %将图形背景设置为白色Xhalf =floor (L/2)+1;Yhalf =Xhalf ;hold onX =sparse (L ,L );X (xhalf ,yhalf )=1;%设定“种子”位置[i ,j ]=find (X );plot hdl =plot (i ,j ,‘b.’);axis offaxis squarep =-1:1;Times =15000;%设定随机产生粒子的个数for count =1∶Times sita =rand 323pi ; %生成一个随机点R =floor (L/2);kx =floor (Xhalf +R 3cos (sita ));ky =floor (Yhalf +R 3sin (sita ));plot2=plot (kx ,ky ,‘r ’);set (plot2,‘marker ’,‘d ’,‘markersize ’,8)drawnow %动态演示随机产生粒子的运动模式flag =0;[i ,j ]=find (X );lr =lengt h (i );while kx <L -1&ky <L -1&kx >1&ky >1&flag ==0, N =sum (sum (X (kx +p ,ky +p )));%统计与随机粒子相邻的“种子团簇”粒子的个数 if N >0 X (kx ,ky )=1; flag =1; else48西南师范大学学报(自然科学版) 第30卷 ran =rand ; %布朗运动控制 if ran >2/3 kx =kx +1; elseif ran <1/3 kx =kx -1; end ran =rand ; if ran >2/3 ky =ky +1; elseif ran <1/3 ky =ky -1; end set (plot2,‘xdata ’,kx ,‘ydata ’,ky ); end endcla ;[i ,j ]=find (X );plot (i ,j ,‘b.’)drawnowend 图2为选择L =151,Times =15000时程序运行的结果,其中图2a 为模拟生长1min 的结果,图2b 为模拟生长5min 的结果,图2c 为程序运行完毕后得到的图形.从图中可以清楚地看出DLA “枝杈”不断“长大”的过程.在具体计算模拟时,因最初选择的方形点阵大小有限,设定随机参加运动的粒子总数范围在几千到几万,程序中参数Times 选择最好小于1000000为宜.图2 DLA 模拟分形生长图形(L =151,Times =15000)Fig 12 The Sketch Map of Fractal Growt h Simulations3 模拟结果讨论(1)本程序在Windows98/2000/XP 下运行良好,操作简便直接在MA TL AB 命令窗口下输入DL Am 2odel 字样按Enter 键即可观看其动态生长过程.58第1期 高 睿,等:在MA TL AB 平台下实现DLA 分形聚集生长的模拟68西南师范大学学报(自然科学版) 第30卷(2)特别应当指出的是,本算法的独特和区别于其他模拟方法的地方在于使用了MA TL AB中的sparse命令创建了一个稀疏矩阵,便于存储“种子”团簇的位置,同时有利于统计随机行走粒子四周相邻位置处是否存在“种子团簇”,大大方便了程序编写与计算,也极大地节省了程序运行的时间.通过对比研究,对于上述模拟,本算法要优于经典的模拟算法.(3)在本模拟过程中,由于粒子团簇的尺寸远小于点阵的尺寸,随机产生的粒子都在远处,它们的随机运动大多先与伸展在外面的枝杈粘附,较难进入凝聚体的内部,这一点从图2可以很清楚的看出.(4)本程序还有许多不够完善的地方,如果能在模型中进一步考虑扩散粒子的粘附几率、反应几率、表面粗糙度以及各项异性的影响等等,那么模拟结果可能会更加丰富多彩,也能进一步的探讨DLA团簇的分形与多重分形性质.参考文献:[1]Witten T A,Sander L M.Effective Harmonic Fluid Approach to low Energy Properties of One Dimensional QuantumFluids[J].Phys Rev Let,1981,47:14001408.[2] Stanley H E.Two2Dimensional Pdymers abd Conformal Invariance[J].Physica A,1990,23:168172.[3] 杨展如.分形物理学[M].上海:上海科技教育出版社,1996.[4] 敖力布,林鸿溢.分形学导论[M].呼和浩特:内蒙古人民出版社,1996.Simulation for the Fractal AggregationG row th on the Platform of MAT LAB615GAO Rui1, XIE Shu2yun2, TAO Ji2dong211Faculty of Civil Engineering,Wuhan University,Wuhan Hubei430072,China;21Faculty of Earth Science,China University of Geos ciences,Wuhan Hubei430074,ChinaAbstract:This paper first described t he const ruction regulations and major properties of Diff usion2limited2 aggregatio n model(DL A model),which is a typical fractal growt h model.And t hen one algorit hm to real2 ize t he dynamic growt h process was int roduced and complemented on t he MA TL AB615platform in Win2 dows98/2000/XP.K ey w ords:DL A model;fractal growt h;MA TLAB platform责任编辑 潘春燕 。

几个分形matlab实现

几个分形matlab实现

几个分形的matlab实现摘要:给出几个分形的实例,并用matlab编程实现方便更好的理解分形,欣赏其带来的数学美感关键字:Koch曲线实验图像一、问题描述:从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下图1在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成Koch分形曲线。

二、算法分析:考虑由直线段(2个点)产生第一个图形(5个点)的过程。

图1中,设1P和5P分别为原始直线段的两个端点,现需要在直线段的中间依次插入三个点2P,3P,4P。

显然2P位于线段三分之一处,4P位于线段三分之二处,3P点的位置可看成是由4P点以2P点为轴心,逆时针旋转600而得。

旋转由正交矩阵⎪⎪⎪⎪⎭⎫⎝⎛-=)3cos()3sin()3sin()3cos(ππππA实现。

算法根据初始数据(1P和5P点的坐标),产生图1中5个结点的坐标。

结点的坐标数组形成一个25⨯矩阵,矩阵的第一行为1P的坐标,第二行为2P的坐标……,第五行为5P的坐标。

矩阵的第一列元素分别为5个结点的x坐标,第二列元素分别为5个结点的y坐标。

进一步考虑Koch曲线形成过程中结点数目的变化规律。

设第k次迭代产生的结点数为kn,第1+k次迭代产生的结点数为1+kn,则kn和1+kn中间的递推关系为341-=+kknn。

三、实验程序及注释:p=[0 0;10 0]; %P为初始两个点的坐标,第一列为x坐标,第二列为y坐标n=2; %n为结点数A=[cos(pi/3) -sin(pi/3);sin(pi/3) cos(pi/3)]; %旋转矩阵for k=1:4d=diff(p)/3; %diff计算相邻两个点的坐标之差,得到相邻两点确定的向量%则d就计算出每个向量长度的三分之一,与题中将线段三等分对应 m=4*n-3; %迭代公式q=p(1:n-1,:); %以原点为起点,前n-1个点的坐标为终点形成向量p(5:4:m,:)=p(2:n,:); %迭代后处于4k+1位置上的点的坐标为迭代前的相应坐标 p(2:4:m,:)=q+d; %用向量方法计算迭代后处于4k+2位置上的点的坐标p(3:4:m,:)=q+d+d*A'; %用向量方法计算迭代后处于4k+3位置上的点的坐标p(4:4:m,:)=q+2*d; %用向量方法计算迭代后处于4k位置上的点的坐标n=m; %迭代后新的结点数目endplot(p(:,1),p(:,2)) %绘出每相邻两个点的连线axis([0 10 0 10])四、实验数据记录:由第三部分的程序,可得到如下的Koch分形曲线:图2五、注记:1.参照实验方法,可绘制如下生成元的Koch 分形曲线:图3此时,旋转矩阵为:⎪⎪⎭⎫⎝⎛-=⎪⎪⎪⎪⎭⎫ ⎝⎛-=0110)2cos()2sin()2sin()2cos(ππππA 程序和曲线如下:p=[0 0;10 0]; %P 为初始两个点的坐标,第一列为x 坐标,第二列为y 坐标 n=2; %n 为结点数 A=[0 -1;1 0]; %旋转矩阵 for k=1:4d=diff(p)/3; %diff 计算相邻两个点的坐标之差,得到相邻两点确定的向量 %则d 就计算出每个向量长度的三分之一,与题中将线段三等分对应 m=5*n-4; %迭代公式q=p(1:n-1,:); %以原点为起点,前n-1个点的坐标为终点形成向量p(6:5:m,:)=p(2:n,:); %迭代后处于5k+1位置上的点的坐标为迭代前的相应坐标 p(2:5:m,:)=q+d; %用向量方法计算迭代后处于5k+2位置上的点的坐标 p(3:5:m,:)=q+d+d*A'; %用向量方法计算迭代后处于5k+3位置上的点的坐标 p(4:5:m,:)=q+2*d+d*A'; %用向量方法计算迭代后处于5k+4位置上的点的坐标 p(5:5:m,:)=q+2*d; %用向量方法计算迭代后处于5k 位置上的点的坐标 n=m; %迭代后新的结点数目 endplot(p(:,1),p(:,2)) %绘出每相邻两个点的连线 axis([0 10 0 10])图4由于中间三分之一部分是一个正方形时,有很多连接的部分。

MATLAB分型植物的模拟

MATLAB分型植物的模拟

目录1引言 (1)2迭代函数系统和L-系统 (1)2.1迭代函数系统原理 (1)2.2L-系统原理 (1)3分形植物模拟 (2)3.1在MATLAB中的模拟 (2)3.2L系统的模拟 (5)3.3迭代函数系统与L系统的结合 (7)参考文献 (8)1引言随着计算机技术的发展,分形几何成了计算机图形学的一个分支,它以分形几何学为数学基础构造自相似的几何结构,借助于计算机图形学的支持模拟山脉、河流、地貌、云彩、植物等,产生人力所无法绘制的绚丽图形,达到对自然景物的逼真模拟。

自然场景的模拟在工程设计,如道路桥梁设计、城市规划、多媒体电影以及电子游戏中越来越受到重视。

植物,尤其是树木,作为自然场景中必不可少的元素,是计算机模拟的重要对象。

自然界中树的种类繁多,形态各异,计算机要模拟出逼真的图像具有一定的难度,这也给计算机图像模拟带来了新的研究课题。

当前典型的分形植物模拟方法有两种:L-系统和迭代函数系统,但L-系统需先确定生成规则,简洁但不够灵活,且难于编程控制;迭代函数系统中仿射变换的确定较复杂,而且不能描绘细节。

因此,单独使用这两种算法并不是最好的选择。

而将L-系统的字符串替换思想和递归算法相结合,从而找到一种能生动逼真地模拟植物形态的编程方法。

2迭代函数系统和L-系统2.1迭代函数系统原理迭代函数系统(Iterated Function System)是分形绘制的典型重要方法。

其采用确定性算法与随机性算法相结合的办法生成植物杆茎或叶片等分形图。

“确定性”指用以迭代的规则是确定性的,它们由一组仿射变换(如R1,R2,R3等)构成;“随机性”指迭代过程是不确定的,即每一次究竟迭代哪一个规则是随机性的,设最终要生成的图形(植物形态图)为M,它要满足集合方程:M=R1∪R2∪…∪RN。

公式的含义是,随机地从Ri(i=1,…,N)中挑选一个迭代规则迭代一次,然后再随机地在Ri(i=1,…,N)中选一个规则迭代一次,不断重复此过程,最后生成的极限图形M就是欲求的植物形态图。

Matlab在分形中的应用研究

Matlab在分形中的应用研究

Matlab在分形中的应用研究作者:金能智者建武文洮杨博超李葆光来源:《科技创新导报》2017年第02期摘要:Matlab具有强大的科学运算和灵活的程序设计,可提供高质量的图像可视化,已经在很多领域得到广泛应用。

分形是非线性科学的重要分支,分形几何学却具有尺度上的对称性,分型图形是计算机图形学和分形理论相结合的产物。

该文利用Matlab强大的编程工具和图形显示功能实现Cantor集、Koch曲线、分形树图形,这对数学类、计算机图形学和相关专业类研究人员有一定的参考价值。

关键词:分形 Matlab Cantor集 Koch曲线中图分类号:TP312 文献标识码:A 文章编号:1674-098X(2017)01(b)-0105-02Matlab是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

Matlab提供了强大的科学运算、灵活的程序设计、高质量的图像可视化以及便捷地与其他程序和语言接口的功能[1,2]。

目前,Matlab已经应用到很多科研领域,如,生物信息学[3]、统计学[4]、信号处理[5]、小波分析[6]等。

分形(Fractal)是非线性科学的一个重要分支,应用于自然科学和社会科学的众多领域[7-9]。

1973年,数学家Mandelbrot在法兰西学院讲课时,首次提出了分形的思想。

他给分形下的定义就是:一个集合形状,可以细分为若干部分,而每一部分都是整体的精确或不精确的相似形。

分形的基本特征是具有标度不变性。

其研究的图形是非常不规则和不光滑的,已失去了通常的几何对称性。

但是,在不同的尺度下进行观测时,分形几何学却具有尺度上的对称性或称标度不变性。

分形图形是计算机图形学和分形理论相结合的产物,在电脑模拟研究具有分形特征物体的图像。

分形的计算机生成问题具有明显的挑战性,它使传统数学中无法表达的形态(如,山脉、花草等)得以表达。

结构函数法计算分形维数的matlab程序代码_概述说明

结构函数法计算分形维数的matlab程序代码_概述说明

结构函数法计算分形维数的matlab程序代码概述说明1. 引言1.1 概述本文旨在介绍结构函数法用于计算分形维数的Matlab程序代码的实现过程。

分形维数是一种用于描述不规则对象复杂度和粗糙度的数学概念,具有广泛的应用领域,包括图像处理、地质学、生物学等。

结构函数法是一种常用的计算分形维数的方法,通过对信号数据进行结构函数的计算和分析来获取其分形特征。

1.2 文章结构本文首先介绍了文章的背景和目标,概述了结构函数法计算分形维数的基本原理和流程。

然后详细介绍了Matlab程序代码的实现步骤和方法。

接着通过实际案例验证了程序代码的准确性,并进行了结果展示和分析。

最后总结文章所取得的主要研究成果,并提出存在问题与改进方向以及后续研究展望。

1.3 目的本文旨在提供一个完整而详尽的指南,帮助读者理解并掌握使用结构函数法计算分形维数的Matlab程序代码编写与实现过程。

通过该程序代码,读者可以快速而准确地计算各种信号数据的分形维数,并据此分析其复杂度和粗糙度特征。

本文的目标是为读者提供一个清晰、可操作的实践指南,以便他们能够在相关领域开展深入研究和应用。

2. 结构函数法计算分形维数2.1 分形维数简介分形维数是衡量分形结构复杂度的一种重要指标,用于描述物体在不同尺度下的自相似性。

在自然界和工程领域中,很多现象都具有分形特征,如云朵、山脉、树枝等。

分形维数可以帮助我们理解和研究这些复杂系统。

2.2 结构函数法原理结构函数法是一种常用的计算分形维数的方法。

其基本思想是通过测量数据集在不同尺度范围内的方差来估计分形维数。

首先,将原始数据按照一系列长度为r 的间隔进行划分,并计算每个间隔内数据值之差的平方和作为方差。

然后,对所有间隔长度r对应的方差进行统计处理,得到一个关于尺度r的函数D(r)。

最后,通过对D(r)进行线性回归拟合或使用其他方法来估计数据集的分形维数。

2.3 数据预处理在应用结构函数法计算分形维数之前,需要对原始数据进行预处理。

分形插值算法和MATLAB实验分析

分形插值算法和MATLAB实验分析

一,分形插值算法——分形图的递归算法1,分形的定义分形(Fractal)一词,是法国人B.B.Mandelbrot 创造出来的,其原意包含了不规则、支离破碎等意思。

Mandelbrot 基于对不规则的几何对象长期地、系统地研究,于1973 年提出了分维数和分形几何的设想。

分形几何是一门以非规则几何形状为研究对象的几何学,用以描述自然界中普遍存在着的不规则对象。

分形几何有其显明的特征,一是自相似性;分形作为一个数学集合, 其内部具有精细结构, 即在所有比例尺度上其组成部分应包含整体, 而且彼此是相似的。

其定义有如下两种描述:定义 1如果一个集合在欧式空间中的 Hausdorff 维数H D 恒大于其拓扑维数r D ,则称该集合为分形集,简称分形。

定义 2组成部分以某种方式与整体相似的形体叫分形。

对于定义 1 的理解需要一定的数学基础,不仅要知道什么是Hausdorff 维数,而且要知道什么是拓扑维数,看起来很抽象,也不容易推广。

定义 2 比较笼统的说明了自然界中的物质只要局部和局部或者局部和整体之间存在自相似性,那么这个物质就是分形。

正是这一比较“模糊”的概念被人们普遍接受,同时也促进了分形的发展。

根据自相似性的程度,分形可分为有规分形和无规分形。

有规分形是指具有严格的自相似的分形,比如,三分康托集,Koch 曲线。

无规分形是指具有统计意义上的自相似性的分形,比如,曲折的海岸线,漂浮的云等。

本文主要研究有规分形。

2. 分形图的递归算法2.1 三分康托集1883 年,德国数学家康托(G.Cantor)提出了如今广为人知的三分康托集。

三分康托集是很容易构造的,然而,它却显示出许多最典型的分形特征。

它是从单位区间出发,再由这个区间不断地去掉部分子区间的过程构造出来的(如图2.1)。

其详细构造过程是:第一步,把闭区间[0,1]平均分为三段,去掉中间的 1/3 部分段,则只剩下两个闭区间[0,1/3]和[2/3,1]。

分形树__Matlab

分形树__Matlab
%该函数的功能是将十进制转化为指定位数(NN)的二进制数
function dataway=ten2twoN(NNK,NN);
dataway=ten2two(NNK);
[a,b]=size(dataway);
Ncc=NN-b;%需要补充的0的个数
for cc=1:Ncc
x2=x1+r1*cos(theata1);
y2=y1+r1*sin(theata1);
plot([x1,x2],[y1,y2]);
r2=r1*w;
theata2=theata1-dtheata;
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%这是一个生成树的主函数,它的输入分别为每叉树枝的缩短比、树枝的偏角、生长次数.
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
end
hold off
%--------------------------------------------------------------------------
%这是一个十进制转换为二进制的函数,适用于正整数
function yushu=ten2two(x)
yushu=[];
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%这是一个生成树的主函数,它的输入分别为每叉树枝的缩短比、树枝的偏角、生长次数. %注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%%小提示:若用做函数,请将虚线框内语句删去。

function f=tree(w,dtheata,NN)
%%%--------------------虚线框--------------------%%%
clear;clc;clf;w=0.8;dtheata=pi/6;NN=8;%建议生长次数NN不要超过10
%%%--------------------虚线框--------------------%%%
n=2^NN;%从主枝算起,共需生成2^NN个树枝
for NNK=1:n
x1=0;
y1=0;
r1=1;
theata1=pi/2;
dataway=ten2twoN(NNK,NN); %把每一个树枝的编号转化为一个NN位的二进制数
for NNL=1:NN
if dataway(NNL)==0
[x2,y2,r2,theata2]=antmoveleft(x1,y1,r1,theata1,w,dtheata);%若路径数组上对应的数字为0,则向左生长
x1=x2;
y1=y2;
r1=r2;
theata1=theata2;
hold on
%pause(eps)
else
[x2,y2,r2,theata2]=antmoveright(x1,y1,r1,theata1,w,dtheata);%否则,数字为1,向右生长
x1=x2;
y1=y2;
r1=r2;
theata1=theata2;
hold on
%pause(eps)
end
end
end
hold off
%--------------------------------------------------------------------------
%这是一个十进制转换为二进制的函数,适用于正整数
function yushu=ten2two(x)
yushu=[];
shang=2;
if x==1
yushu=[1];
else
while shang>1
shang=fix(x/2);
yushu=[mod(x,2),yushu];
x=shang;
end
yushu=[1,yushu];
end
%-------------------------------------------------------------------------- %该函数的功能是将十进制转化为指定位数(NN)的二进制数
function dataway=ten2twoN(NNK,NN);
dataway=ten2two(NNK);
[a,b]=size(dataway);
Ncc=NN-b;%需要补充的0的个数
for cc=1:Ncc
dataway=[0,dataway];
end
%-------------------------------------------------------------------------- %这是一个显示平面中点的运动的函数,它的输入为起始点的坐标、
%将要运动的方位角、将要运动的长度
function [x2,y2]=antmove(x1,y1,r1,theata)
x2=x1+r1*cos(theata);
y2=y1+r1*sin(theata);
plot([x1,x2],[y1,y2])
%-------------------------------------------------------------------------- %这是一个显示平面中点的运动的函数,它的输入为起始点的坐标、
%将要运动的方位角、将要运动的长度
%参见函数antmove
%与antmove不同的是,该函数的返回值中多了两个变量
%这两个变量r2,theata2为下一步点的移动准备了数据
%theata角增大,表示点向左移动
function [x2,y2,r2,theata2]=antmoveleft(x1,y1,r1,theata1,w,dtheata)
x2=x1+r1*cos(theata1);
y2=y1+r1*sin(theata1);
plot([x1,x2],[y1,y2]);
r2=r1*w;
theata2=theata1+dtheata;
%--------------------------------------------------------------------------
%这是一个显示平面中点的运动的函数,它的输入为起始点的坐标、
%将要运动的方位角、将要运动的长度
%参见函数antmove
%与antmove不同的是,该函数的返回值中多了两个变量
%这两个变量r2,theata2为下一步点的移动准备了数据
%theata角减小,表示点向右移动
function [x2,y2,r2,theata2]=antmoveright(x1,y1,r1,theata1,w,dtheata) x2=x1+r1*cos(theata1);
y2=y1+r1*sin(theata1);
plot([x1,x2],[y1,y2]);
r2=r1*w;
theata2=theata1-dtheata;
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!
%注意:把这些程序全部保存在名为tree的M文件中再运行!!!!!!!!。

相关文档
最新文档