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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

0回答

1247閲覧

Cannot cast ufunc 'inv' input from dtype('O') to .......... rule 'same_kind'とエラーで困ってます.

ponnkichi

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2022/11/21 06:13

編集2022/11/21 07:57

前提

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/ツールのバージョンなど)

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

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

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

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

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

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

bsdfan

2022/11/22 02:10

エラーメッセージから、エラーがinvで発生していることがわかるので、invに渡している MAT_A を print するかしてみると原因がわかるんじゃないでしょうか。おそらく cos() が sympy のものなのでは? あと、ndarray ではなく、わざわざ matrix を使っている理由は何かありますか?matrix を使うことで複雑になっているように見えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問