论文中描述的模型,该纸张模拟了2D中Fitzhugh-Nagumo模型的Alan Turing提出的方程式,作为形成动物皮肤模式的模型 - 换句话说:换句话说:模拟两种物质在表面上扩散,它们如何相互作用以及出现的模式。这是论文的结果:

问题描述 投票:0回答:1
我已经在处理/java中实现了它(至少对

的解释),但是它不能像它那样起作用(价值观有所不同,第一次迭代时even),所以我想知道什么问题在我的实施中(包含在帖子的结尾)。 这些是本文有关实施的3个相关部分:

1。 u&v

有两个物质,u和v(可以分别将其视为激活剂和抑制剂) enter image description here

2。有限差方程 u


v

的每个值(像素)定义了相当简单的像素卷积。使用IT及其邻居的电流 - 材料值同时计算下一代中给定像素的值。

给定像素(I,J)在n+1迭代中的值

u

的值定义为:

enter image description here

给定像素(i,j)在n+1迭代中的值

v

的值定义为:

3。他们使用的常数

enter image description here 因此,我遇到的问题是,

u

v的值很快就与无穷大/nan分歧(我希望它们应该在0 ... 1之内,尽管该论文没有明确提及这一点)。 venter image description here似乎首先差异,并随之而来,如这里所示(对于某些恒定索引):

0.94296926 0.77225316 // u, v after random initialisation 0.91600573 -62633.082 // values after first iteration -- v has already diverged massively 63.525314 5.19890688E8 // second iteration -- even more divergence -520088.38 -2.98866172E14 // ...and so on... 1.40978577E14 1.2764294E19 -Infinity -1.7436987E24 NaN NaN NaN NaN

代码

//Parallel Simulation of Pattern formation in a reactiondiffusion system of Fitzhugh-Nagumo Using GPU CUDA // Alfredo Gormantara and Pranowo1 static final float a = 2.8e-4; static final float b = 5.0e-3; static final float k = -0.005; static final float tau = 0.1; static final float delta_t = 1e-3; float[][] u; // activator float[][] v; // inhibitor void setup() { size(512, 512); frameRate(5); u = new float[height][width]; v = new float[height][width]; for (int i = 0; i < u.length; i++) { for (int j = 0; j < u[0].length; j++) { u[i][j] = random(1); // random of max of 1 ? v[i][j] = random(1); // random of max 1? } } loadPixels(); } void draw() { float[][] u_n_1 = new float[height][width]; // array holding the n+1 iteration values of u float[][] v_n_1 = new float[height][width]; // array holding the n+1 iteration values of v float denom = 2f / width; // 2/MESH_SIZE -- I think mesh_size is dimension of the grid denom*=denom; // square for denominator println(u[34][45], v[34][45]); // print vals of one location to see divergence for (int y = 0; y < height; y++) { int negative_y_i = y-1 < 0 ? height-1 : y-1; // wrap around grid for (int x = 0; x < width; x++) { final float u_n = u[y][x]; final float v_n = v[y][x]; int negative_x_i = x-1 < 0 ? width-1 : x-1; // wrap around grid // calculate laplace (12) float u_n_1_laplace = u[y][(x+1) % (width)] + u[y][negative_x_i] + u[(y+1) % (height)][x] + u[negative_y_i][x]; //n+1th iteration u_n_1_laplace -= (4 * u_n); u_n_1_laplace /= denom; // divide by (2/DIM)^2 u_n_1_laplace *= a; // calculate n+1th iteration u value u_n_1[y][x] = u_n + delta_t*( u_n_1_laplace + u_n -(u_n*u_n*u_n) - v_n + k ); // calculate laplace (14) float v_n_1_laplace = v[y][(x+1)% (width)] + v[y][negative_x_i] + v[(y+1)% (height)][x] + v[negative_y_i][x]; //n+1th iteration v_n_1_laplace -= (4 * u_n); v_n_1_laplace /= denom; // denom is really small, so value goes huge v_n_1_laplace *=b; v_n_1[y][x] = v_n + (tau/delta_t)*( v_n_1_laplace + u_n - v_n); pixels[y*width + x] = color((int) ((u_n_1[y][x]-v_n_1[y][x])*255)); } } u = u_n_1.clone(); // copy over new iteration values v = v_n_1.clone(); // copy over new iteration values updatePixels(); } enter image description here 我已经能够修复它。

有3个问题:

论文(14)给出的V的Laplacian的方程式有一个术语,但我现在认为这是错别字,应该是-4uI必须降低时间步长(-4v)的值,使其比纸张给出的小(至少使用512x512网格 - 较小的网格不需要小的delta_t值),否则,值很快就向南差异。

像素颜色映射:
1e-3
的范围为-1 ... 1,而不是0 ... 1,如前所述。

delta_t
    
java algorithm processing convolution laplacian
1个回答
0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.