实验三迭代与分形
一、实验目的与要求
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一般是相同长度的数组。
本功能是以数组Y作为
竖坐标,以数组X 为横坐标,画出一条折线。
当数组元素很多时,就出现连续曲线的效果。
五、实验过程
迭代次数k 线段数目k a 每一段的长k l 面积k S
0 3 10 2/1*60sin *10*10
1 3x4 13/10 2/60sin *)3/10(4*32100 +S
2 24*
3 23/10 2/60sin *)3/10(*4*32211
+S •
••
k k 4*3 k 3/10 60sin *)(*211k k k l a S --+ 所以4/)9/4(*3751k k k
S S +=- 所以k=0时,325=k S ;k>0时,
])94(1[*315325k k S -+= 有一条直线的koch 曲线可知,我们可以分别对等边三角形的每一条边进行koch 迭代,然后再把每一次迭代的结果进行重叠,就可以得到等边三角形的koch 迭代结果。
对于每一次迭代后所得的图形的面积计算,我们可以分析其中的规律,分析过程
迭代次数k 线段数目k a 每一段的长k l 面积k S
0 3 10 2/1*60sin *10*10
1 3x4 13/10 2/60sin *)3/10(4*32100 +S
2 24*
3 23/10 2/60sin *)3/10(*4*32211
+S •
••
k k 4*3 k 3/10 60sin *)(*211k k k l a S --+
所以
4/)9/4(*3751k k k S S +=- 所以k=0时,325=k
S ;k>0时,])94(1[*315325k k S -+=
程序代码如下:
function plotkochsnow(k)
for a=0:2
if a==0; p=[0 0;10 0]; %存放等边三角形底边直线的坐标,初始值为底边的坐标
elseif a==1; p=[10 0;5 5*3.^1/2] ; %存放等边三角形右腰的坐标,初始值为底边的坐标 µãµÄ×ø±ê
else a==2; p=[5 5*3.^1/2;0 0]; %存放等边三角形左腰的坐标,初始值为底边的坐标 end
n=1; %存放线段的数量,初始值为1 A=[cos(pi/3),-sin(pi/3);sin(pi/3),cos(pi/3)]; %用于计算新的结点
for s=1:k %实现迭代过程,计算所有的结点的坐标
j=0; % 结点的编号,不能取为1
%以下根据线段两个结点的坐标,计算迭代后它们之间增加的三个
%结点的坐标,并且将这些点的坐标按次序存暂时放到r 中
for i=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 %原终点作为下条线段的起点,在迭代下条线段时存入r
n=4*n; %全部线段迭代一次后,线段数量乘4
clear p %清空p ,注意:最后一个终点q2不在r 中
p=[r;q2]; %重新装载本次迭代后的全部结点
clear r
end
hold on ;
plot(p(:,1),p(:,2)) %在直角坐标系中分别显示出三条koch 曲线,并在同一直角坐标系中表示出来
axis equal %各坐标同比例,使坐标的长度单位设成相等
end
if k==0;S=25*sqrt(3),%求面积
else S=sqrt(3)*25+15*sqrt(3)*[1-(4/9)^k];
S
end
运行结果图K=1:
K=2:
K=3:
:
练习2.自己构造生成元(要有创意),按照图形迭代的方式产生分形图,用计算机编制程序绘制出它的图形,并计算其分形维数。
1.利用老师在课堂上所讲的谢尔宾斯基(Sierpinski)地毯的主体程序加以改造形成一个红黄相间小正方形的新的地毯图案。
程序源代码:
function plotSierpinski(x,y,d,n);
% x 为正方形的顶点的横坐标,可取0 (一个顶点代表一个小正方形)% y 为正方形的顶点的纵坐标,可取0
% d 为初始正方形边长,可取1
% n为迭代次数,可取4
for p=1:n %实现迭代过程,计算所有的顶点坐标
a1=[]; %保存迭代后所有顶点的x坐标
b1=[]; %保存迭代后所有顶点的y坐标
c1=[];
d1=[];
%根据小正方形的顶点坐标,
%计算迭代后形成的8个新的小正方形的顶点坐标
for q=1:length(x) %每个小正方形计算一次
x1=x(q)+[0,d/3,2*d/3,0,2*d/3,0,d/3,2*d/3]; %新的x坐标 y1=y(q)+[0,0,0,d/3,d/3,2*d/3,2*d/3,2*d/3]; %新的y坐标x2=x(q)+[d/3,0,2*d/3,d/3];
y2=y(q)+[0,d/3,d/3,2*d/3];
a1=[a1,x1]; %所有顶点x坐标存入a1
b1=[b1,y1]; %所有顶点y坐标存入b1
c1=[c1,x2];
d1=[d1,y2];
end
d=d/3; %迭代一次,边长缩小
x=a1; %全部的x坐标重新放入x
y=b1; %全部的y坐标重新放入y
k=c1;
h=d1;
end
figure
hold on %在同一个图形窗口显示
for q=1:length(x) %用蓝色注满多边形区域
fill(x(q)+[0,d,d,0,0],y(q)+[0,0,d,d,0],'b')
fill(k(q)+[0,d,d,0,0],y(q)+h[0,0,d,d,0],'b')
end
hold off
axis off %不要坐标轴
axis equal %各坐标轴同比例
%不显示这些正方形的边界
set(findobj(gcf,'type','patch'),'edgecolor','none')
效果图:
六、实验总结
由于之前已经学过一条直线段进行koch迭代的方法,所以在画雪花图的时候,我将koch迭代方法用于每一段直线上就能够得到雪花的效果图了,在对每一段直线进行迭代需要我们事先确定每条至在坐标系中的初始位置和每次运算满足的关系式,这样就能画出迭代的雪花了。
第二个练习是我花了很多时间去想的,但是效果还不是十分好,因为当迭代次数增加后我的这个运算就不能达到很好的效果了,但是还是比较美观的,我实在老师给的练习题上进行改动的。