zoukankan      html  css  js  c++  java
  • 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码表是一个难点,有码表后生成分形其实是比较简单的。

  • 相关阅读:
    PMP-合同类型
    一、JavaScript简介
    编写一程序,从键盘输入10个实数,计算并输出算术平均数
    从键盘输入3个整数,输出其中最大数
    穷举法判断键入的数是不是素数
    2.事件每天执行
    1.mysql 启动服务提示输入密码
    二、linux 用户授权
    1.maven打包乱码
    1.下载谷歌插件
  • 原文地址:https://www.cnblogs.com/tiandsp/p/13172236.html
Copyright © 2011-2022 走看看