前提
倒立振子の線形化下プログラムを作成しましたが、エラーが解決できませんでした.
実現したいこと
シミュレーションをすること.
グラフが発散することを確認できるようにする.
発生している問題・エラーメッセージ
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
そもそもそのコードを解答者側でコピペして実行しても,動作しません.
ブロックの中でインデントがあるべき場所に空白が存在しなかったり,
宣言していない変数を利用しているなど,客観的に見て再現性が無いです.
またエラー文も1行しか示されておらず,本来エラー全文を確認できればどの部分でおかしい記述だったのか明言できるにも関わらず,情報が伝わっていません.現状の質問ではy_waiwaiさんのような回答が限界です.「Pythonのプログラムエラーの対処法」はエラー文の理解→指摘されているエラーの自己解決でしかないです.
編集して誰が見てもわかるよう,情報の整理を願います.
コメントありがとうございます。編集して誰が見てもわかるよう,情報の整理してみますね.
現段階でわかる宣言していない変数を利用しているところがどこかわかります??

回答2件
あなたの回答
tips
プレビュー