前提
Pythonで倒立振子の非線形モデルのシミュレーションを作成時にエラーが出てしまいました.
行列計算の関数の機能を実装中にfor文内で以下のエラーメッセージが発生しました。
Cannot cast ufunc 'inv' input from dtype('O') to dtype('float64') with casting rule 'same_kind'
ネットでエラー文に関する内容を検索したが、該当する内容を見つけることができませんでした.
実現したいこと
シミュレーションを実行したい。
発生している問題・エラーメッセージ
UFuncTypeError Traceback (most recent call last) <ipython-input-9-0a9e91036d71> 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 1 frames <__array_function__ internals> in inv(*args, **kwargs) /usr/local/lib/python3.7/dist-packages/numpy/linalg/linalg.py in inv(a) 543 signature = 'D->D' if isComplexType(t) else 'd->d' 544 extobj = get_linalg_error_extobj(_raise_linalgerror_singular) --> 545 ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj) 546 return wrap(ainv.astype(result_t, copy=False)) 547 UFuncTypeError: Cannot cast ufunc 'inv' input from dtype('O') to dtype('float64') with casting rule 'same_kind'
該当のソースコード
Python
1!pip install control 2!pip install --upgrade cvxpy
%reset -f import numpy as np import scipy as sp import matplotlib.pyplot as plt from control.matlab import * import control as ct from sympy import * from numpy.matrixlib import matrix import pandas as pd %matplotlib inline
#パラメータ 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) C1 = (M*R_W**2+J_m+J_W) # C2 = (M*R_W*cos(state[2,0])-J_m) C3 = ((K_t*K_b)/(R_m) + f_W + f_m ) # C4 = (state[3,0]*M*R_W*L*sin(state[2,0])+((K_t*K_b)/(R_m)+f_m))) C5 = (K_t/R_m) #D1 = (-J_m+M*R_W*L*cos(state[2,0])) D2 = (M*L**2+J_theta+J_m) D3 = ((K_t*K_b)/(R_m)+J_m) D4 = -((K_t*K_b)/(R_m)+f_m) #D5 = (L*M*g*sin(state[2,0])) D6 = -(K_t/R_m)
def dynamicalsystem(state,input): MAT_A=np.array([[1,0,0,0], [0,(M*R_W**2+J_m+J_W),0, M*R_W*cos(state[2,0])-J_m ], [0,0,1,0], [0,-J_m+M*R_W*L*cos(state[2,0]),0,M*L**2+J_theta+J_m] ]) c = np.linalg.inv(MAT_A) MAT_B = np.array([[0,1,0,0,], [0,C3, 0, state[3,0]*M*R_W*L*cos(state[2,0])+((K_t*K_b)/(R_m)+J_m)], [0,0,0,1], [0,D3,L*M*g*sin(state[2,0]),D4] ]) MAT_C = np.dot(MAT_A.I,MAT_B) dx = np.zeros(4,1) dx[0,0] = MAT_C[0,0]*state[0,0]+MAT_C[0,1]*state[1,0]+MAT_C[0,2]*state[2,0]+MAT_C[0,3]*state[3,0] dx[1,0] = MAT_C[1,0]*state[0,0]+MAT_C[1,1]*state[1,0]+MAT_C[1,2]*state[2,0]+MAT_C[1,3]*state[3,0] dx[2,0] = MAT_C[2,0]*state[0,0]+MAT_C[2,1]*state[1,0]+MAT_C[2,2]*state[2,0]+MAT_C[2,3]*state[3,0] dx[3,0] = MAT_C[3,0]*state[0,0]+MAT_C[3,1]*state[1,0]+MAT_C[3,2]*state[2,0]+MAT_C[3,3]*state[3,0] return np.vstack([ dx[0,0], dx[1,0], dx[2,0], dx[3,0], ])
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))) output_y = np.matrix(np.zeros((SIZE_OUTPUT, NUMBER_STEPS))) state_x = np.matrix(np.zeros((SIZE_STATE, NUMBER_STEPS))) reference_r = np.matrix(np.zeros((SIZE_OUTPUT, NUMBER_STEPS))) state_dx = np.matrix(np.zeros((SIZE_STATE, 1))) STATE_INTTAL = np.matrix( ([-0.001],[0],[0.001],[0] ),dtype=np.float ) #np.matrix(( [1], [0.00],[0.00],[0.00]))
state_x[:, 0] = STATE_INTTAL for counter in range(1, NUMBER_STEPS): input_u[:, counter] = 0.0 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
plt.subplots_adjust(wspace=0.4, hspace=0.6) #plt.plot(np.ravel(time_t), np.ravel(input_u)) plt.subplot(2, 2, 1) plt.plot(np.ravel(time_t), np.ravel(state_x[2, :]),) plt.xlabel("$time[s]$") #x軸の名前 plt.ylabel("$θ[rad]$") #y軸の名前 plt.ylim(-220,130) #y軸範囲指定 plt.xlim(0,10) plt.subplot(2, 2, 2) plt.plot(np.ravel(time_t), np.ravel(state_x[3, :])) plt.xlabel("$time[s]$") #x軸の名前 plt.ylabel("$Vθ[rad/s]$") #y軸の名前 plt.ylim(-700,700) #y軸範囲指定 plt.subplot(2, 2, 3) plt.plot(np.ravel(time_t), np.ravel(state_x[0, :])) plt.xlabel("$time[s]$") #x軸の名前 plt.ylabel("$φ[rad]$") #y軸の名前 plt.ylim(-600,500) #y軸範囲指定 plt.subplot(2, 2, 4) plt.plot(np.ravel(time_t), np.ravel(state_x[1, :])) plt.xlabel("$time[s]$") #x軸の名前 plt.ylabel("$Vφ[rad/s]$") #y軸の名前 plt.ylim(-10000,10000) #y軸範囲指定 plt.show()
試したこと
state_x[0,0]の初期値にdtype=np.floatを加えたりしたが、エラーは解消できなかった.
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

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