2018年3月26日月曜日

ベロウソフ・ジャボチンスキー反応のモデルで遊びたかった

 ※注意
  この記事には強い点滅を伴うgifが貼ってあります。




 毎度ながら「遊ぶ」まで至らずに終わりました。ただしつい先日学んだ関数内関数を使えたというだけで個人的には満足なのです。
 なお関数内関数を使う必要があったかどうかについては考えてはいけない。
 これを参考にした。
---------------------------------------------------------------------------------
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def defs(k1, k2, g, n, nei):
    def BZreaction(plate):
        padded=zeropad(plate)
        output=np.zeros(padded.shape)
        i=nei
        while i<padded.shape[0]-nei:
            j=nei
            while j<padded.shape[0]-nei:
                if padded[i, j]==0:
                    b=np.sum(padded[i-nei:i+nei+1, j-nei:j+nei+1]>=n)
                    a=np.sum(padded[i-nei:i+nei+1, j-nei:j+nei+1]>0)-b
                    output[i, j]=a/k1+b/k2
                elif padded[i, j]>=n:
                    output[i, j]=0
                else:
                    s=np.sum(padded[i-nei:i+nei+1, j-nei:j+nei+1])
                    b=np.sum(padded[i-nei:i+nei+1, j-nei:j+nei+1]>=n)
                    a=np.sum(padded[i-nei:i+nei+1, j-nei:j+nei+1]>0)-b
                    output[i, j]=s/a+b+1+g
                j+=1
            i+=1
       
        return output[nei:-1*nei, nei:-1*nei]

    def zeropad(plate):
        padded=np.zeros((plate.shape[0]+2*nei, plate.shape[0]+2*nei))
        padded[nei:plate.shape[0]+nei, nei:plate.shape[1]+nei]=plate
        return padded
   
    return BZreaction, zeropad

#setting
g=10
k1=2
k2=1
n=20
l=50
plate=np.random.rand(l*l).reshape(l, l)*n
nei=1

BZreaction, zeropad=defs(k1, k2, g, n, nei)

fig=plt.figure()

ims=[]
for a in range(500):
 plate=BZreaction(plate)
 im=plt.imshow(plate, animated=True)
 ims.append([im])

ani=animation.ArtistAnimation(fig, ims, interval=50, blit=True, repeat_delay=1000)
ani.save('sample.gif', writer='imagemagick')
---------------------------------------------------------------------------------



 いい感じの波模様が出てきてくれたのはいいんだけど、合っているかはわからんね。
 3つのパラメータ(g、k1、k2)を色々と動かしてみたんだが、どうにもどれを動かすとどうなるのかさっぱり掴めなかった。

g=10, k1=5, k2=5



たまたま2つ近いところで回りだしたから維持できてるって感じ。実際同じパラメータで何回かやっても消えちゃうことが多い。

g=10, k1=1, k2=1


kが小さいからstate=0からすぐに離れるし、gも大きいからすぐに上限達している感じ。

g=5, k1=5, k2=5


クソ眩しい。

g=1, k1=1, k2=1

眩しいけどgが小さいので絵面がやわらかい印象

g=10, k1=10, k2=10



多くのセルが上限を一斉に超えるがために、みんな揃ってstate=0になってしまった感じ。


g=10, k1=5, k2=5



泡が割れるときに一瞬膜が見えるみたいなやつに似てる。いっぱい試した中で一番好き。



 初っ端で波紋が出てきたのが奇跡かってくらい波紋が出てきてくれないので悲しい。
 空き時間でちょこちょこいじって、最終的には渦巻きを作ってThe 9thを聞くのが目標。

 ところで文字サイズがそろわないのは何故なのか。

0 件のコメント:

コメントを投稿