質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2453閲覧

振り子運動のシミュレーションにおいて、わからないエラーメッセージの意味(とそのデバッグ法)を教えてほしい

hirashun

総合スコア6

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/09 16:12

編集2020/02/09 17:28

前提・実現したいこと

初心者です。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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/02/09 17:04 編集

エラーが発生しているitaというパッケージの詳細(ソース、インストール手順など)は提示できますか? また、diffusion_anime_ball関数の最後のreturnのインデントは意図した位置にありますか?
hirashun

2020/02/09 17:33

メッセージありがとうございます。 itaについてはソースコードを追加で提示しましたが、僕自身どういうものなのかよく理解しておりません。自分が使っている参考書に従って、配列を新しく取得するときやアニメーションを表示する時にitaをとりあえずimport して使っているという状況です。申し訳ありません。 diffusion_anime_ball関数のインデントについては、ご指摘いただいた通り位置が間違っておりましたので修正いたしました。ありがとうございます。
hoshi-takanori

2020/02/09 22:57

ita パッケージについて調べたところ、「Pythonによるプログラミング入門 東京大学教養学部テキスト」という本 http://www.utp.or.jp/book/b470446.html のために公開されているもののようですね。「自分が使っている参考書」と言われても他の人には分からないので、ちゃんと本の名前を書きましょう。 また、float を使ってるのは ita パッケージ内の plot.py というファイルです。(補足情報として __init__.py の内容を貼り付けたようですが、これはあまり関係ありません。)エラーメッセージを読めば、該当のソースコードの最後から 2 行目で plot.py の中にある animation_show を呼び出し、そこから image_preprocess → imv_normalize → float と呼ばれてエラーになっているのが分かるはずです。 ちなみに diffusion_motion などの処理の内容はちゃんと理解されてますか? また、参考書の目次には「幕間:テストとデバッグの基本」や「付録A Python言語の簡易ガイド」の「A.5 基本的な値と型」「A.6 ライブラリ」「A.7 エラーと例外」などの役に立ちそうな項目があるので、読んでみてはいかがでしょうか。
guest

回答1

0

ベストアンサー

とりあえず、

python

1def diffusion(T, time_stride): 2 ang = diffusion_motion(T, time_stride) 3 ani = [[diffusion_anime_ball(ang)]] 4 return ani

の部分を、

python

1def diffusion(T, time_stride): 2 ang = diffusion_motion(T, time_stride) 3 ani = diffusion_anime_ball(ang) # [[ ]] を削除 4 return ani 5

としたら何かが動きました。

また、他の怪しげな部分としては、

python

1def diffusion_motion(T, time_stride): 2 g = 9.8 #重力加速度 3 l = 0.1 #棒の長さ 4 steps = round(T / time_stride) #繰り返し回数 5 result = ita.array.make1d(steps) #結果格納用の配列 6 result[0] = math.pi/ 3 #初期条件 7 for i in range(1, steps): 8 if i ==1: 9 result[i] = - g/l*time_stride**2*math.sin(result[i-1]) 10 + result[i-1] 11 else: 12 result[i] = - g/l*time_stride**2*math.sin(result[i-1]) 13 + 2*result[i-1] - result[i-2] 14 return result 15

+ result[i-1]+ 2*result[i-1] - result[i-2] の部分はおそらく継続行だと思われるので、前の行の最後に \ が必要な気がします。
参考: 1つの文が複数行に渡る場合の書き方 - いしだ日記

python

1def diffusion_anime_ball(ang): 2 images = ita.array.make1d(len(ang)) 3 #アニメーション用の配列を準備 4 for i in range(0, len(ang)): 5 image = ita.array.make3d(100,200, 3) 6 cur_y = 0 + 30*math.cos(ang[i]) #物体のy座標 7 cur_x = 50 + 30*math.sin(ang[i]) #物体のx座標 8 draw_circle(5, round(cur_y), round(cur_x), [0, 0, 0], image) 9 #その時刻の物体の座標に半径5の白い円を描く 10 draw_stick(0, 50, round(cur_y), round(cur_x), [1,1, 0], image) 11 #その時刻の物体と天井を結ぶ棒を描く 12 images[i] = image 13 return images 14

の draw_circle の引数 [0, 0, 0] ですが、これは黒で背景色と同じなので何も表示されません。
試しに [0, 0, 1] に変更したら青いものが出現しました。

以上の変更でも動きはかなり怪しいのですが、とりあえず何かが動くと楽しいですね。
あとは計算式を地道に見直す必要があるかと思います。頑張ってください。

投稿2020/02/09 23:39

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirashun

2020/02/10 02:24

itaについての説明も含め、数多くの助言ほんとにありがとうございます。ご指摘いただいた個所を直してみると、とりあえずコンパイルはできるようになりました。まだ自分の思うような表示はできていないので、ここから試行錯誤してやってみようと思います。ほんとうにありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問