ソースコード
http://souzousha.iinaa.net/www/SourcePY.html
こちらのサイトにある、「二次元波動シミュレーション」というプログラムをインストールし、spyderで動作させようとしたところ、macがシャットダウンしてしまう現象に見舞われています。
他のファイルでも同じような現象が起こっていますが、これは何が原因なのでしょうか?
pythonのプログラムを動作させた時にシャットダウンする現象について調べたのですが、teratail内での似たような質問に回答がついていなかったので新規に質問させて頂いています。
《追記》
Pythonは最新の状態にアップデートしてあります。
ターミナルで
$ python3
と打った後、
import tkinter
そして
tkinter._test()
と打つと、きちんとtkinterのウィンドウが表示されるのですが、いざspyderでコードをコンパイルしようとすると、macがシャットダウンしてしまいます。
ご教授よろしくお願いいたします。
以下がコードになります(サイト先でもインストール可能です)
python
1from tkinter import * 2import math,time 3#■初期設定 4NumX = 50; NumY = 50 5Z=[[0 for j in range(NumY + 1)] for i in range(NumX + 1)] 6ID=[[0 for j in range(NumY + 1)] for i in range(NumX + 1)] 7ZX=[[0 for j in range(NumY + 1)] for i in range(NumX + 1)] 8ZY=[[0 for j in range(NumY + 1)] for i in range(NumX + 1)] 9def initHidden(): 10 XY=[[0,0] for i in range(4)] 11 XY[0][0]=200;XY[0][1]=200; XY[1][0]=200;XY[1][1]=210 12 XY[2][0]=210;XY[2][1]=210; XY[3][0]=210;XY[3][1]=200 13 A=math.pi/9; B=math.pi/6; DX=5 14 cosA=DX*math.cos(A);cosB=DX*math.cos(B) 15 sinA=DX*math.sin(A);sinB=DX*math.sin(B) 16 for i in range(NumX+1): 17 for j in range(NumY+1): 18 ZX[i][j]=250+(i*cosA-j*cosB) 19 ZY[i][j]=250-(i*sinA+j*sinB) 20 for i in range(NumX): 21 for j in range(NumY): 22 ID[i][j]=canvas.create_polygon(XY,fill="white", outline="#000077") 23#■隠れ線処理 24def hiddenLine(): # 画面の場合のみ可能(プロッタでは使えない) 25 global canvas, NumX, NumY 26 XY=[0 for i in range(8)] 27 for i in range(NumX): 28 i2=NumX-i;i1=i2-1 29 for j in range(NumY): 30 j2=NumX-j; j1=j2-1 31 XY[0]=ZX[i1][j1]; XY[1]=ZY[i1][j1]-Z[i1][j1] 32 XY[2]=ZX[i1][j2]; XY[3]=ZY[i1][j2]-Z[i1][j2] 33 XY[4]=ZX[i2][j2]; XY[5]=ZY[i2][j2]-Z[i2][j2] 34 XY[6]=ZX[i2][j1]; XY[7]=ZY[i2][j1]-Z[i2][j1] 35 canvas.coords(ID[i][j],XY) 36ZS=[[[0 for j in range(NumY+1)] for i in range(NumX+1)] for k in range(2)] 37V =[[[0 for j in range(NumY+1)] for i in range(NumX+1)] for k in range(2)] 38simTime = 0; ID1 = 0; ID2 = 1; Myu=0.02;counter=0 39FreeBoundary=True # 境界条件を自由端にするときTrueにする 40captMode=True #画面キャプチャするときTrueにする 41def setData(): #データを設定 42 for j in range(NumX+1): 43 for k in range(NumY+1): 44 Z[j][k]=80.0*ZS[ID1][j][k] 45def initWave(): 46 global simTime, ID1, ID2, Myu,counter,XS,V 47 simTime = 0; ID1 = 0; ID2 = 1; Myu=0.02;counter=0 48 for i in range(NumX+1): 49 for j in range(NumY+1): 50 DX = i - NumX/2; DY = j - NumY/2 51 R = math.sqrt(DX * DX + DY * DY) 52 if R < 0.1: A=1 53 elif R > 3 : A=0 54 else : A = math.sin(R) / R; 55 ZS[0][ i][ j] = -A; V[0][ i][ j] = 0; 56def waveEquation(SaveN, Alfa, DX, DT): 57 global NumX, NumY, ZS, ID1,ID2,simTime,Myu,counter 58 Beta = Alfa * Alfa / (DX * DX); 59 for k in range(SaveN): 60 for i in range(1, NumX): 61 for j in range(1, NumY): 62 ZS[ID2][i][j] = ZS[ID1][i][j] + DT * V[ID1][i][j] 63 for i in range(1, NumX): 64 for j in range(1, NumY): 65 Acc = Beta * (ZS[ID2][i][j + 1] - 2 * ZS[ID2][i][j] + 66 ZS[ID2][i][j - 1] + ZS[ID2][i + 1][j] - 67 2 * ZS[ID2][i][j] + ZS[ID2][i - 1][j]) 68 V[ID2][i][j] = V[ID1][i][j] + DT *(Acc- Myu*V[ID1][i][j]) 69 if FreeBoundary: #自由端境界条件 70 for i in range(NumX+1): 71 V [ID2][i][0] = V [ID2][i][1] 72 V [ID2][i][NumY] = V [ID2][i][NumY-1] 73 ZS[ID2][i][0] = ZS[ID2][i][1] 74 ZS[ID2][i][NumY] = ZS[ID2][i][NumY-1] 75 for i in range(NumY+1): 76 V [ID2][0][i] = V [ID2][1][i] 77 V [ID2][NumX][i] = V [ID2][NumX-1][i] 78 ZS[ID2][0][i] = ZS[ID2][1][i] 79 ZS[ID2][NumX][i] = ZS[ID2][NumX-1][i] 80 else: #固定端境界条件 81 for i in range(NumX+1): 82 V[ID2][i][0] =0; V[ID2][i][NumY]= 0 83 ZS[ID2][i][0]=0; ZS[ID2][i][NumY]=0 84 for i in range(NumY+1): 85 V[ID2][0][i] =0; V[ID2][NumX][i]=0 86 ZS[ID2][0][i]=0; ZS[ID2][NumX][i] = 0 87 simTime += DT; ID1 = ID2; ID2 = 1-ID2;counter+=1 88 return 0 89def leftMouseDown(event):#ダウン 90 waveEquation(100, 0.05, 0.05, 0.01) 91 setData(); hiddenLine(); 92 root.title("2次元波動 t = %f" % simTime);root.update() 93#■メイン処理 94root=Tk();root.title("2次元波動");root.geometry("500x300") 95canvas=Canvas(root,width=500,height=300,bg="white"); canvas.pack() 96initHidden(); initWave() 97if captMode: 98 waveEquation(100, 0.05, 0.05, 0.01) 99 setData(); hiddenLine(); 100 root.title("2次元波動 t=%f" % simTime);root.update() 101 canvas.bind("<Button-1>",leftMouseDown) 102 root.mainloop() 103else: 104 while(1): 105 waveEquation(100, 0.05, 0.05, 0.01) 106 setData(); hiddenLine() 107 root.title("2次元波動 t = %f" % simTime);root.update() 108 time.sleep(0.01)
あなたの回答
tips
プレビュー