分形维数代码
- 格式:doc
- 大小:21.00 KB
- 文档页数:2
实验报告实验名称:三维分形算法姓名:陈怡东学号:09008406程序使用说明:程序打开后会呈现出3次分形后的四面体,因为考虑到观察效果的清晰所以就用了3次分形作为演示。
与用户的交互:1键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色。
按下字母c(不区别大小写)可以改变视图函数,这里循环切换3种视图函数:glOrtho,glFrustum,gluPerspective,但是改变视图函数后要窗口形状变化后才能显现出来按下字母键q(不区别大小写)可以退出程序2鼠标交互:打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果。
鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案。
改变视图函数也是上述的3种函数,这里的效果立刻显现,但是还有很多问题达不到所要的效果,希望老师能帮忙解决一下。
设计思路:分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。
仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。
这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。
交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。
鼠标交互:通过对鼠标左右按键的实现:该部分只做了必要的介绍,具体实现见代码(附注释)分形算法:void tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。
以区别开来,函数的实现细节见代码,有注释介绍。
void triangle3(GLfloat *a,GLfloat *b,GLfloat *c)函数用来绘制每个平面细分后的三角形。
其中顶点设置为3维坐标glVertex3fv(a);void divide_tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d,int m)细分四面体的函数实现。
实验三迭代与分形一、实验目的与要求1.了解分形几何的基本情况;2.了解通过迭代方式产生分形图的方法;3.了解matlab软件中简单的程序结构;4.掌握matlab软件中plot, fill等函数的基本用法;二、问题描述1.对一个等边三角形,每条边按照Koch曲线的方式进行迭代,产生的分形图称为Koch雪花。
编制程序绘制出它的图形,并计算Koch雪花的面积,以及它的分形维数。
2.自己构造生成元(要有创意),按照图形迭代的方式产生分形图,用计算机编制程序绘制出它的图形,并计算其分形维数。
三、问题分析1.第一题要求我们利用一个等边三角形然后在三角形的基础上利用理论课上的Koch曲线的画法,产生一朵Koch雪花,由于Koch雪花的产生相当于将三条等长的直线分别产生的Koch曲线按照等边三角形的坐标形式组合起来然后在同一个坐标系中表示出来,这就形成了Koch雪花图案。
四、背景知识介绍1.什么是迭代迭代法是常用的一种数学方法,就是将一种规则反复作用在某个对象上,它可以产生非常复杂的行为。
我们这里介绍图形迭代和函数迭代两种方式。
(1)图形迭代。
给定初始图形F0,以及一个替换规则R,将R反复作用在初始图形F0上,产生一个图形序列:R(F0)=F1,R(F1)=F2,R(F2)=F3,…(2)函数迭代。
给定初始值x0,以及一个函数f(x),将f(x)反复作用在初始值x0上,产生一个数列:f(x)=x1,f(x1)=x2,f(x2)=x3,…2.p lot函数介绍plot是最重要最基本的二维曲线绘图指令,基本功能是画折线和曲线。
基本调用格式如下:(1)plot(Y,LineSpec)。
其中,Y一般是数组;而LineSpec是用来指定线型、色彩等的选项字符串,可省略。
本功能是以数组Y作为竖坐标,以数组元素的下标为横坐标,画出一条折线。
当数组元素很多时,就出现连续曲线的效果。
(2) plot(X,Y)。
其中,X、Y一般是相同长度的数组。
广义分形维数的参数
广义分形维数(也称为Minkowski-Bouligand维数或箱计数维数)是用来描述分形结构复杂度的参数之一。
这个维数通常用来度量一个对象的空间维度,尤其是对于那些不规则的、复杂的几何形状。
广义分形维数可以根据不同的测量方法和上下文而有不同的定义,但通常有两种常见的参数:
1. 盒子计数参数(Box-Counting Dimension):这是最常见的广义分形维数定义之一。
它涉及到将一个空间分成较小的盒子,然后计算分形对象占据的这些盒子的数量。
这个定义通常用D表示。
在这种情况下,广义分形维数D可以通过以下公式计算:
D = lim (log(N) / log(1/ε))
其中N是分形对象在ε尺度下的盒子数,ε是盒子的尺寸,lim 表示当ε趋于0时的极限。
2. 信息维数参数(Information Dimension):这个参数更侧重于描述分形对象的信息内容。
信息维数通常用Df表示,它可以通过以下公式计算:
Df = -lim (log(P(ε)) / log(ε))
其中P(ε)是分形对象上ε尺度下的盒子覆盖概率,lim表示当ε趋于0时的极限。
需要注意的是,广义分形维数的计算方法可以因研究问题而有所不同,因此具体的参数和计算方式可能会根据上下文和应用而变化。
这些参数通常用于分析分形几何对象,以了解它们的复杂性和自相似性。
Matlab实现递归算法生成3维分形树注:此算法树根在侧面,需对坐标轴进行旋转便可得到上图效果以下代码全部粘贴到一个M文件中命名为TreeByL 即可运行为方便网友研读代码加入了大量注释同时愿与matlab程序爱好者进行交流:Linking508@%%%%%%%%%%%%%%%%%%%%%%%%%% %%%Matlab实现递归算法生成3维分形树%ByLinking %%%%%%%%%%%%%%%%%%%%%%%%%% %%function TreeByLL=15;%主干长a=0;b=pi/3;r=0;%r=pi/5;%分支生成函数makeBranch(0,0,0,L,a,b,r);% a在XOZ平面投影与X轴夹角b与Y轴的夹角r与主干的夹角function makeBranch (x,y,z,L,a,b,r)B=pi/5;s1=1.5;s2=3;s3=1.2;%B枝干的倾斜度C主干的倾斜度s1细腻程度s2分支收缩速度s3主干收缩速度% B=pi/5;s1=1.5;s2=2.4;s3=1.35;if L>s1x1=x+L/s2*cos(a)*cos(r);y1=y+L/s2*sin(a);z1=z+L/s2*cos(a)*sin(r);x1R=x1+L/s2*cos(a-b)*cos(r);y1R=y1+L/s2*sin(a-b);z1R=z1+L/s2*cos(a-b)*sin(r);x1L=x1+L/s2*cos(a+b)*cos(r);y1L=y1+L/s2*sin(a+b);z1L=z1+L/s2*cos(a+b)*sin(r);x1F=x1+L/s2*cos((a-b)*sin(a))*cos(r+atan(1/cos(a)));y1F=y1+L/s2*sin((a-b)*sin(a));z1F=z1+L/s2*cos((a-b)*sin(a))*sin(r+atan(1/cos(a)));x1B=x1+L/s2*cos((a-b)*sin(a))*cos(r-atan(1/cos(a)));y1B=y1+L/s2*sin((a-b)*sin(a));z1B=z1+L/s2*cos((a-b)*sin(a))*sin(r-atan(1/cos(a)));%------------------------------------------------------x2=x+L/s2*cos(a)*cos(r);y2=y+L/s2*sin(a);z2=z+L/s2*cos(a)*sin(r);x2R=x2+L/s2*cos(a-b)*cos(r);y2R=y2+L/s2*sin(a-b);z2R=z2+L/s2*cos(a-b)*sin(r);x2L=x2+L/s2*cos(a+b)*cos(r);y2L=y2+L/s2*sin(a+b);z2L=z2+L/s2*cos(a+b)*sin(r);x2F=x2+L/s2*cos((a-b)*sin(a))*cos(r+atan(1/cos(a)));y2F=y2+L/s2*sin((a-b)*sin(a));z2F=z2+L/s2*cos((a-b)*sin(a))*sin(r+atan(1/cos(a)));x2B=x2+L/s2*cos((a-b)*sin(a))*cos(r-atan(1/cos(a)));y2B=y2+L/s2*sin((a-b)*sin(a));z2B=z2+L/s2*cos((a-b)*sin(a))*sin(r-atan(1/cos(a)));plot3([x,x2],[y,y2],[z,z2],'k');holdon;set(gcf,'color','w');grid on;view(pi/2,0);%axis off;xlabel('X Label');ylabel('Y Label');zlabel('Z Label');set(gca,'xlim',[0,25],'ylim',[-15,15],'zlim',[-15,15]);plot3([x2,x2R],[y2,y2R],[z2,z2R],'g');hold on;plot3([x2,x2L],[y2,y2L],[z2,z2L],'g');hold on;plot3([x2,x2B],[y2,y2B],[z2,z2B],'g');hold on;plot3([x2,x2F],[y2,y2F],[z2,z2F],'g');hold on;plot3([x1,x1R],[y1,y1R],[z1,z1R],'g');hold on;plot3([x1,x1L],[y1,y1L],[z1,z1L],'g');hold on;plot3([x1,x1B],[y1,y1B],[z1,z1B],'g');hold on;plot3([x1,x1F],[y1,y1F],[z1,z1F],'g');hold on;%------------------------------------------------------makeBranch(x2,y2,z2,L/s3,a,b,r);makeBranch(x2L,y2L,z2L,L/s2,a,b,r+B);makeBranch(x2B,y2B,z2B,L/s2,a,b,r-B);makeBranch(x2F,y2F,z2F,L/s2,a,b,r+B);makeBranch(x2R,y2R,z2R,L/s2,a,b,r-B);makeBranch(x1L,y1L,z1L,L/s2,a,b,r+B);makeBranch(x1B,y1B,z1B,L/s2,a,b,r-B);makeBranch(x1F,y1F,z1F,L/s2,a,b,r+B);makeBranch(x1R,y1R,z1R,L/s2,a,b,r-B);end。
一维曲线分形维数的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用结构函数法计算分形维数程序理论说明1. 引言1.1 概述本文旨在介绍使用结构函数法计算分形维数的程序和相关理论。
分形维数是描述自然界和人工物体中不规则结构复杂程度的重要指标之一,它能够定量衡量对象的自相似性和尺度变换特征。
而结构函数法是一种计算分形维数的常用方法,它通过测量对象的尺度不变性来实现对分形维数的求解。
1.2 文章结构本文共分为四个部分;引言部分即本章首先对文章进行概述和简介;接着第二部分将介绍分形维数的基本概念以及与结构函数法计算之间的关系;第三部分将详细介绍如何在Matlab环境下使用结构函数法来计算分形维数,并给出具体示例数据和结果展示;最后,第四部分将给出总结,回顾研究目的,总结各种方法并展望改进和应用前景。
1.3 目的本文旨在向读者介绍使用Matlab编写程序进行结构函数法计算分形维数的方法,并通过具体数据案例展示其有效性。
通过本文的阅读,读者将了解到什么是分形维数以及在实际研究中如何使用结构函数法来计算分形维数。
同时,本文还将讨论该方法的优缺点,并探究其未来的应用前景和改进方向。
以上是关于“1. 引言”部分的详细内容,希望能对您撰写长文提供帮助。
2. 正文:2.1 分形维数的基本概念分形维数是描述分形对象复杂程度的重要指标。
分形是一类特殊的几何结构,具有自相似性和无限细节等特征。
分形维数通常用于量化描述分形对象的粗糙程度和层级结构。
2.2 结构函数法与分形维数计算的关系结构函数法是一种常用于计算分形维数的方法,其基本思想是通过结构函数来测量物体在不同尺度下的信息量。
结构函数可以通过计算物体上不同区域内对应尺度上像素值差异的平均值来得到。
分析这些差异可以揭示出物体在不同尺度下的内在结构规律,从而计算出其分形维数。
2.3 Matlab中使用结构函数法计算分形维数的程序步骤在Matlab中使用结构函数法计算分形维数需要以下步骤:步骤1: 读取并预处理图像或数据集。
首先将图像或数据集转换为灰度图像,并进行必要的预处理操作(如噪声去除、平滑等),以便更好地提取其结构信息。
petrosian分形维数Petrosian分形维数Petrosian分形维数是一种用于描述信号或数据的复杂性和自相似性的分形维数。
它由Armenak Petrosian于1995年提出,并广泛应用于信号处理、生物医学工程、金融市场分析等领域。
在这篇文章中,我们将介绍Petrosian分形维数的概念、计算方法以及其在实际应用中的意义。
Petrosian分形维数是一种用于衡量时间序列数据的分形特征的数学工具。
它基于信号的自相似性,即信号在不同时间尺度上的相似性。
自相似性是一种重要的特征,它意味着信号的局部结构在不同的时间尺度下具有相似的特征。
Petrosian分形维数可以帮助我们揭示信号的自相似性并量化其复杂性。
计算Petrosian分形维数的方法相对简单,但非常有效。
首先,我们需要计算信号的Petrosian函数,该函数定义为信号中零交叉的次数减去其近似的平均值。
然后,我们计算Petrosian函数的标准差,并将其除以信号的标准差,得到Petrosian分形维数。
Petrosian分形维数越大,表示信号越复杂。
Petrosian分形维数在信号处理领域有着广泛的应用。
首先,它可以用于分析生物医学信号,如脑电图(EEG)、心电图(ECG)等。
通过计算Petrosian分形维数,我们可以评估这些信号的复杂性,并从中获取有关疾病状态或脑功能的重要信息。
例如,在脑电图中,Petrosian分形维数可以用于评估脑电活动的稳定性和变化,从而帮助医生诊断和治疗癫痫等疾病。
Petrosian分形维数还可以应用于金融市场分析。
金融市场的价格变动通常具有自相似性,即价格的涨跌模式在不同的时间尺度上具有相似的特征。
通过计算金融时间序列数据的Petrosian分形维数,我们可以评估市场的复杂性和波动性。
这对于投资者来说是非常重要的,因为它可以帮助他们预测市场的走势和制定投资策略。
除了上述应用之外,Petrosian分形维数还可以在其他领域中发挥作用。
分形与分形维数分类号O469 学校代码10495UDC530 学号0145023006武汉科技学院硕⼠学位论⽂⽆序系统中的分形⽣长研究作者姓名:⽥志华指导教师:⽥巨平教授学科门类:⼯学专业:机械设计及理论研究⽅向:分形与多孔介质完成⽇期:⼆零零七年四⽉Wuhan University of Science and EngineeringM. S. DissertationThe study of fractal growthin disorder systemByTIAN Zhi-huaDirected byProfessor TIAN Ju-pingApril 2007独创性声明本⼈郑重声明:所呈交的学位论⽂,是本⼈在导师的指导下,独⽴进⾏研究⼯作所取得的成果。
除⽂中已经注明引⽤的内容外,本论⽂不包含任何其他个⼈或集体已经发表或撰写过的作品成果。
对本⽂的研究作出重要贡献的个⼈和集体,均已在⽂中以明确⽅式标明。
本⼈完全意识到本声明的法律结果由本⼈承担。
学位论⽂作者签名:签字⽇期:年⽉⽇学位论⽂版权使⽤授权书本学位论⽂作者完全了解武汉科技学院有关保留、使⽤学位论⽂的规定。
特授权武汉科技学院可以将学位论⽂的全部或部分内容编⼊有关数据库进⾏检索,并采⽤影印、缩印或扫描等复制⼿段保存、汇编以供查阅和借阅。
同意学校向国家有关部门或机构送交论⽂的复印件和磁盘。
(保密的学位论⽂在解密后适⽤本授权说明)学位论⽂作者签名:导师签名:签字⽇期:年⽉⽇签字⽇期:年⽉⽇论⽂题⽬:⽆序系统中的分形⽣长研究专业:机械设计及理论硕⼠⽣:指导⽼师:摘要本⽂⾸先概述了分形理论的发展,分形和分形维数的定义,以及产⽣分形的物理机制与⽣长机制。
简要介绍了模拟分形⽣长的扩散置限凝聚(DLA)、电介质击穿 (DBM)、粘性指延(Viscous Fingering)、渗流等模型。
本⽂采⽤映射膨胀法构造了两种不同的Sierpinski地毯,运⽤Monte Carlo ⽅法研究了两种Sierpinski地毯中的有限扩散凝聚(DLA)⽣长。
A=imread('e:\1.jpg')
FF=size(A)
% 计算灰度矩阵的大小;
for i=1:FF(1)
for j=1:FF(2)
if A(i,j)==0 % 等多种运算是不支持“0”值的;
end
end
end
imwrite(A,’e:\2.jpg)’;
% 重新保存经校正后灰度矩阵;
A=imread('e:\2.jpg');
% 读入图像,并转化为矩阵
t=graythresh(A);
% 计算二值化阈值
B=im2bw(A,t);
% 输出图像的二值化矩阵
% image(B);
[x,y]=size(B);
% 图像尺寸
u=1;
V=nonzeros(B);
Area=sum(V)/(x*y);
for side_length=2:110
% 定义观测尺度,即正方形(盒子)边长
Hang=mod(x,side_length);
Lie=mod(y,side_length);
C=B(1:x-Hang,1:y-Lie);
% 若图像大小“x×y”不能被正方形
%“side_length ×side_length”整除,则舍去多余的“边幅”部分;[m,n]=size(C);
X=reshape(C,side_length, numel(C)/side_length);
interim1=sum(X);
Y=reshape(interim1,side_length,numel(interim1)/side_length);
interim2=sum(Y);
Number=numel(nonzeros(interim2));
% 计数有像素(“1”)的盒子数
interim=sum(interim2');
%当盒子边长为side_length时,统计出各个
% 盒子内的“1”值之和“interim2”,以及所有盒子“1”值总和“interim”,W(u,1)= Number;
u=u+1;
end
y=log(W);
x=log(2:110);
plot(x,y,'o');
Dbox=polyfit(x',y,1)
% 线性方程斜率的绝对值即为盒子维数
B=nonzeros(B);
Area % 给出像素的占有率。