In [1]:
import sys
import numpy as np
import math
import random
import matplotlib.pyplot as plt
def kernel1():
kernel = []
vec1 = [0.05, 0.2, 0.05]
vec2 = [0.20,-1.0, 0.20]
vec3 = [0.05, 0.2, 0.05]
kernel.append(vec1)
kernel.append(vec2)
kernel.append(vec3)
return kernel
kernel = kernel1()
print("kernel", kernel)
kernel [[0.05, 0.2, 0.05], [0.2, -1.0, 0.2], [0.05, 0.2, 0.05]]
In [2]:
def laplace(x, y, L, M, kernel):
laplace = 0
for i in range(3):
for j in range(3):
a = x + i - 1
b = y + j - 1
if (a >= 0 and b >= 0 and a < L and b < L):
val = M[a][b] * kernel[i][j]
laplace += val
return laplace
def init_grid(val, x0, x1, y0, y1, M):
for x in range(x0,x1,1):
for y in range(y0,y1,1):
M[x][y] = val
def init_grid_random(val, x0, x1, y0, y1, M):
for x in range(x0,x1,1):
for y in range(y0,y1,1):
M[x][y] = val*random.uniform(0, 1)
def copyM(L, M):
Copy = np.zeros((L,L))
for x in range(L):
for y in range(L):
Copy[x][y] = M[x][y]
return Copy
In [3]:
def brusselator(L, T, Da, Db, ka, kb, kernel, A, B):
inc_t = 0.05
inc_x = 0.5
#pattern formation conditions
if kb >= 1 + ka*ka:
print("kb < 1+ka^2 failed", kb, 1+ka*ka)
sys.exit()
if kb <= (1 + ka*np.sqrt(Da/Db))*(1 + ka*np.sqrt(Da/Db)):
print("kb > (1 + ka*sqrt(DA/DB)^2 failed", kb, (1 + ka*np.sqrt(Da/Db))*(1 + ka*np.sqrt(Da/Db)))
sys.exit()
t = 0
n = 0
while(t < T):
thisA = copyM(L, A)
thisB = copyM(L, B)
for x in range(L):
for y in range(L):
Aval = thisA[x][y]
Bval = thisB[x][y]
# the reaction term
addA = ka - (1+kb)*Aval + Aval*Aval*Bval
addB = kb*Aval - Aval*Aval*Bval
# the diffusion term
addA += inc_x*DA*laplace(x, y, L, thisA, kernel)
addB += inc_x*DB*laplace(x, y, L, thisB, kernel)
if Aval+addA*inc_t < 0:
break
if Bval+addB*inc_t < 0:
break
A[x][y] += addA*inc_t
B[x][y] += addB*inc_t
if n % 50 == 0:
print("time", t)
plt.matshow(A)
plt.colorbar()
plt.show()
t += inc_t
n += 1
T = 500
L = 100
# My setup
DA = 5
DB = 12
ka = 3
kb = 9.9
A = np.zeros((L,L))
B = np.zeros((L,L))
init_grid_random(ka, 0, L-1, 0, L-1, A)
brusselator(L, T, DA, DB, ka, kb, kernel, A, B)
time 0
time 2.499999999999999
time 4.99999999999999
time 7.499999999999981
time 10.000000000000007
time 12.500000000000043
time 15.000000000000078
time 17.500000000000114
time 20.00000000000015
time 22.500000000000185
time 25.00000000000022
time 27.500000000000256
time 30.00000000000029
time 32.50000000000029
time 35.00000000000015
time 37.50000000000001
time 39.999999999999865
time 42.49999999999972
time 44.99999999999958
time 47.49999999999944
time 49.9999999999993
time 52.499999999999154
time 54.99999999999901
time 57.49999999999887
time 59.99999999999873
time 62.499999999998586
time 64.99999999999845
time 67.49999999999831
time 69.99999999999817
time 72.49999999999802
time 74.99999999999788
time 77.49999999999774
time 79.9999999999976
time 82.49999999999746
time 84.99999999999731
time 87.49999999999717
time 89.99999999999703
time 92.49999999999689
time 94.99999999999675
time 97.4999999999966
time 99.99999999999646
time 102.49999999999632
time 104.99999999999618
time 107.49999999999604
time 109.9999999999959
time 112.49999999999575
time 114.99999999999561
time 117.49999999999547
time 119.99999999999532
time 122.49999999999518
time 124.99999999999504
time 127.4999999999949
time 129.9999999999953
time 132.49999999999588
time 134.99999999999645
time 137.49999999999702
time 139.99999999999758
time 142.49999999999815
time 144.99999999999872
time 147.4999999999993
time 149.99999999999986
time 152.50000000000043
time 155.000000000001
time 157.50000000000156
time 160.00000000000213
time 162.5000000000027
time 165.00000000000327
time 167.50000000000384
time 170.0000000000044
time 172.50000000000497
time 175.00000000000554
time 177.5000000000061
time 180.00000000000668
time 182.50000000000725
time 185.00000000000782
time 187.50000000000838
time 190.00000000000895
time 192.50000000000952
time 195.0000000000101
time 197.50000000001066
time 200.00000000001123
time 202.5000000000118
time 205.00000000001236
time 207.50000000001293
time 210.0000000000135
time 212.50000000001407
time 215.00000000001464
time 217.5000000000152
time 220.00000000001577
time 222.50000000001634
time 225.0000000000169
time 227.50000000001748
time 230.00000000001805
time 232.50000000001862
time 235.00000000001918
time 237.50000000001975
time 240.00000000002032
time 242.5000000000209
time 245.00000000002146
time 247.50000000002203
time 250.0000000000226
time 252.50000000002316
time 255.00000000002373
time 257.5000000000243
time 260.00000000002484
time 262.5000000000254
time 265.000000000026
time 267.50000000002655
time 270.0000000000271
time 272.5000000000277
time 275.00000000002825
time 277.5000000000288
time 280.0000000000294
time 282.50000000002996
time 285.0000000000305
time 287.5000000000311
time 290.00000000003166
time 292.50000000003223
time 295.0000000000328
time 297.50000000003337
time 300.00000000003394
time 302.5000000000345
time 305.0000000000351
time 307.50000000003564
time 310.0000000000362
time 312.5000000000368
time 315.00000000003735
time 317.5000000000379
time 320.0000000000385
time 322.50000000003905
time 325.0000000000396
time 327.5000000000402
time 330.00000000004076
time 332.5000000000413
time 335.0000000000419
time 337.50000000004246
time 340.00000000004303
time 342.5000000000436
time 345.00000000004417
time 347.50000000004474
time 350.0000000000453
time 352.5000000000459
time 355.00000000004644
time 357.500000000047
time 360.0000000000476
time 362.50000000004815
time 365.0000000000487
time 367.5000000000493
time 370.00000000004985
time 372.5000000000504
time 375.000000000051
time 377.50000000005156
time 380.0000000000521
time 382.5000000000527
time 385.00000000005326
time 387.50000000005383
time 390.0000000000544
time 392.50000000005497
time 395.00000000005554
time 397.5000000000561
time 400.0000000000567
time 402.50000000005724
time 405.0000000000578
time 407.5000000000584
time 410.00000000005895
time 412.5000000000595
time 415.0000000000601
time 417.50000000006065
time 420.0000000000612
time 422.5000000000618
time 425.00000000006236
time 427.5000000000629
time 430.0000000000635
time 432.50000000006406
time 435.00000000006463
time 437.5000000000652
time 440.00000000006577
time 442.50000000006634
time 445.0000000000669
time 447.5000000000675
time 450.00000000006804
time 452.5000000000686
time 455.0000000000692
time 457.50000000006975
time 460.0000000000703
time 462.5000000000709
time 465.00000000007145
time 467.500000000072
time 470.0000000000726
time 472.50000000007316
time 475.0000000000737
time 477.5000000000743
time 480.00000000007486
time 482.50000000007543
time 485.000000000076
time 487.50000000007657
time 490.00000000007714
time 492.5000000000777
time 495.0000000000783
time 497.50000000007884
In [4]:
DA = 2.8
DB = 22.4
ka = 1.5
kb = 2.4
A = np.zeros((L,L))
B = np.zeros((L,L))
init_grid(1, 48, 52, 48, 52, A)
brusselator(L, T, DA, DB, ka, kb, kernel, A, B)
time 0
time 2.499999999999999
time 4.99999999999999
time 7.499999999999981
time 10.000000000000007
time 12.500000000000043
time 15.000000000000078
time 17.500000000000114
time 20.00000000000015
time 22.500000000000185
time 25.00000000000022
time 27.500000000000256
time 30.00000000000029
time 32.50000000000029
time 35.00000000000015
time 37.50000000000001
time 39.999999999999865
time 42.49999999999972
time 44.99999999999958
time 47.49999999999944
time 49.9999999999993
time 52.499999999999154
time 54.99999999999901
time 57.49999999999887
time 59.99999999999873
time 62.499999999998586
time 64.99999999999845
time 67.49999999999831
time 69.99999999999817
time 72.49999999999802
time 74.99999999999788
time 77.49999999999774
time 79.9999999999976
time 82.49999999999746
time 84.99999999999731
time 87.49999999999717
time 89.99999999999703
time 92.49999999999689
time 94.99999999999675
time 97.4999999999966
time 99.99999999999646
time 102.49999999999632
time 104.99999999999618
time 107.49999999999604
time 109.9999999999959
time 112.49999999999575
time 114.99999999999561
time 117.49999999999547
time 119.99999999999532
time 122.49999999999518
time 124.99999999999504
time 127.4999999999949
time 129.9999999999953
time 132.49999999999588
time 134.99999999999645
time 137.49999999999702
time 139.99999999999758
time 142.49999999999815
time 144.99999999999872
time 147.4999999999993
time 149.99999999999986
time 152.50000000000043
time 155.000000000001
time 157.50000000000156
time 160.00000000000213
time 162.5000000000027
time 165.00000000000327
time 167.50000000000384
time 170.0000000000044
time 172.50000000000497
time 175.00000000000554
time 177.5000000000061
time 180.00000000000668
time 182.50000000000725
time 185.00000000000782
time 187.50000000000838
time 190.00000000000895
time 192.50000000000952
time 195.0000000000101
time 197.50000000001066
time 200.00000000001123
time 202.5000000000118
time 205.00000000001236
time 207.50000000001293
time 210.0000000000135
time 212.50000000001407
time 215.00000000001464
time 217.5000000000152
time 220.00000000001577
time 222.50000000001634
time 225.0000000000169
time 227.50000000001748
time 230.00000000001805
time 232.50000000001862
time 235.00000000001918
time 237.50000000001975
time 240.00000000002032
time 242.5000000000209
time 245.00000000002146
time 247.50000000002203
time 250.0000000000226
time 252.50000000002316
time 255.00000000002373
time 257.5000000000243
time 260.00000000002484
time 262.5000000000254
time 265.000000000026
time 267.50000000002655
time 270.0000000000271
time 272.5000000000277
time 275.00000000002825
time 277.5000000000288
time 280.0000000000294
time 282.50000000002996
time 285.0000000000305
time 287.5000000000311
time 290.00000000003166
time 292.50000000003223
time 295.0000000000328
time 297.50000000003337
time 300.00000000003394
time 302.5000000000345
time 305.0000000000351
time 307.50000000003564
time 310.0000000000362
time 312.5000000000368
time 315.00000000003735
time 317.5000000000379
time 320.0000000000385
time 322.50000000003905
time 325.0000000000396
time 327.5000000000402
time 330.00000000004076
time 332.5000000000413
time 335.0000000000419
time 337.50000000004246
time 340.00000000004303
time 342.5000000000436
time 345.00000000004417
time 347.50000000004474
time 350.0000000000453
time 352.5000000000459
time 355.00000000004644
time 357.500000000047
time 360.0000000000476
time 362.50000000004815
time 365.0000000000487
time 367.5000000000493
time 370.00000000004985
time 372.5000000000504
time 375.000000000051
time 377.50000000005156
time 380.0000000000521
time 382.5000000000527
time 385.00000000005326
time 387.50000000005383
time 390.0000000000544
time 392.50000000005497
time 395.00000000005554
time 397.5000000000561
time 400.0000000000567
time 402.50000000005724
time 405.0000000000578
time 407.5000000000584
time 410.00000000005895
time 412.5000000000595
time 415.0000000000601
time 417.50000000006065
time 420.0000000000612
time 422.5000000000618
time 425.00000000006236
time 427.5000000000629
time 430.0000000000635
time 432.50000000006406
time 435.00000000006463
time 437.5000000000652
time 440.00000000006577
time 442.50000000006634
time 445.0000000000669
time 447.5000000000675
time 450.00000000006804
time 452.5000000000686
time 455.0000000000692
time 457.50000000006975
time 460.0000000000703
time 462.5000000000709
time 465.00000000007145
time 467.500000000072
time 470.0000000000726
time 472.50000000007316
time 475.0000000000737
time 477.5000000000743
time 480.00000000007486
time 482.50000000007543
time 485.000000000076
time 487.50000000007657
time 490.00000000007714
time 492.5000000000777
time 495.0000000000783
time 497.50000000007884
In [ ]: