Prompt Detail:
以下のコードについて、より短く端的に描ける部分があれば、その箇所を何に置き換えればよいか教えて
#粘菌の動きは3つの要素で決まる → ①粘菌自身が持つ性質②環境(壁から)の刺激③粘菌同士の相互作用
#境界に近づいた粘菌は濃度が高い方向に壁に沿って進む。
#dx/dt = ▽u
import matplotlib.pyplot as plt
import numpy as np
import math
import copy
from matplotlib import animation
import random
import seaborn as sns
Bio = 2
#個体数
N = 50
#座標の分割数
M = 500
#時間の分割数
k = 1
#モデルの係数
L = math.pi
#境界
dx = L/(N-1)
h = (dx*dx)/6
#時間の刻み幅
deltaMax =15000
#delta関数の近似
cl = ["r", "g", "b", "c", "m", "y", "k", "w"]
D_M = 1
e = dx
#行列の初期設定
nu = np.zeros((N,N))
u = np.zeros((N,N))
x = np.zeros((Bio,2))
nx = np.zeros((Bio,2))
U = []
X = []
nud = []
for i in range(Bio):
nud.append(nu)
#関数の定義
def diffx(u,N,dx):
UX = np.zeros((N,N))
for i in range(N):
for j in range(1,N-1):
if S[i][j] ==1:
UX[i][j] = 0
elif S[i][j+1] == 1:
UX[i][j] == (u[i][j] - u[i][j-1])/dx
elif S[i][j-1] == 1:
UX[i][j] == (u[i][j+1] - u[i][j])/dx
else:
UX[i][j] = (u[i][j+1] - u[i][j-1])/(2*dx)
for i in range(N):
UX[i][0] = 0
for i in range(N):
UX[i][N-1] = 0
return UX
def diffy(u,N,dx):
UY = np.zeros((N,N))
for i in range(N):
for j in range(1,N-1):
if S[i][j] ==1:
UY[i][j] = 0
elif S[i+1][j] == 1:
UY[i][j] == (u[i][j] - u[i-1][j])/dx
elif S[i-1][j] == 1:
UY[i][j] == (u[i+1][j] - u[i][j])/dx
else:
UY[i][j] = (u[i+1][j] - u[i-1][j])/(2*dx)
for i in range(N):
UY[0][i] = 0
for i in range(N):
UY[N-1][i] =0
return UY
# xの位置を調べる
def finpx(x,y,dx):
px = int(x/dx)
py = int(y/dx)
return [px,py]
# bilinear interpretion
def bilinear(x,y,U,dx):
[px,py] = finpx(x,y,dx)
if px == x and py == y:
return U[py][px]
else:
t = x - px*dx
s = y - py*dx
uxy = (dx - t)*(dx - s)*U[py][px] + t*(dx - s)*U[py][px+1] + (dx - t)*s*U[py+1][px] + t*s*U[px+1][py+1]
return uxy
def delta(a,b,x):
d = math.sqrt((x[0] - b*dx)**2 + (x[1] - a*dx)**2)
if x[0]/dx -2 <= a <= x[0]/dx +2 and x[1]/dx -2 <= b <= x[1]/dx +2:
f = deltaMax*math.exp(-d**10)
else:
f = deltaMax*math.exp(-d)
return f
#距離関数を定義
def d(S,x,y,dx):
px,py = finpx(x,y,dx)
t = x - px*dx
s = y - py*dx
d_dx = [0,0]
dsm = math.exp(10)
#壁からdx以内にない場合のことは考えない。
for p,q in [[0,0],[1,0],[0,1],[1,1]]:
if S[py+q][px+p] == 1:
ds = math.sqrt((p*dx+t*(-1)**p)**2+(q*dx+s*(-1)**q)**2)
if ds < dsm:
dsm = ds
d_dx = [x - (px+p)*dx,y - (py+q)*dx]
return d_dx,dsm
np.set_printoptions(threshold=np.inf)
for i in range(2):
x[0][i] = 5*dx
x[1][i] = 45*dx
ud = []
ord = []
l=[]
for bio in range(Bio):
l = list(range(Bio))
l.remove(bio)
ord.append(l)
for bio in range(Bio):
u_bio = np.zeros((N,N))
for bio1 in ord[bio] :
for i in range(N):
for j in range(N):
u_bio[i][j] += delta(i,j,x[bio1])
u1 = copy.copy(u_bio)
ud.append(u1)
S = np.zeros((N,N))
#壁を記憶する行列の箱を用意
#任意の壁を設定
for i in range(int(N/5),int(4*N/5)):
for j in range(0,int(2*N/5)):
S[i][j] = 1
for i in range(int(N/5),int(4*N/5)):
for j in range(int(3*N/5),N):
S[i][j] = 1
for i in range(N):
S[i][N-1] = 1
S[N-1][i] = 1
S[0][i] = 1
S[i][0] = 1
plt.imshow(S)
#関数の定義↑
fig, ax = plt.subplots(figsize=(10, 10))
np.set_printoptions(threshold=np.inf)
#for o in range(O):
#u = invbilinear(x[o][0],x[o][1],u,dx)
for m in range(M):
cud = copy.copy(ud[1])
U.append(cud)
x = copy.copy(x)
X.append(x)
if m > D_M:
for bio in range(Bio):
Ux = diffx(ud[bio],N,dx)
Uy = diffy(ud[bio],N,dx)
ux = bilinear(x[bio][0],x[bio][1],Ux,dx)#①:粘菌の移動速度は、局所的な流れ場NO勾配に依存する
uy = bilinear(x[bio][0],x[bio][1],Uy,dx)#①:粘菌の移動速度は、局所的な流れ場NO勾配に依存する
myu = random.randint(0,1)
#粘菌が近づいていく
#nx[bio][0] = x[bio][0] + h*ux
#nx[bio][1] = x[bio][1] + h*uy
#粘菌が離れていく
#nx[bio][0] = x[bio][0] + myu*h*ux
#nx[bio][1] = x[bio][1] + myu*h*uy
#壁を考える
if bio == 1:
d_dx,dsm = d(S,x[bio][0],x[bio][1],dx)#③:粘菌の移動は、壁にぶつかった時、その反発力によって進路が変わる
nx[bio][0] = x[bio][0] + myu*h*ux + ((d_dx[0]*(dx/2)))/(h**2 + dsm)#③:粘菌の移動は、壁にぶつかった時、その反発力によって進路が変わる
nx[bio][1] = x[bio][1] + myu*h*uy + ((d_dx[1]*(dx/2)))/(h**2 + dsm)#③:粘菌の移動は、壁にぶつかった時、その反発力によって進路が変わる
else:
nx = copy.deepcopy(x)
for bio in range(Bio):
if m==D_M:
plt.scatter([x[bio][0]/dx],[x[bio][1]/dx],color = cl[bio],s = 150)
if m >D_M:
plt.plot([x[bio][0]/dx,nx[bio][0]/dx],[x[bio][1]/dx,nx[bio][1]/dx],color = cl[bio])
for bio in range(Bio):
if m >D_M:
plt.scatter([nx[bio][0]/dx],[nx[bio][1]/dx],color = cl[bio])
for bio in range(Bio):
for i in range(1,N-1):
for j in range(1,N-1):
sumd = 0#②:粘菌同士の相互作用は、隣接する粘菌が放出する化学物質の影響を受ける。
for bio1 in ord[bio]:#②:粘菌同士の相互作用は、隣接する粘菌が放出する化学物質の影響を受ける。
sumd += delta(i,j,x[bio1])#②:粘菌同士の相互作用は、隣接する粘菌が放出する化学物質の影響を受ける。
if S[i][j] ==1:
nud[bio][i][j] = 0
elif S[i+1][j+1]:
nud[bio][i][j] = ud[bio][i][j]
elif S[i+1][j-1]:
nud[bio][i][j] = ud[bio][i][j]
elif S[i-1][j+1]:
nud[bio][i][j] = ud[bio][i][j]
elif S[i-1][j-1]:
nud[bio][i][j] = ud[bio][i][j]
elif S[i][j+1] == 1:
nud[bio][i][j] = ud[bio][i][j]
elif S[i][j-1] == 1:
nud[bio][i][j] = ud[bio][i][j]
elif S[i+1][j] == 1:
nud[bio][i][j] = ud[bio][i][j]
elif S[i-1][j] == 1:
nud[bio][i][j] = ud[bio][i][j]
else:
nud[bio][i][j] = h*((ud[bio][i+1][j]-2*ud[bio][i][j]+ud[bio][i-1][j])/(dx*dx) + (ud[bio][i][j+1]-2*ud[bio][i][j]+ud[bio][i][j-1])/(dx*dx) + sumd -k*ud[bio][i][j]) + ud[bio][i][j]
for i in range(N):
nud[bio][i][0] = 0
nud[bio][i][N-1] = 0
nud[bio][0][i] = 0
nud[bio][N-1][i] = 0
d_bio = math.sqrt((nx[0][0]-nx[1][0])**2+ (nx[1][0]-nx[1][1])**2)
if d_bio < e:
break
for bio in range(Bio):
for i in range(2):
x[bio][i] = nx[bio][i]
for bio in range(Bio):
for i in range(N):
for j in range(N):
ud[bio][i][j] = nud[bio][i][j]
for bio in range(Bio):
plt.scatter(nx[bio][0]/dx,nx[bio][1]/dx,color = cl[bio],s = 150,edgecolor = "k")
plt.imshow(S)
plt.show()
plt.imshow(ud[0], cmap='Reds', origin='lower')
plt.colorbar()
plt.show()
Add a comment