用Processing模拟布朗运动

布朗运动

介绍

布朗运动(英语:Brownian motion)是微小粒子或者颗粒在流体中做的无规则运动。布朗运动过程是一种正态分布的独立增量连续随机过程。它是随机分析中基本概念之一。其基本性质为:布朗运动W(t)是期望为0、方差为t(时间)的正态随机变量。对于任意的 r r r小于等于 s s s W ( t ) − W ( s ) W(t)-W(s) W(t)W(s)独立于的 W ( r ) W(r) W(r),且是期望为 0 0 0、方差为 t − s t-s ts的正态随机变量。

模拟布朗运动的重点就在于W(t)是期望为0、方差为t(时间)的正态随机变量

在一维的形式下,就是说只要时间足够长,它累计向左,向右的距离是相同的,二维,三维形式下也是如此。

思路

实际上,processing自带的函数 r a n d o m random random就可以实现这种操作,多次调用 r a n d o m ( − r a n g e , r a n g e ) random(-range,range) random(range,range)产生的数,就满足平均数接近 0 0 0,产生的数之和满足正态分布

即,令 s u m ( x ) sum(x) sum(x)为产生的 x x x个随机数之和,那么 s u m ( x ) sum(x) sum(x)~ N N N

这也就为什么不能用 n o i s e noise noise函数,因为 n o i s e noise noise产生的数本身就符合正态分布,它们之和不一定符合正态分布。

流程

在这里插入图片描述

代码

int num = 2000;
int range = 12;

float[] ax = new float[num];
float[] ay = new float[num]; 

void setup() 
{
    size(1920, 1080);
    for(int i = 0; i < num; i++) {
        ax[i] = width/2;
        ay[i] = height/2;
    }
    frameRate(30);
}

void oneStep()
{
    background(51);
    println("frameCount: "+frameCount);
    //Shift all elements 1 place to the left
    for(int i = 1; i < num; i++) {
        ax[i-1] = ax[i];
        ay[i-1] = ay[i];
    }

    // Put a new value at the end of the array
    ax[num-1] += random(-range, range);
    ay[num-1] += random(-range, range);

    // Constrain all points to the screen
    ax[num-1] = constrain(ax[num-1], 0, width);
    ay[num-1] = constrain(ay[num-1], 0, height);
  
  // Draw a line connecting the points
    for(int i=1; i<num; i++) {    
        float val = float(i)/num * 204.0 + 51;
        stroke(val);
        line(ax[i-1], ay[i-1], ax[i], ay[i]);
    }
}

void draw() 
{
    oneStep();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值