首页 > 其他 > 详细

matlab练习程序(IFS分形)

时间:2020-06-21 14:34:11      阅读:133      评论:0      收藏:0      [点我收藏+]

IFS为迭代函数系统,是一种构造分形的方法。

方法的核心是以概率p的方式对初始点进行仿射平移变换。

变换公式为:

x(k+1)=a*x(k) + b*y(k) + e
y(k+1)=c*x(k) + d*y(k) + f

关键是确定IFS码表,只要码表确定了,后面的编程套路基本一样。

下面列两个常见的码表及分形效果。

Sierpinski垫IFS码表:

w a b c d e f p
1 0.5 0 0 0.5 0 0 0.333
2 0.5 0 0 0.5 0.25 0.433 0.333
3 0.5 0 0 0.5 0.5 0 0.333

matlab代码如下:

clear all;
close all;
clc;

n=500000;
x=zeros(n,1);
y=zeros(n,1);
for k=2:n
    p=rand(1);
    if p < 0.33
        x(k)=0.5*x(k-1)+0*y(k-1);
        y(k)=0*x(k-1)+0.5*y(k-1);
    elseif p< 0.66
        x(k)=0.5*x(k-1)+0*y(k-1)+0.25;
        y(k)=0*x(k-1)+0.5*y(k-1)+0.433;
    else
        x(k)=0.5*x(k-1)+0*y(k-1)+0.5;
        y(k)=0*x(k-1)+0.5*y(k-1);
    end
end

plot(x,y,.)

效果:

技术分享图片

Barnsley羊齿叶IFS码表:

w a b c d e f p
1 0 0 0 0.16 0 0 0.01
2 0.85 0.04 -0.04 0.85 0 1.6 0.85
3 0.2 -0.26 0.23 0.22 0 1.6 0.07
4 -0.15 0.28 0.26 0.24 0 0.44 0.07

matlab代码如下:

clear all;
close all;
clc;

n=100000;
x=zeros(n,1);
y=zeros(n,1);
for k=2:n
    p=rand(1);
    if p < 0.01
        y(k)=0.16*y(k-1);
    elseif p < 0.86
        x(k)=0.85*x(k-1)+0.04*y(k-1);
        y(k)=-0.04*x(k-1)+0.85*y(k-1)+1.6;
    elseif p < 0.93
        x(k)=0.2*x(k-1)-0.26*y(k-1);
        y(k)=0.23*x(k-1)+0.22*y(k-1)+1.6;
    else
        x(k)=-0.15*x(k-1)+0.28*y(k-1);
        y(k)=0.26*x(k-1)+0.24*y(k-1)+0.44;        
    end
end

plot(x,y,.);

效果:

技术分享图片

如何构造IFS码表是一个难点,有码表后生成分形其实是比较简单的。

matlab练习程序(IFS分形)

原文:https://www.cnblogs.com/tiandsp/p/13172236.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!