反応拡散なんとか(要改良)

id:TOKOROTEN の人あたりから紹介された。

D

超カッコイイよね

これは作るしかない。 式も示されているし、差分法なら解ける!!
と思ったのが運の尽き。

とりあえず出来たものの画像


数学が分からん

∇ △ がわからん!(見たら思い出したけどw)

∂ってなんだっけw(おい)

とか色々と格闘をしてプログラムを組む(付録参照)

できたけど…

とりあえず出来た

http://inajob.no-ip.org/dev/gs/gs.html
Javaアプレット注意!

同じパラメータにしても およそ再現する気配が無い。
パラメータが悪いだけなのか、プログラムにバグがあるのか分からん
誰か分かる人デバッグしてよーw

蛇足

http://d.hatena.ne.jp/sakusan_net/20080605/1212629302

id:inajob君のノートPCが最新式になってた、そしてプロジェクタで映している画像がなんか赤いウネウネしたものだった。

id:sakusan_netに夢見られたので 正夢化してみたかったというのもあるw
さすがにノートPCは買ってないけどねw

付録

ソースコードはっつけておきます。
リンク先でも見れるようにしてあるので「デバッグしてください」

もしこれを参考にして何かを作った場合には うちのサイトをリンクしてもらえれば幸いです。

コア部分

これだけだと動きません。リンク先にあるNicoPanelとAppletを参考にコイツを呼び出したり、描画したりしてください。

差分法を用いて、周期的境界を利用しています。

public class Main {
	static final int size=256/4;
	static final double F=0.04;
	static final double k=0.06;
	static final double d_t=0.1;
	static final double d_size=0.1;
	
	double [][] u,v,tmp_u,tmp_v;
	public Main(){
		u=new double[size][size];
		v=new double[size][size];
		tmp_u=new double[size][size];
		tmp_v=new double[size][size];
		
		init();
		
	}
	public void init(){
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				u[i][j]=Math.random();
				v[i][j]=Math.random();
			}
		}
	}
	public double f(double u,double v){
		return u*u*v-(k)*u;
	}
	public double g(double u,double v){
		return -u*u*v+F*(1.0-v);
	}
	/*
	public double laplace(double pre,double now,double post){
		return (pre-2*now+post)/(d_size*d_size);
	}
	*/
	public double laplace2(double[][] map,int x,int y){
		return ((map[post(x)][y]+map[pre(x)][y]+map[x][pre(y)]+map[x][post(y)]+
		                                                             -4*map[x][y]))*(d_size);
	}
	
	public int post(int index){
		int ret=index+1;
		if(ret>=size)ret=0;
		return ret;
	}
	public int pre(int index){
		int ret=index-1;
		if(ret<0)ret=size-1;
		return ret;
	}
	public double next_u(int x,int y){
		return d_t*(f(u[x][y],v[x][y])+laplace2(u,x,y))+u[x][y];
	}
	public double next_v(int x,int y){
		return d_t*(g(u[x][y],v[x][y])+laplace2(v,x,y))+v[x][y];
	}
	
	public void toTmp(){
		int x,y;
		for(x=0;x<size;x++){
			for (y=0;y<size;y++){
				tmp_u[x][y]=u[x][y];
				tmp_v[x][y]=v[x][y];
			}
		}
	}
	public void fromTmp(){
		int x,y;
		for(x=0;x<size;x++){
			for (y=0;y<size;y++){
				u[x][y]=tmp_u[x][y];
				v[x][y]=tmp_v[x][y];
			}
		}
	}
	public void proc(){
		int x,y;
		for(x=0;x<size;x++){
			for (y=0;y<size;y++){
				tmp_u[x][y]=next_u(x,y);
				tmp_v[x][y]=next_v(x,y);
			}
		}
		fromTmp();
	}
	
	public static void main(String[] args){
		Main m=new Main();
	}
}