前提・実現したいこと
初心者です。Pythonで振り子運動をアニメーション表示するシステムを作っています。**エラーメッセージの意味(とそのデバッグ法)**がわからないため、教えていただきたいと考えています。
発生している問題・エラーメッセージ
エラーメッセージの後半以降、data[i][j][k] = ・・・以下の内容の意味が調べましたがよくわかりません。また最後のエラーメッセージついて、floatが文字や数値に使うもので配列には使えないということはわかったのですが、コード内でfloatをどこで使っているのかがわかりません。
Traceback (most recent call last): File "C:/Users/hirah/OneDrive/python/振り子運動 python.py", line 69, in <module> Ani = ita.plot.animation_show(ani) File "C:\Users\hirah\Anaconda3\lib\site-packages\ita\plot.py", line 54, in animation_show image_preprocess(tmp) File "C:\Users\hirah\Anaconda3\lib\site-packages\ita\plot.py", line 28, in image_preprocess data[i][j][k] = imv_normalize(data[i][j][k]) File "C:\Users\hirah\Anaconda3\lib\site-packages\ita\plot.py", line 19, in imv_normalize return min(max(0.0, float(v)), 1.0) TypeError: float() argument must be a string or a number, not 'list'
該当のソースコード
Python
1import ita 2import math 3 4def diffusion_motion(T, time_stride): 5 g = 9.8 #重力加速度 6 l = 0.1 #棒の長さ 7 steps = round(T / time_stride) #繰り返し回数 8 result = ita.array.make1d(steps) #結果格納用の配列 9 result[0] = math.pi/ 3 #初期条件 10 for i in range(1, steps): 11 if i ==1: 12 result[i] = - g/l*time_stride**2*math.sin(result[i-1]) 13 + result[i-1] 14 else: 15 result[i] = - g/l*time_stride**2*math.sin(result[i-1]) 16 + 2*result[i-1] - result[i-2] 17 return result 18 19def diffusion_anime_ball(ang): 20 images = ita.array.make1d(len(ang)) 21 #アニメーション用の配列を準備 22 for i in range(0, len(ang)): 23 image = ita.array.make3d(100,200, 3) 24 cur_y = 0 + 30*math.cos(ang[i]) #物体のy座標 25 cur_x = 50 + 30*math.sin(ang[i]) #物体のx座標 26 draw_circle(5, round(cur_y), round(cur_x), [0, 0, 0], image) 27 #その時刻の物体の座標に半径5の白い円を描く 28 draw_stick(0, 50, round(cur_y), round(cur_x), [1,1, 0], image) 29 #その時刻の物体と天井を結ぶ棒を描く 30 images[i] = image 31 return images 32 33def draw_circle(r, center_y, center_x, color, image): 34 #点(center_x, center_y)上に半径rの円を描く 35 for i in range(center_y - r, center_y + r): 36 for j in range(center_x - r, center_x + r): 37 if (0 <= i < len(image) and 0 <= j < len(image[i]) and 38 distance(i, j, center_y, center_x) < r): 39 image[i][j] = color 40 41def distance(x1, y1, x2, y2): 42 #2点間の距離を求める 43 d = ((x2 - x1)**2 + (y2 - y1)**2)**0.5 44 return d 45 46def draw_stick(y1, x1, y2, x2, color, image): 47 #2点(x1, y1),(x2, y2)を結ぶ線分を描く 48 if y1 > y2: 49 c = y1 50 y1 = y2 51 y2 = c 52 if x1 > x2: 53 c = x1 54 x1 = x2 55 x2 = c #座標の大小関係により入れ替えを行う 56 for i in range(y1, y2 +1): 57 for j in range(x1, x2 + 1): 58 a = (y2 - y1)/(x2-x1) #傾き 59 if i - y1 == a*(j - x1): 60 #2点(x1, y1),(x2, y2)を結ぶ直線上に点(j, i)があるとき色を打つ 61 image[i][j] = color 62 63def diffusion(T, time_stride): 64 ang = diffusion_motion(T, time_stride) 65 ani = [[diffusion_anime_ball(ang)]] 66 return ani 67 68ani = diffusion(2, 0.3) 69Ani = ita.plot.animation_show(ani) 70print(Ani) 71 72
試したこと
関数diffusion_anime_ball(ang)において、imageの次元を色々変えてみたりしましたが、正直何をしたらよいのかわかりません。
補足情報(FW/ツールのバージョンなど)
Python version3
AnacondaのIDLEを使っています。
振り子運動の状況設定としては、長さlの棒に重りをつるしたものを考えています。重りの円弧方向の微分方程式を差分化して得られる式、
(θ(t+ Δt)-2θ(t)+ θ(t- Δt))/(Δt^2 )= -g/l sinθ(t)
をもとに、
Δt= time_stride = 0.3 として、2秒間の運動のシミュレーションを行っています。
以下はエラーが起きているitaのコードです。
Python
1# -*- encoding: utf-8 -*- 2 3from . import array 4from . import plot 5from . import bench 6from . import excheck 7 8def lifegame_glider(): 9 return [[0,0,0,0,0,0,0,0], 10 [0,0,0,0,0,0,0,0], 11 [0,0,0,0,0,0,0,0], 12 [0,0,0,0,0,0,0,0], 13 [0,0,0,0,1,1,1,0], 14 [0,0,0,0,1,0,0,0], 15 [0,0,0,0,0,1,0,0], 16 [0,0,0,0,0,0,0,0]] 17 18def lifegame_acorn(): 19 # Corderman's Acorn 20 image = array.make2d(60,80) 21 x = 60 22 y = 30 23 for i in [[0,1],[1,3],[2,0],[2,1],[2,4],[2,5],[2,6]]: 24 image[y + i[0]][x + i[1]] = 1 25 return image 26 27import random as rnd 28 29# 身長体重データ疑似生成用 30def gen_hw_data(): 31 s = rnd.randint(0,1) 32 h = int(rnd.gauss(155+s*18, 10)) 33 t = rnd.randint(0,1) 34 wd = (h/100) ** 2 * (19+3*t) 35 w = int(wd + rnd.betavariate(2,10) * 200 - 15) 36 return (h,w) 37 38# バネの延びデータ疑似生成用 39def gen_spring_data(): 40 w = rnd.randint(0,200) 41 l = int(2 * w * rnd.gauss(1, 0.1)) 42 return (w,l) 43 44 45
回答1件
あなたの回答
tips
プレビュー