2018年3月27日火曜日

渦巻き

 昨日のBZ反応のモデルを、もう少し大きい領域で実行した。(200*200)



 中央下部が渦を巻いているように見える。



 静止画だといまいち。渦の線を延々と追えたりすると「渦巻きだ!」となれるんだが、どうも格子の上でやっても渦巻きらしい渦巻きはつくれないような気もしてきた。釈然としない。ただし昨日は円形に線を辿れたので、それに比べれば渦に近いような気がする。
 何度も実行してみたが、似たような「渦巻いてそうな何か」は何度か見られた。

これは中央上部が渦巻きっぽい?

 なぜ領域を大きくしたら見え始めたのかがわからない。実は小さい領域でやってた時も発生していたが、拡大すぎるため渦巻きだと認識できなかった可能性がある。他の波紋までの距離が近いので渦っぽく見えないということもありそう。あとは一度に発生する波紋が多いので、単純に遭遇率が上昇しただけというのもありえる。
 おまけ。2個目のgifのこの辺が...(はぁと)



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を聞くのが目標。

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