几个分形的matlab实现资料
- 格式:doc
- 大小:137.50 KB
- 文档页数:7
数学实验报告:分形迭代练习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编写一个像素块分形程序。
首先,让我们了解一下什么是像素块分形。
像素块分形是一种数学形式,其中图像或对象通过将其分解成多个小的重复自相似块来创建。
这些自相似块可以在较高的分辨率下放大并重复以创建整个图像。
像素块分形是一种有趣且美丽的艺术形式,可以通过数学算法来生成。
接下来,让我们按照以下步骤编写一个Matlab像素块分形程序:第一步:导入所需的Matlab库和函数。
我们首先需要导入一些Matlab库和函数,以便在程序中使用它们。
这些库包括图像处理工具箱和绘图函数。
matlab导入Matlab库和函数addpath('toolbox_path'); 替换成图像处理工具箱路径导入其他所需的函数第二步:读取输入图像。
在这一步中,我们将从文件中读取输入图像。
你可以选择任何图像作为输入图像。
matlab读取输入图像input_image = imread('input_image.jpg'); 替换为你的输入图像路径显示输入图像figure; imshow(input_image);第三步:将输入图像进行处理。
在这一步中,我们将对输入图像进行一些预处理操作,以便后续的像素块分形生成算法可以应用。
matlab进行图像处理操作processed_image = imresize(input_image, [512, 512]); 调整图像大小为512x512像素显示处理后的图像figure; imshow(processed_image);第四步:像素块分形生成算法。
现在,我们将应用像素块分形算法来生成一个自相似的图像。
在这个例子中,我们将使用分形函数生成图像。
你可以根据自己的需求选择不同的算法。
matlab定义分形函数function fractal_image = generateFractalImage(image, n_iterations) 在这里实现你的分形函数返回自相似的图像end调用分形函数生成图像fractal_image = generateFractalImage(processed_image, 10); 替换迭代次数显示生成的图像figure; imshow(fractal_image);第五步:保存生成的图像。
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实现递归算法生成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用结构函数法计算分形维数程序理论说明1. 引言1.1 概述本文旨在介绍使用结构函数法计算分形维数的程序和相关理论。
分形维数是描述自然界和人工物体中不规则结构复杂程度的重要指标之一,它能够定量衡量对象的自相似性和尺度变换特征。
而结构函数法是一种计算分形维数的常用方法,它通过测量对象的尺度不变性来实现对分形维数的求解。
1.2 文章结构本文共分为四个部分;引言部分即本章首先对文章进行概述和简介;接着第二部分将介绍分形维数的基本概念以及与结构函数法计算之间的关系;第三部分将详细介绍如何在Matlab环境下使用结构函数法来计算分形维数,并给出具体示例数据和结果展示;最后,第四部分将给出总结,回顾研究目的,总结各种方法并展望改进和应用前景。
1.3 目的本文旨在向读者介绍使用Matlab编写程序进行结构函数法计算分形维数的方法,并通过具体数据案例展示其有效性。
通过本文的阅读,读者将了解到什么是分形维数以及在实际研究中如何使用结构函数法来计算分形维数。
同时,本文还将讨论该方法的优缺点,并探究其未来的应用前景和改进方向。
以上是关于“1. 引言”部分的详细内容,希望能对您撰写长文提供帮助。
2. 正文:2.1 分形维数的基本概念分形维数是描述分形对象复杂程度的重要指标。
分形是一类特殊的几何结构,具有自相似性和无限细节等特征。
分形维数通常用于量化描述分形对象的粗糙程度和层级结构。
2.2 结构函数法与分形维数计算的关系结构函数法是一种常用于计算分形维数的方法,其基本思想是通过结构函数来测量物体在不同尺度下的信息量。
结构函数可以通过计算物体上不同区域内对应尺度上像素值差异的平均值来得到。
分析这些差异可以揭示出物体在不同尺度下的内在结构规律,从而计算出其分形维数。
2.3 Matlab中使用结构函数法计算分形维数的程序步骤在Matlab中使用结构函数法计算分形维数需要以下步骤:步骤1: 读取并预处理图像或数据集。
首先将图像或数据集转换为灰度图像,并进行必要的预处理操作(如噪声去除、平滑等),以便更好地提取其结构信息。
Matlab中的分形几何和混沌理论技巧随着计算机科学和数学的不断发展,分形几何和混沌理论在许多领域中得到了广泛的应用。
作为一种强大的科学计算工具,Matlab提供了许多实用的技巧,使得分形几何和混沌理论的研究更加简单和高效。
本文将介绍一些在Matlab中使用分形几何和混沌理论的技巧,探索其在数学、物理和工程等领域的应用。
一、分形几何分形几何是一种研究自相似结构和复杂物体的数学理论。
Matlab提供了一系列强大的函数和工具,用于生成和分析分形几何图形。
1. 使用Fractal函数库Matlab中的Fractal函数库提供了许多用于生成各种分形图形的函数。
例如,使用Barnsley函数可以创建分形植物或分形地形图像,使用Mandelbrot函数可以绘制Mandelbrot集合的图像。
这些函数不仅提供了生成图形的算法,还可以通过调整参数来控制图形的细节。
2. 自定义分形函数除了使用现有的函数库,Matlab还允许用户定义自己的分形函数。
通过编写自定义函数,用户可以创建符合特定需求的分形图形。
例如,可以定义一个自相似函数来生成分形树状结构,或者定义一个混沌映射来生成分形图像。
3. 分形几何的应用分形几何在许多领域中具有广泛的应用。
在数学中,分形理论可以用于研究复杂系统和非线性动力学。
在物理学中,分形几何可以解释复杂的自然现象,例如分形天线的电磁波辐射特性。
在工程领域,分形几何可以用于设计具有特定性能的材料结构。
二、混沌理论混沌理论是研究非线性动力学系统中的无序行为的数学理论。
混沌现象具有极高的灵敏度和迅速的演变速度,可以用来描述一些看似随机但又遵循确定性规律的系统。
Matlab提供了一系列用于研究和模拟混沌系统的函数和工具。
1. 混沌映射Matlab中的Chaos函数库提供了许多常见的混沌映射函数,例如Logistic映射、Henon映射和Lorenz映射。
用户可以通过调整参数和初始条件来探索这些混沌映射的行为。
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]。
目录前言 (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集的精细结构,更不能想象可以产生具有无限细结的自然景物和高度真实感的三维动画。
反过来,分形理论与方法又极大地丰富了计算机图形学内容,甚至分形的思想会在计算机科学的发展上产生一定的影响。
实验报告学院:微固学院姓名:梁孝亿学号:201422030116分形迭代一、实验目的1.了解分形几何的基本情况;2.了解通过迭代方式产生分形图的方法;3.了解matlab软件中简单的程序结构;4.掌握matlab软件的基本用法;二、问题描述几何学研究的对象是客观世界中物体的形状。
传统欧氏几何学的研究对象,都是规则并且光滑的,比如:直线、曲线、曲面等。
但客观世界中物体的形状,并不完全具有规则光滑等性质,因此只能近似当作欧氏几何的对象,比如:将凹凸不平的地球表面近似为椭球面。
虽然多数情况下通过这样的近似处理后,能够得到符合实际情况的结果,但是对于极不规则的形态,比如:云朵、烟雾、树木等,传统的几何学就无能为力了。
如何描述这些复杂的自然形态?如何分析其内在的机理?这些就是分形几何学所面对和解决的问题。
三、背景知识介绍分形几何的概念是美籍法国数学家曼德尔布罗特(Mandelbrot)于1975年首先提出的,但最早的工作可追朔到1875年,德国数学家维尔斯特拉斯(Weierestrass)构造了处处连续但处处不可微的函数,集合论创始人康托尔(Cantor,德国数学家)构造了有许多奇异性质的康托尔三分集。
1890年,意大利数学家皮亚诺(Peano)构造了填充空间的曲线。
1904年,瑞典数学家科赫(Koch)设计出类似雪花和岛屿边缘的一类曲线。
1915年,波兰数学家谢尔宾斯基(Sierpinski)设计了象地毯和海绵一样的几何图形。
这些都是为解决分析与拓朴学中的问题而提出的反例,但它们正是分形几何思想的源泉。
四、实验内容本试验以迭代的方式,来体验生成分形图形的基本方法,并感受美丽的分形图案,从而对分形几何有一个直观的了解。
绘制Koch曲线、Sierpinski三角形和树木花草图形,观察这些图形的局部和原来分形图形的关系。
五、实验思路利用函数反复调用自己来模拟分形构造时的迭代过程,当迭代指标n为0时运行作图操作,否则继续迭代。
分形维数 matlab分形维数是度量分形特征的重要方法。
它是通过对分形对象进行测量来确定对象的尺寸和形状复杂性的。
在matlab中,可以使用多种方法来计算分形维数。
本文将介绍matlab中计算分形维数的方法,包括盒维数、哈斯特指数和多重分形维数。
一、盒维数法盒维数法是最基本的计算分形维数的方法之一。
它通过测量覆盖分形对象所需的最小正方形数来计算分形维数。
具体计算方法为:1.将分形对象放置在一个正方形网格中。
2.选取一个长度为l的正方形框,将其移动滑动网格,去覆盖分形对象。
3.计算分形对象被框覆盖的次数,这就是盒维数的结果。
在matlab中,可以使用下面的代码计算盒维数:% 定义分形对象x = linspace(-1, 1, 100);y = x.^2;% 计算盒维数D = boxcount(x, y);disp(['盒维数:' num2str(D)]);二、哈斯特指数法1.将信号分解成一系列尺度不同的信号,即小波系数。
2.计算每个尺度下的信号的自相关函数。
% 定义信号load noisysignals.mat;[~, ~, H] = haursd(signal);三、多重分形维数法多重分形维数法是一种区间分析法,它通过对分形对象进行分割,分析分割后各段的分形特征来计算分形维数。
具体计算方法为:1.将分形对象分割为多个区间,求出每个区间的分形特征,如盒维数或哈斯特指数。
2.根据分形特征和区间的尺寸关系,计算每个区间的分形维数。
3.通过对所有区间的分形维数作图,得到分形维数的分布情况。
plot(q, fDq, 'r-');xlabel('q');title('多重分形维数');。
几个分形的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由于中间三分之一部分是一个正方形时,有很多连接的部分。
三、实验程序及注释:p=[o 0:10 0]: 为初始两个点的坐标,第-列为X 坐标,第一列为y 坐标n=2;粒1为结点数A= [cos(pi/3) -sin(pi/3) :sin(pi/3) cos(pi/3)] : %旋转矩阵 for k=l:4d=diff(p)/3;算和邻两个点的坐标之差,得到相邻两点确定的向量%则<1就计算出毎个向量长度的三分之与题中将线段三等分对应 m=4*n-3;$迭代公式q=p(l:n-l,:);弔以原点为起点,前n-l 个点的坐标为终点形成向量p(5:4:m, :)=p(2:n,:);気迭代后处于4k+l 位置上的点的坐标为迭代前的和应坐标 p(2:4:m, :) =q+d: p(3:4:m, :〉=q+d+d*A'; p(4:4:m, :)=q+2*d; plot(p(:, l),p(:>2)) axis([0 10 0 10]) 四、实验数据记录: 由第三部分的程序,可得到如下的Koch 分形曲线:五、注记:1・参照实验方法,可绘制如下生成元的Koch 分形曲线:%用向量方法计算迭代后处于4k+2位置上的点的坐标■^6用向量方法计算迭代后处于低+3位置上的点的坐标 %用向量方法计算迭代后处于4k 位置上的点的坐标 %迭代后新的结点数目 n=m : end%绘出每相邻两个点的连线10■•・ ・・ ・■-------■RJ<7〜9 876 54323455769 10由于中间三分之一部分是一个正方形时,有很多连接的部分。
所以我们将髙度压缩到原来的0.7倍,即中间部分为一个长与宽之比为1:0.7的矩形时,得到程序和曲线如下: P=[o 0:10 0];为初始两个点的坐标,第•列为X 坐标,第一列为y 坐标此时,旋转矩阵为:A If os (亍)-sinQ)sin( ) cos(—)2 2丿程序和曲线如下:p=Eo o :io 0]; n=2;A=EO -1;1 0]; for k=l:4d=diff(p)/3;喙hff 计算和邻两个点的坐标之差,得到相邻两点确定的向量$则<1就计算出毎个向量长度的三分之与题中将线段三等分对应m=5*n-4; $迭代公式q=p(l:n-l, :) ; %以原点为起点,前n-l 个点的坐标为终点形成向量p(6:5:m, :) =p(2:n,:);p(2:5:m, :〉=q+d;p(3:5:m, :〉=q+d+d*A';%P 为初始两个点的坐标,第•列为X 坐标,第一列为y 坐标如为结点数 %旋转矩阵%迭代后处于5k-l 位置上的点的坐标为迭代前的相应坐标%用向量方法计算迭代后处于5k ・2位置上的点的坐标%用向量方法计算迭代后处于5k-3位置上的点的坐标p(4:5:m, :) =q+2*d+d*A';驚用向呈方法计算迭代后处于5k-4位置上的点的坐标 p(5:5:m, :)=q+2*d: n=m : end%用向量方法计算迭代后处于5k 位置上的点的坐标 %迭代后新的结点数目plot(p(:, l),p(:,2)) axis([0 10 0 10])%绘出每相邻两个点的连线n=2;$n 为结点数A=[0 -1;1 0]; 弔旋转矩阵 for k=l:4d=diff(p)/3;算和邻两个点的坐标之差,得到相邻两点确定的向量$则<1就计算出每个向量长度的三分之与题中将线段一等分对应 m=5*n-4; %迭代公式q=p(l:n-U :) ; %以原点为起点,前n-l 个点的坐标为终点形成向量p(6:5:m, :)=p(2:n, :); %迭代后处于5k-l 位置上的点的坐标为迭代前的和应坐标 p(2:5:m. :>=q+d;黑用向量方法计算迭代后处于3k ・2位置上的点的坐标p(3:5:m, :)=q+d+0. 7*d*A* ; %用向量方法计算迭代后处于3k+3位置上的点的坐标p(4:5:m, :)=q+2*d+0. 7*d*A* ;用向量方法计算迭代后处于5k+4位置上的点的坐标p(5:5:m, :〉=q+2*d; n=m : endplot(P(:, l),p(:>2)) axis([0 10 0 10])图52.参照实验方法,我们由四边形的四个初始点出发,对于四边形的每条边,生成元如下:%用向量力法计算迭代后处于5k 位a 上的点的坐标 %迭代后新的结点数目%绘小每相邻两个点的连线可得到火焰般的图形。
几个分形的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从精通到入门>>。