Prompt Title: Syntax error in code.

Created 1 year ago
Votes 0
Views 165 times
0

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()
avatar
saroblog
Shared 1 prompt
Created 1 year ago

Leave a Comment

Related Tag Prompts