matlab練習程序(IFS分形)


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碼表是一個難點,有碼表后生成分形其實是比較簡單的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM