六个分形图形的matlab实现(6)
matlab分形

尽管分形几何的提出只有三十年左右的时间, 但它已经在自然科学的各个领域如数学、物理、 化学、地理、天文、材料、生命乃至经济、社会、 艺术等极其广泛的领域有着广泛的应用。
这里以迭代的观点介绍分形的基本特性以及生 成分形图形的基本方法。
生成元产生的分形图形
由IFS(迭代函数系)所生成的分形图形
一、生成元产生的分形图形
经过计算,可以得到如下结论: 当 z0 [1.5,1.5] 时,z值始终不会超出某个范围; 而当 z0 小于-1.5或大于1.5后,z值最终将趋于无穷。
现在,我们把这个函数扩展到整个复数范围。对 于复数 z0 x iy ,取不同的x 值和y 值,函数迭代的 结果不一样:对于有些 z0 ,函数值约束在某一范围内; z0 而对于另一些 ,函数值则发散到无穷。由于复数对 应平面上的点,因此我们可以用一个平面图形来表示。 z 我们用深灰色表示不会使函数值趋于无穷的 对于其0 ; z0 它的 ,我们用不同的颜色来区别不同的发散速度。 | z | 2 由于当某个时候 时,函数值一定发散,因此这 里定义发散速度为:使|z|大于2的迭代次数越少,则 发散速度越快。编程画出这个图形。
该吸引子就是一个分形。 利用I FS迭代可以生成各种漂亮的分形图形,而 且I FS迭代的优点是程序具有通用性,要想得到不同 的分形图形,只需改变仿射变换中的系数和概率的 值即可。
Barnsley(巴斯理)羊齿叶
w a
1 2 3 4 0 0.85 0.2 -0.15
b
c
d
e
f
0 1.6 1.6 0.44
由生成元产生的分形是一种规则分形,是数学 家按一定规则构造出来的,相当于物理中的模型。 这类图形的构造方式都有一个共同的特点:
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混沌,分形对于函数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方块排列代码

matlab方块排列代码方块排列是一种常见的图像处理和计算机视觉任务,它可以通过将图像分割为不同的方块,并按照一定规则重新排列来改变图像的外观。
在本文中,我们将探讨一些使用MATLAB编程语言实现方块排列的代码。
首先,我们需要加载一张图像作为输入。
我们可以使用MATLAB的imread函数来读取图像文件,该函数返回一个表示图像的矩阵。
例如,我们可以使用以下代码来加载名为"image.jpg"的图像:```image = imread('image.jpg');```接下来,我们需要确定方块的大小和形状。
一种常见的方法是将图像分割为正方形方块,但你也可以使用其他形状,如长方形或五边形。
在本文中,我们将使用正方形方块。
假设我们要将图像分割为NxN个方块,我们可以使用MATLAB的imresize函数来调整图像的大小,使得每个方块的大小为像素值为MxM。
以下是实现这一步骤的代码:```N = 10; % 每行/列的方块数量M = size(image, 1) / N; % 每个方块的像素数量resized_image = imresize(image, [M*N, M*N]);```接下来,我们需要创建一个空的画布来存储重新排列后的方块。
我们可以使用MATLAB的zeros函数创建一个MxMx3的矩阵,其中3表示每个像素的RGB值。
以下是实现这一步骤的代码:```canvas = zeros(M*N, M*N, 3);```现在,我们可以开始对图像进行方块排列。
我们可以使用两个嵌套的for循环来迭代遍历输入图像中的每个方块,并将其复制到我们创建的画布上的相应位置。
以下是实现这一步骤的代码:```for i = 1:Nfor j = 1:Nx = (i - 1) * M + 1;y = (j - 1) * M + 1;canvas(x:x+M-1, y:y+M-1, :) = resized_image((j-1)*M+1:j*M, (i-1)*M+1:i*M, :);endend```最后,我们可以使用MATLAB的imshow函数显示重新排列后的图像。
分形几何中一些经典图形的Matlab画法+[文档在线提供]
![分形几何中一些经典图形的Matlab画法+[文档在线提供]](https://img.taocdn.com/s3/m/4c6dde4b1eb91a37f1115c52.png)
分形几何中一些经典图形的Matlab画法(1)Koch曲线程序koch.mfunction koch(a1,b1,a2,b2,n)%koch(0,0,9,0,3)%a1,b1,a2,b2为初始线段两端点坐标,n为迭代次数a1=0;b1=0;a2=9;b2=0;n=3;%第i-1次迭代时由各条线段产生的新四条线段的五点横、纵坐标存储在数组A、B中[A,B]=sub_koch1(a1,b1,a2,b2);for i=1:nfor j=1:length(A)/5;w=sub_koch2(A(1+5*(j-1):5*j),B(1+5*(j-1):5*j));for k=1:4[AA(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5),BB(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5)] =sub_koch1(w(k,1),w(k,2),w(k,3),w(k,4));endendA=AA;B=BB;endplot(A,B)hold onaxis equal%由以(ax,ay),(bx,by)为端点的线段生成新的中间三点坐标并把这五点横、纵坐标依次分别存%储在数组A,B中function [A,B]=sub_koch1(ax,ay,bx,by)cx=ax+(bx-ax)/3;cy=ay+(by-ay)/3;ex=bx-(bx-ax)/3;ey=by-(by-ay)/3;L=sqrt((ex-cx).^2+(ey-cy).^2);alpha=atan((ey-cy)./(ex-cx));if (ex-cx)<0alpha=alpha+pi;enddx=cx+cos(alpha+pi/3)*L;dy=cy+sin(alpha+pi/3)*L;A=[ax,cx,dx,ex,bx];B=[ay,cy,dy,ey,by];%把由函数sub_koch1生成的五点横、纵坐标A,B顺次划分为四组,分别对应四条折线段中%每条线段两端点的坐标,并依次分别存储在4*4阶矩阵k中,k中第i(i=1,2,3,4)行数字代表第%i条线段两端点的坐标function w=sub_koch2(A,B)a11=A(1);b11=B(1);a12=A(2);b12=B(2);a21=A(2);b21=B(2);a22=A(3);b22=B(3);a31=A(3);b31=B(3);a32=A(4);b32=B(4);a41=A(4);b41=B(4);a42=A(5);b42=B(5);w=[a11,b11,a12,b12;a21,b21,a22,b22;a31,b31,a32,b32;a41,b41,a42,b42];图1 V on Koch曲线(2)Levy 曲线程序levy.mfunction levy(n)% levy(16),n为levy曲线迭代次数%x1,y1,x2,y2为初始线段两端点坐标,nn为迭代次数n=16;x1=0;y1=0;x2=1;y2=0;%第i-1次迭代时由各条线段产生的新两条线段的三端点横、纵坐标存储在数组X、Y中[X,Y]=levy1(x1,y1,x2,y2);for i=1:nfor j=1:length(X)/3w=levy2(X(1+3*(j-1):3*j),Y(1+3*(j-1):3*j));[XX(3*2*(j-1)+1:3*2*(j-1)+3),YY(3*2*(j-1)+1:3*2*(j-1)+3)]=levy1(w(1,1),w(1,2),w(1,3),w(1,4) );[XX(3*2*(j-1)+3+1:3*2*(j-1)+3+3),YY(3*2*(j-1)+3+1:3*2*(j-1)+3+3)]=levy1(w(2,1),w(2,2),w( 2,3),w(2,4));endX=XX;Y=YY;endplot(X,Y)hold onaxis equal%由以(x1,y1),(x2,y2)为端点的线段生成新的中间点坐标并把(x1,y1),(x2,y2)连同新点横、纵坐%标依次分别存储在数组X,Y中function [X,Y]=levy1(x1,y1,x2,y2)x3=1/2*(x1+x2+y1-y2);y3=1/2*(-x1+x2+y1+y2);X=[x1,x3,x2];Y=[y1,y3,y2];%把由函数levy1生成的三点横、纵坐标X,Y顺次划分为两组,分别对应两条折线段中每条线%段两端点的坐标,并依次分别存储在2*4阶矩阵w中,w中第i(i=1,2)行数字代表第i条线段%两端点的坐标function w=levy2(X,Y)a11=X(1);b11=Y(1);a12=X(2);b12=Y(2);a21=X(2);b21=Y(2);a22=X(3);b22=Y(3);w=[a11,b11,a12,b12;a21,b21,a22,b22];图2 Levy 曲线(3)分形树程序tree.hfunction tree(n,a,b)% tree(8,pi/8,pi/8),n为分形树迭代次数%a,b为分枝与竖直方向夹角%x1,y1,x2,y2为初始线段两端点坐标,nn为迭代次数n=8;a=pi/8;b=pi/8;x1=0;y1=0;x2=0;y2=1;plot([x1,x2],[y1,y2])hold on[X,Y]=tree1(x1,y1,x2,y2,a,b);hold onW=tree2(X,Y);w1=W(:,1:4);w2=W(:,5:8);% w为2^k*4维矩阵,存储第k次迭代产生的分枝两端点的坐标, % w的第i(i=1,2,…,2^k)行数字对应第i个分枝两端点的坐标w=[w1;w2];for k=1:nfor i=1:2^k[X,Y]=tree1(w(i,1),w(i,2),w(i,3),w(i,4),a,b);W(i,:)=tree2(X,Y);endw1=W(:,1:4);w2=W(:,5:8);w=[w1;w2];end%由每个分枝两端点坐标(x1,y1),(x2,y2)产生两新点的坐标(x3,y3),(x4,y4),画两分枝图形,并把%(x2,y2)连同新点横、纵坐标分别存储在数组X,Y中function [X,Y]=tree1(x1,y1,x2,y2,a,b)L=sqrt((x2-x1)^2+(y2-y1)^2);if (x2-x1)==0a=pi/2;else if (x2-x1)<0a=pi+atan((y2-y1)/(x2-x1));elsea=atan((y2-y1)/(x2-x1));endendx3=x2+L*2/3*cos(a+b);y3=y2+L*2/3*sin(a+b);x4=x2+L*2/3*cos(a-b);y4=y2+L*2/3*sin(a-b);a=[x3,x2,x4];b=[y3,y2,y4];plot(a,b)axis equalhold onX=[x2,x3,x4];Y=[y2,y3,y4];%把由函数tree1生成的X,Y顺次划分为两组,分别对应两分枝两个端点的坐标,并存储在一维%数组w中function w=tree2(X,Y)a1=X(1);b1=Y(1);a2=X(2);b2=Y(2);a3=X(1);b3=Y(1);a4=X(3);b4=Y(3);w=[a1,b1,a2,b2,a3,b3,a4,b4];图3 分形树(4)IFS算法画Sierpinski三角形程序sierpinski_ifs.hfunction sierpinski_ifs(n,w1,w2,w3)%sierpinski_ifs(10000,1/3,1/3,1/3)%w1,w2,w3出现频率n=10000;w1=1/3;w2=1/3;w3=1/3;M1=[0.5 0 0 0 0.5 0];M2=[0.5 0 0.5 0 0.5 0];M3=[0.5 0 0.25 0 0.5 0.5];x=0;y=0;% r为[0,1]区间内产生的n维随机数组r=rand(1,n);B=zeros(2,n);k=1;% 当0<r(i)<1/3时,进行M1对应的压缩映射;% 当1/3=<r(i)<2/3时,进行M2对应的压缩映射;% 当2/3=<r(i)<1时,进行M3对应的压缩映射;for i=1:nif r(i)<w1a=M1(1);b=M1(2);e=M1(3);c=M1(4);d=M1(5);f=M1(6);else if r(i)<w1+w2a=M2(1);b=M2(2);e=M2(3);c=M2(4);d=M2(5);f=M2(6);else if r(i)<w1+w2+w3a=M3(1);b=M3(2);e=M3(3);c=M3(4);d=M3(5);f=M3(6);endendendx=a*x+b*y+e;y=c*x+d*y+f;B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)图4 Sierpinski三角形(5)IFS算法画Julia集程序julia_ifs.hfunction julia_ifs(n,cx,cy)% julia_ifs(100000,-0.77,0.08)% f(z)=z^2+c,cx=real(c);cy=image(c);n=10000;cx=-0.77;cy=0.08;% z^2+c=z0,x=real(z0);y=image(z0);x=1;y=1;B=zeros(2,n);k=1;% A为产生的服从标准正态分布的n维随机数组A=randn(1,n);for i=1:nwx=x-cx;wy=y-cy;if wx>0alpha=atan(wy/wx);endif wx<0alpha=pi+atan(wy/wx);endif wx==0alpha=pi/2;endalpha=alpha/2;r=sqrt(wx^2+wy^2);if A(i)<0r=-sqrt(r);elser=sqrt(r);endx=r*cos(alpha);y=r*sin(alpha);B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)图5 Julia 集(6)逃逸时间算法画Sierpinski垫片程序sierpinski.hfunction sierpinski(a,b,c,d,n,m,r)%sierpinski(0,0,1,1,12,200,200)%(a,b),(c,d)收敛区域左上角和右下角坐标,m为分辨率% n为逃逸时间,需要反复试探,r逃逸半径a=0;b=0;c=1;d=1;n=12;m=200;r=200;B=zeros(2,m*m);w=1;for i=1:mx0=a+(c-a)*(i-1)/m;for j=1:my0=b+(d-b)*(j-1)/m;x=x0;y=y0;for k=1:nif y>0.5x=2*x;y=2*y-1;else if x>=0.5x=2*x-1;y=2*y;elsex=2*x;y=2*y;endif x^2+y^2>rbreak;endendif k==nB(1,w)=i;B(2,w)=j;w=w+1;endendendplot(B(1,:),B(2,:),'.','markersize',0.1)图6 Sierpinski三角形垫片(7)元胞自动机算法画Sierpinski三角形程序一维元胞自动机sierpinski_ca1.hfunction sierpinski_ca1(m,n)%sierpinski_ca1(1000,3000)m=1000;n=3000;x=1;y=1;t=1;w=zeros(2,m*n);s=zeros(m,n);s(1,fix(n/3))=1;for i=1:m-1for j=2:n-1if (s(i,j-1)==1&s(i,j)==0&s(i,j+1)==0)|(s(i,j-1)==0&s(i,j)==0&s(i,j+1)==1) s(i+1,j)=1;w(1,t)=x+3+3*j;w(2,t)=y+5*i;t=t+1;endendendplot(w(1,:),w(2,:),'.','markersize',1)图7.1 一维元胞自动机画Sierpinski三角形二维元胞自动机sierpinski_ca2.hfunction sierpinski_ca2(m,n)%sierpinski_ca2(400,400)m=400;n=400;t=1;w=zeros(2,m*n);s=zeros(m,n);s(m/2,n/2)=1;for i=[m/2:-1:2,m/2:m-1]for j=[n/2:-1:2,n/2:n-1]ifmod(s(i-1,j-1)+s(i,j-1)+s(i+1,j-1)+s(i-1,j)+s(i+1,j)+s(i-1,j+1)+s(i,j+1)+s(i+1,j+1),2)==1 s(i,j)=1;w(1,t)=i;w(2,t)=j;t=t+1;endendendplot(w(1,:),w(2,:),'.','markersize',0.1)图7.2 二维元胞自动机画Sierpinski三角形(8)IFS算法画Helix曲线程序helix_ifs.hfunction helix_ifs(n,w1,w2,w3)%helix_ifs(20000,0.9,0.05,0.05)%w1,w2,w3为出现频率n=20000;w1=0.9;w2=0.05;w3=0.05;M1=[0.787879 -0.424242 1.758647 0.242424 0.859848 1.408065];M2=[-0.121212 0.257576 -6.721654 0.05303 0.05303 1.377236];M3=[0.181818 -0.136364 6.086107 0.090909 0.181818 1.568035];x=0;y=0;% r为[0,1]区间内产生的n维随机数组r=rand(1,n);B=zeros(2,n);k=1;% 当0<r(i)<1/3时,进行M1对应的压缩映射;% 当1/3=<r(i)<2/3时,进行M2对应的压缩映射;% 当2/3=<r(i)<1时,进行M3对应的压缩映射;for i=1:nif r(i)<w1a=M1(1);b=M1(2);e=M1(3);c=M1(4);d=M1(5);f=M1(6);else if r(i)<w1+w2a=M2(1);b=M2(2);e=M2(3);c=M2(4);d=M2(5);f=M2(6);else if r(i)<w1+w2+w3a=M3(1);b=M3(2);e=M3(3);c=M3(4);d=M3(5);f=M3(6);endendendx=a*x+b*y+e;y=c*x+d*y+f;B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)图8 Helix曲线。
实验三MATLAB的图形功能于分形

Nanjing University of Posts and Telecommunications
用给定数据绘制三维曲面
在绘图数据已知的情况下, 可以利用mesh, surf 和surfl等函数分别绘制网格图, 刻面图和曲面图. 其中刻面图是用不同颜色对网格图中的单元进 行填充, 而曲面图是对刻面图的颜色进行了平滑 处理. 绘制三维曲面图可分为三个过程:
生成平面网格点数据; 计算三维网格点数据; 绘制三维曲面并进行处理
南 京 邮 电 大 学
Nanjing University of Posts and Telecommunications
Matlab在绘制函数z=f(x, y)的三维图形时,首 先将其定义域D分为若干个小矩形(或三角形), 然后计算出网格点上的函数值,最后连接相邻 的函数值空间数据并构成函数的网格曲面。我 们以矩形网格为例。
xmax], 或者x轴和y轴上的范围[xmin xmax ymin
ymax]. function必须是M文件函数的名称或句柄, 或者含 有变量x的字符串. LineSpec指定属性进行绘图.
南 京 邮 电 大 学
Nanjing University of Posts and Telecommunications
京 邮 电 大 学
南
Nanjing University of Posts and Telecommunications
Plot(X,Y) —— 最基本的二维图形命令
plot命令自动打开一个图形窗口Figure1
原理:
用直线连接相邻两数据点来绘制图形 根据图形坐标大小自动缩扩坐标轴,将数据标尺及单 位标注自动加到两个坐标轴上 使用方法:
几个分形的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由于中间三分之一部分是一个正方形时,有很多连接的部分。
第7章分形维数应用与MATLAB实现

第7章分形维数应用与MATLAB实现分形维数是描述分形结构复杂性的一个重要指标,通过分形维数可以对分形物体的几何特征进行度量。
分形维数的应用十分广泛,可以应用于自然科学、工程技术、生物医学等多个领域。
在自然科学中,分形维数被广泛应用于地理地貌、气象学、流体力学等领域。
例如,在地理地貌中,通过计算地形的分形维数可以揭示地形的形态特征,如地表的复杂程度、地面的起伏程度等。
在气象学中,通过计算云雾的分形维数可以揭示云雾的形态特征,如云雾的密度、结构等。
在流体力学中,通过计算流体流动的分形维数可以揭示流体流动的特征,如流体流动的无规则性、混沌性等。
在工程技术中,分形维数被广泛应用于图像处理、信号处理、网络优化等领域。
例如,在图像处理中,通过计算图像的分形维数可以对图像进行压缩、去噪等操作,提高图像的质量和处理效率。
在信号处理中,通过计算信号的分形维数可以对信号进行分析和识别,提取出信号的特征信息。
在网络优化中,通过计算网络的分形维数可以对网络结构进行优化,提高网络的传输和通信效率。
在生物医学中,分形维数被广泛应用于医学图像处理、疾病诊断、脑信号分析等领域。
例如,在医学图像处理中,通过计算病理图像的分形维数可以对病灶的形态特征进行量化,帮助医生进行病症的诊断和分析。
在疾病诊断中,通过计算生物信号(如心电图、脑电图等)的分形维数可以对疾病的发展和变化进行监测和分析,提供辅助诊断的依据。
MATLAB作为一种专门用于科学计算和数据可视化的工具,可以很方便地实现分形维数的计算和分析。
MATLAB提供了丰富的数学工具箱和图形工具箱,可以实现各种分形维数的算法和可视化方法。
通过调用相关函数和工具,用户可以快速、准确地计算和分析分形维数,并可视化展示分形结构的特征。
总之,分形维数在科学研究和工程应用中具有重要的作用。
通过应用分形维数,可以深入了解和揭示物体的几何特征和复杂性,为科学研究、工程技术和生物医学提供有效的分析工具和方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
几个分形的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:4
d=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; %迭代后新的结点数目
end
plot(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:4
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+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; %迭代后新的结点数目
end
plot(p(:,1),p(:,2)) %绘出每相邻两个点的连线
axis([0 10 0 10])
图4
由于中间三分之一部分是一个正方形时,有很多连接的部分。
所以我们将高度压缩到原来的0.7倍,即中间部分为一个长与宽之比为1:0.7的矩形时,得到程序和曲线如下:
p=[0 0;10 0]; %P为初始两个点的坐标,第一列为x坐标,第二列为y坐标
n=2; %n为结点数
A=[0 -1;1 0]; %旋转矩阵
for k=1:4
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.7*d*A'; %用向量方法计算迭代后处于5k+3位置上的点的坐标
p(4:5:m,:)=q+2*d+0.7*d*A'; %用向量方法计算迭代后处于5k+4位置上的点的坐标
p(5:5:m,:)=q+2*d; %用向量方法计算迭代后处于5k位置上的点的坐标
n=m; %迭代后新的结点数目
end
plot(p(:,1),p(:,2)) %绘出每相邻两个点的连线
axis([0 10 0 10])
图5
2.参照实验方法,我们由四边形的四个初始点出发,对于四边形的每条边,生成元如下:
图6
可得到火焰般的图形。
程序和曲线如下:
p=[0 10;10 0;0 -10;-10 0;0 10];
%P为四边形四个顶点的坐标,其中第五个点与第一个点重合,以便于绘图
%第一列为x坐标,第二列为y坐标
n=5; %n为结点数
A=[cos(-pi/3) -sin(-pi/3);sin(-pi/3) cos(-pi/3)]; %旋转矩阵,顺时针旋转60度
for k=1:5
d=diff(p)/3;m=4*n-3; %迭代公式
q=p(1:n-1,:);
p(5:4:m,:)=p(2:n,:);
p(2:4:m,:)=q+d;
p(3:4:m,:)=q+2*d+d*A';
p(4:4:m,:)=q+2*d;
n=m;
end
plot(p(:,1),p(:,2))
axis([-10 10 -10 10])
图7
3.参照实验方法,由下列的生成元,绘制Koch分形曲线:
图8
分析:为了绘图方便,我们将结点数处理一下,把第一次迭代产生的六个点看成十个点,即图中有五条线段(1-2,3-4,5-6,7-8,9-10),我们将每条线段的每个端点看成新的两个结点,这样我们就可以很方便地用plot绘图了。
程序和曲线如下:
p=[0 0;10 10]; %P为初始两个点的坐标,第一列为x坐标,第二列为y坐标
n=2; %n为结点数
A=[cos(pi/3) -sin(pi/3);sin(pi/3) cos(pi/3)];
B=[cos(-pi/3) -sin(-pi/3);sin(-pi/3) cos(-pi/3)];
%旋转矩阵A对应于第一次逆时针旋转60度,旋转矩阵B对应于第二次顺时针旋转60度
for k=1:4
d=diff(p)/3;
d1=d(1:2:n,:);%取每条线段对应的向量
m=5*n; %迭代公式
q1=p(1:2:n-1,:);
p(10:10:m,:)=p(2:2:n,:);
p(1:10:m,:)=p(1:2:n,:); %迭代后处于10k与10k+1位置上的点的坐标为迭代前的相应坐标p(2:10:m,:)=q1+d1;
%用向量方法计算迭代后处于10k+2,10k+3,10k+5位置上的点的坐标,都相同
p(3:10:m,:)=p(2:10:m,:);
p(4:10:m,:)=q1+d1+d1*A'; %用向量方法计算迭代后处于10k+4位置上的点的坐标
p(5:10:m,:)=p(2:10:m,:);
p(6:10:m,:)=q1+2*d1;
%用向量方法计算迭代后处于10k+6,10k+7,10k+9位置上的点的坐标,都相同
p(7:10:m,:)=p(6:10:m,:);
p(8:10:m,:)=q1+2*d1+d1*B';
p(9:10:m,:)=p(6:10:m,:);
n=m; %迭代后新的结点数目
end
plot(p(:,1),p(:,2)) %绘出每相邻两个点的连线
axis([0 10 0 10])
六,结束语
通过图形显示,更好的理解的分形同时也也加深对分形概念的进一步掌握参考文献:<<matlab从精通到入门>>。