华工数学实验作业3迭代与分形.docx
《华工数学实验作业3迭代与分形.docx》由会员分享,可在线阅读,更多相关《华工数学实验作业3迭代与分形.docx(17页珍藏版)》请在冰点文库上搜索。
华工数学实验作业3迭代与分形
《数学实验》报告
学院:
电子与信息学院
专业班级:
通信工程4班
学号:
************
**********
实验名称:
迭代与分形
实验日期:
2013.04.7
第三次实验
1.实验内容
1.对一个等边三角形,每条边按照Koch曲线的方式进行迭代,产生的分形图称为Koch雪花。
编制程序绘制出它的图形,并计算Koch雪花的面积,以及它的分形维数。
2.实验过程
方法一
仿照Koch曲线代码对三角形的每条边进行Koch曲线化,函数的输入参数有三角形的边长R和迭代次数k,输出Koch雪花图形以及雪花所围面积S.
KochSnow面积推导如下所示:
迭代次数k面积S
0:
S=
1:
S=
R2+
(
R)2*3
2:
S=
R2+
(
R)2*3+
((
)2R)2*32
3:
S=
R2+
(
R)2*3+
((
)2R)2*32+
((
)3R)2*33
``````
N:
S=
R2+
(
R)2*3+
((
)2R)2*32+
((
)3R)2*33+…
((
)nR)2*3n
如此相加下去,当Nà无穷时,S将为无穷大
源代码如下:
functionkochsnow(R,k)%R为正三角形边长,k为迭代次数
p01=[0,0];p02=[R/2,sqrt(3)*R/2];p03=[R,0];%3个起始点
S=0;%S为面积,开始设为0
forline=0:
2%依次对3条边进行Koch曲线运算
ifline==0;
p=[p01;p02];
elseifline==1;
p=[p02;p03];
elseline==2;
p=[p03;p01];
end
n=1;%存放线段的数量,初始值为1
A=[cos(pi/3),-sin(pi/3);sin(pi/3),cos(pi/3)];%变换矩阵用于计算新的结点
fors=1:
k
j=0;%j为行数
fori=1:
n
q1=p(i,:
);%目前线段的起点坐标
q2=p(i+1,:
);%目前线段的终点坐标
d=(q2-q1)/3;
j=j+1;r(j,:
)=q1;%原起点存入r
j=j+1;r(j,:
)=q1+d;%新1点存入r
j=j+1;r(j,:
)=q1+d+d*A';%新2点存入r
j=j+1;r(j,:
)=q1+2*d;%新3点存入r
end
n=4*n;%全部线段迭代一次后,线段数量乘4
clearp%清空p,注意:
最后一个终点q2不在r中
p=[r;q2];%一条边的全部结点
clearr
end
ifline==0;%把第一条边的全部结点放在a
a=p;
elseifline==1;%把第二条边的全部结点放在b
b=p;
elseline==2;%把第三条边的全部结点放在c
c=p;
end
end
all=[a;b;c];%三条边全部结点放入all
plot(all(:
1),all(:
2))%连接各个结点
fill(all(:
1),all(:
2),'g')%填充所围区域
fori=0:
k%计算KochSnow的面积
S=S+(3^(0.5-i))*0.25*(R^2);
end
S
axisequal
Koch雪花图形输入半径R=2
K=0时是正三角形此时面积为1.7321
K=1时是正六边形此时面积为2.3094
K=2时的koch雪花此时面积为2.5019
K=3时的Koch雪花此时面积为2.5660
K=4时的Koch雪花此时面积为2.5874
分形维数:
根据迭代的规律得到:
相似形个数:
m=6边长放大倍数:
c=3,
1.631
方法2
只生成一次Koch曲线,然后对生成的Koch曲线进行旋转变换,旋转3次即可得到所需图形。
代码略去。
图形如下
第二题
1.实验内容
自己构造生成元(要有创意),按照图形迭代的方式产生分形图,用计算机编制程序绘制出它的图形,并计算其分形维数。
2.实验过程
在原来Koch曲线的基础上修改旋转矩阵,并对一个图形进行旋转,得到如下的一些图形
图形1:
飞镖
代码如下
functionmyPicture(k)%k取4的效果
p=[00;100];%P为初始两个点的坐标,第一列为x坐标,第二列为y坐标
n=2;%n为结点数
A1=[cos(pi/3),-sin(pi/3);sin(pi/3),cos(pi/3)];
A2=[cos(pi/4),-sin(pi/4);sin(pi/4),cos(pi/4)];
A=[0-1;10];%旋转矩阵
fori=1:
k
d=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+1*d*A';%用向量方法计算迭代后处于5k+3位置上的点的坐标
p(4:
5:
m,:
)=q+2*d+1*d*A';%用向量方法计算迭代后处于5k+4位置上的点的坐标
p(5:
5:
m,:
)=q+2*d;%用向量方法计算迭代后处于5k位置上的点的坐标
n=m;%迭代后新的结点数目
end
fori=1:
8
p=[p;p*A2'];
end
plot(p(:
1),p(:
2),'b')%绘出每相邻两个点的连线
axisequal
图形2:
叶子
代码:
functionkochfeibiao(R,k)
p01=[0,0];p02=[0,R];p03=[R,R];p04=[R,0];
S=0;
%A1=[cos(pi/4),-sin(pi/4);sin(pi/4),cos(pi/4)];
forline=0:
3
ifline==0;
p=[p01;p02];
elseifline==1;
p=[p02;p03];
elseifline==2;
p=[p03;p04];
elseifline==3;
p=[p04;p01];
end
n=2;%n为结点数
A=[0-1;10];%旋转矩阵
fori=1:
k
d=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+0.5*d*A';%用向量方法计算迭代后处于5k+3位置上的点的坐标
p(4:
5:
m,:
)=q+2*d+0.5*d*A';%用向量方法计算迭代后处于5k+4位置上的点的坐标
p(5:
5:
m,:
)=q+2*d;%用向量方法计算迭代后处于5k位置上的点的坐标
n=m;%迭代后新的结点数目
end
ifline==0;
a=p;
elseifline==1;
b=p;
elseifline==2;
c=p;
elseifline==3;
d=p;
end
end
all=[a;b;c;d];
%all=all*A1';
plot(all(:
1),all(:
2),'b')
fill(all(:
1),all(:
2),'g')
holdon
x0=1;y0=1;%画一个圆放置在叶子中间
r=0.1;
theta=0:
pi/100:
2*pi;
x=x0+r*cos(theta);
y=y0+r*sin(theta);
plot(x,y,'k');
fill(x,y,'w');
axissquare;
axisequal
图形三:
地毯
在上面叶子的基础上改变了某些参数得出的
代码如下
functionkochfeibiao(R,k)
%R=2;%半径设为2,面积好计算
p01=[0,0];p02=[0,R];p03=[R,R];p04=[R,0];
S=0;
%A1=[cos(pi/4),-sin(pi/4);sin(pi/4),cos(pi/4)];
forline=0:
3
ifline==0;
p=[p01;p02];
elseifline==1;
p=[p02;p03];
elseifline==2;
p=[p03;p04];
elseifline==3;
p=[p04;p01];
end
n=2;%n为结点数
A=[0-1;10];%旋转矩阵
fori=1:
k
d=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+1*d*A';%用向量方法计算迭代后处于5k+3位置上的点的坐标
p(4:
5:
m,:
)=q+2*d+1*d*A';%用向量方法计算迭代后处于5k+4位置上的点的坐标
p(5:
5:
m,:
)=q+2*d;%用向量方法计算迭代后处于5k位置上的点的坐标
n=m;%迭代后新的结点数目
end
ifline==0;
a=p;
elseifline==1;
b=p;
elseifline==2;
c=p;
elseifline==3;
d=p;
end
end
all=[a;b;c;d];
%all=all*A1';
plot(all(:
1),all(:
2),'b')
fill(all(:
1),all(:
2),'g')
holdon
x0=1;y0=1;%画一个圆放置在叶子中间
r=0.1;
theta=0:
pi/100:
2*pi;
x=x0+r*cos(theta);
y=y0+r*sin(theta);
plot(x,y,'k');
fill(x,y,'w');
axissquare;
axisequal
过程中还生成了其它有趣的图形,就不一一画出了。