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

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

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

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

Q&A

解決済

2回答

784閲覧

Python 行列表現 for文内のコードエラーが対処できない

ponnkichi

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/10/28 08:53

編集2022/10/29 12:28

前提

倒立振子の線形化下プログラムを作成しましたが、エラーが解決できませんでした.

実現したいこと

シミュレーションをすること.
グラフが発散することを確認できるようにする.

発生している問題・エラーメッセージ

can't multiply sequence by non-int of type 'float'

該当のソースコード

TypeError Traceback (most recent call last) <ipython-input-14-c07dcd572c24> in <module> 4 time_t[:, counter] = TIME_STEP*counter 5 input_u[:, counter-1] = np.matrix(np.zeros((1, 1))) ----> 6 state_dx = dynamicalsystem(state_x[:, counter-1], input_u[:, counter-1]) 7 state_x[:, counter] = state_x[:, counter-1] + state_dx*TIME_STEP <ipython-input-10-e09b5a52b810> in dynamicalsystem(state, input) 1 def dynamicalsystem(state,input): ----> 2 return np.vstack([ state[1, 0] , AA1*state[1, 0] + AA2*state[2, 0] + AA3*state[3, 0] + CC1*input[0,0] , state[3,0] , BB1*state[1,0] + BB2*state[2,0] + BB3*[3,0] + CC2*input[0,0] ]) 3 TypeError: can't multiply sequence by non-int of type 'float'

ソースコードは下のようになりました. 
コード1

!pip install control !pip install --upgrade cvxpy

コード2

%reset -f import numpy as np import scipy as sp import matplotlib.pyplot as plt

コード3

#パラメータ g=9.81 m=0.0467 R_W=0.066 J_W=(m*R_W*R_W)/2 M=0.806 L=0.75689 J_theta=(M*L*L)/3 J_m=0.00001 R_m=6.69 K_t=0.317 f_m=0.0022 f_W=0 K_b=0.468 theta = 30; h = 0.001 #線形係数 A1=-R_m*(M*L*L+J_theta+J_m)/K_t A2=-R_m*(-J_m+M*R_W*L)/K_t A3=(R_m*M*g*L)/K_t A4=(-K_t*K_b-f_m*R_m)/K_t A5=K_b+(R_m*f_m)/K_t B1=R_m*(M*R_W*R_W+m*R_W*R_W+J_W+J_m)/K_t B2=R_m*(M*R_W*L-J_m)/K_t B3=(K_t*K_b+R_m*f_m)/K_t B4=(-K_t*K_b-R_m*f_m-R_m*f_W)/K_t AA1= (A1*B4-B2*A4)/(B2*A2-B1*A1) AA2 =(-B2*A3)/(B2*A2-B1*A1) AA3 =(A1*B3-B2*A4)/(B2*A2-B1*A1) BB1= (A2*B3-B1*A5)/(B1*A1-B2*A2) BB2 =(-B1*A3)/(B1*A1-B2*A2) BB3 =(A2*B3-B1*A4)/(B1*A1-B2*A2) CC1 = (B2-A1)/ (B2*A2-B1*A1) CC2 = (B1-A2)/ (B1*A1-B2*A2)

コード4

def dynamicalsystem(state,input): return np.vstack([ state[1, 0] , AA1*state[1, 0] + AA2*state[2, 0] + AA3*state[3, 0] + CC1*input[0,0] , state[3,0] , BB1*state[1,0] + BB2*state[2,0] + BB3*[3,0] + CC2*input[0,0] ])

コード5

NUMBER_STEPS = int(10000) #NUMBER_STEPSに整数の10000配列格納 TIME_START = 0.0 TIME_END = 10.0 TIME_STEP = (TIME_END - TIME_START)/float(NUMBER_STEPS) SIZE_INPUT = int(1) SIZE_OUTPUT = int(1) SIZE_STATE = int(4) time_t = np.matrix(np.zeros((1, NUMBER_STEPS))) input_u = np.matrix(np.zeros((SIZE_INPUT, NUMBER_STEPS))) state_x = np.matrix(np.zeros((SIZE_STATE, NUMBER_STEPS))) state_dx = np.matrix(np.zeros((SIZE_STATE, 1))) STATE_INTTAL = np.matrix(( [2], [0],[-1],[2]))

コード6

from numpy.matrixlib import matrix state_x[:, 0] = STATE_INTTAL for counter in range(1, NUMBER_STEPS): time_t[:, counter] = TIME_STEP*counter input_u[:, counter-1] = np.matrix(np.zeros((1, 1))) state_dx = dynamicalsystem(state_x[:, counter-1], input_u[:, counter-1]) state_x[:, counter] = state_x[:, counter-1] + state_dx*TIME_STEP

コード7

#plt.plot(np.ravel(time_t), np.ravel(input_u)) plt.plot(np.ravel(time_t), np.ravel(state_x[0, :])) plt.show() plt.plot(np.ravel(time_t), np.ravel(state_x[1, :])) plt.show() plt.plot(np.ravel(time_t), np.ravel(state_x[2, :])) plt.show() plt.plot(np.ravel(time_t), np.ravel(state_x[3, :])) plt.show()

試したこと

コード6以外はコンパイル通りました.
関数部分の行列がreturn文などで出力できているか確認しました.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

PondVillege

2022/10/28 10:35 編集

そもそもそのコードを解答者側でコピペして実行しても,動作しません. ブロックの中でインデントがあるべき場所に空白が存在しなかったり, 宣言していない変数を利用しているなど,客観的に見て再現性が無いです. またエラー文も1行しか示されておらず,本来エラー全文を確認できればどの部分でおかしい記述だったのか明言できるにも関わらず,情報が伝わっていません.現状の質問ではy_waiwaiさんのような回答が限界です.「Pythonのプログラムエラーの対処法」はエラー文の理解→指摘されているエラーの自己解決でしかないです. 編集して誰が見てもわかるよう,情報の整理を願います.
ponnkichi

2022/10/29 10:39

コメントありがとうございます。編集して誰が見てもわかるよう,情報の整理してみますね. 現段階でわかる宣言していない変数を利用しているところがどこかわかります??
guest

回答2

0

ベストアンサー

関数dynamicalsystem(state, input)におけるnp.vstack()の中でBB3*[3,0]としている箇所があります.普通,リスト * 整数では掛けた整数の大きさ分だけのリストが複製されますが,BB3は浮動小数点数で,浮動小数点数 * リストとなっています少数点数という中途半端なサイズの配列を複製できないのでエラーTypeError: can't multiply sequence by non-int of type 'float'になります.

同様に文字列 * 整数は可能ですが文字列 * 浮動小数点数は不可能で同じエラーが出ます.

おそらくBB3 * state[3, 0]と書きたかったのだと察します.

余談ですが,input組み込み関数で用意されているものです.関数内で一時的とはいえ値で組み込み関数を上書きしてしまうのは一般的にナンセンスとされています.

また,長々と書かれている式ですが,ブロードキャストを用いればより簡潔に記述できると思われます.簡潔に書くことで,今回のようなエラーの発生を防止できるよう,コード全体の見通しが良くなると思います.

投稿2022/10/29 14:25

編集2022/10/29 14:30
PondVillege

総合スコア1579

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

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

0

google翻訳
タイプ 'float' の非 int でシーケンスを乗算することはできません

そのエラーが出てる行をよく見直してみよう

投稿2022/10/28 10:19

y_waiwai

総合スコア87774

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

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

ponnkichi

2022/10/29 10:18

エラー分のstate_dxは4行1列の行列で dynamicalsystem()の関数もreturn文で4行1列の行列で表現して、オイラー法でstate_x[:, counter-1], input_u[:, counter-1]のカウントを更新してるつもりなので、このエラー文の両辺の等号は成立していると思うんですけど、どうしてエラーが起こるのかわからないです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問