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

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

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

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

Q&A

解決済

1回答

1246閲覧

複雑な行列計算の結果をプロットしたい。

S.K12

総合スコア16

Python

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

0グッド

0クリップ

投稿2020/09/16 09:23

編集2020/09/16 14:08

前提・実現したいこと

イメージ説明
上記の式において
Zを10~100000まで100ずつ増加させた場合のX,Yをグラフとしてプロットしたいです。

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

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-10-60a3432b3cf4> in <module> 80 Z = Z+100 81 ---> 82 plt.plot(X, Y) 83 plt.show() ~\anaconda3\lib\site-packages\matplotlib\pyplot.py in plot(scalex, scaley, data, *args, **kwargs) 2759 @docstring.copy(Axes.plot) 2760 def plot(*args, scalex=True, scaley=True, data=None, **kwargs): -> 2761 return gca().plot( 2762 *args, scalex=scalex, scaley=scaley, **({"data": data} if data 2763 is not None else {}), **kwargs) ~\anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, data, *args, **kwargs) 1645 """ 1646 kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D) -> 1647 lines = [*self._get_lines(*args, data=data, **kwargs)] 1648 for line in lines: 1649 self.add_line(line) ~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in __call__(self, *args, **kwargs) 214 this += args[0], 215 args = args[1:] --> 216 yield from self._plot_args(this, kwargs) 217 218 def get_next_color(self): ~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs) 343 f"have shapes {x.shape} and {y.shape}") 344 if x.ndim > 2 or y.ndim > 2: --> 345 raise ValueError(f"x and y can be no greater than 2-D, but have " 346 f"shapes {x.shape} and {y.shape}") 347 if x.ndim == 1: ValueError: x and y can be no greater than 2-D, but have shapes (1000, 1, 1) and (1000, 1, 1)

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4 5A = np.array([[0,0,0,1], 6[15.625,6.25,2.5,1], 7[125,25,5,1], 8[421.875,56.25,7.5,1], 9[1000,100,10,1], 10[1953.125,156.25,12.5,1], 11[3375,225,15,1], 12[5359.375,306.25,17.5,1], 13[8000,400,20,1], 14[11390.625,506.25,22.5,1], 15[15625,625,25,1], 16[20796.875,756.25,27.5,1], 17[27000,900,30,1], 18[34328.125,1056.25,32.5,1], 19[42875,1225,35,1], 20[52734.375,1406.25,37.5,1], 21[64000,1600,40,1], 22[76765.625,1806.25,42.5,1], 23[91125,2025,45,1], 24[107171.875,2256.25,47.5,1], 25[125000,2500,50,1]]) 26 27y = np.array([[840], 28[856], 29[848], 30[844], 31[860], 32[872], 33[884], 34[912], 35[936], 36[948], 37[956], 38[980], 39[1000], 40[1020], 41[1028], 42[1032], 43[1036], 44[1040], 45[1040], 46[1040], 47[1044]]) 48 49C = np.array([[0,0,0.00293372,0], 50[0.055007241,0.014668598,0.00293372,0], 51[0.220028964,0.029337195,0.00293372,0], 52[0.49506517,0.044005793,0.00293372,0], 53[0.880115857,0.05867439,0.00293372,0], 54[1.375181027,0.073342988,0.00293372,0], 55[1.980260679,0.088011586,0.00293372,0], 56[2.695354813,0.102680183,0.00293372,0], 57[3.520463429,0.117348781,0.00293372,0], 58[4.455586527,0.132017379,0.00293372,0], 59[5.500724108,0.146685976,0.00293372,0], 60[6.65587617,0.161354574,0.00293372,0], 61[7.921042715,0.176023171,0.00293372,0], 62[9.296223742,0.190691769,0.00293372,0], 63[10.78141925,0.205360367,0.00293372,0], 64[12.37662924,0.220028964,0.00293372,0], 65[14.08185372,0.234697562,0.00293372,0], 66[15.89709267,0.24936616,0.00293372,0], 67[17.82234611,0.264034757,0.00293372,0], 68[19.85761403,0.278703355,0.00293372,0], 69[22.00289643,0.293371952,0.00293372,0]]) 70 71X = [] 72Y = [] 73Z = 10 74while Z <= 100000 : 75 G = np.dot(A.T,A)+Z*np.dot(C.T,C) 76 H = np.dot(A.T,y) 77 x = np.dot(np.linalg.inv(G),H) 78 X.append(np.dot(y.T,y)-np.dot(np.dot(np.dot(2,x.T),A.T),y)+np.dot(np.dot(np.dot(x.T,A.T),A),x)) 79 Y.append(np.dot(np.dot(np.dot(x.T,C.T),C),x)) 80 Z = Z+100 81 82plt.plot(X, Y) 83plt.show()

試したことなど

matlabで同様の計算をした場合問題なくプロット出来たのですが、
pythonで同じ計算を行うとこのようになってしまいまい、
どこが間違っているのかわからず困っています。

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

使用環境:windows64bit, Anaconda

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

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

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

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

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

meg_

2020/09/16 12:09

> Y.append(np.dot(np.dot(x.T,C.T),C),x) もう一回np.dot()が必要なのでは?
S.K12

2020/09/16 12:31

np.dot()を追加したところ、TypeErrorがなくなりました。 ご指摘有難う御座います。
toast-uz

2020/09/16 13:42

Zを10~100000まで100ずつ増加させた場合、に相当するコードはどこでしょうか?
toast-uz

2020/09/16 13:46

また、10~100000まで100ずつ増加、というのは、10、110、210、310、・・99910 とういことでしょうか?
S.K12

2020/09/16 14:09

>Zを10~100000まで100ずつ増加させた場合、に相当するコードはどこでしょうか? 間違えて消してしまっていたので、修正で追加しました。 またその際にエラーメッセージの方も変化した為、修正しました。ご指摘有難う御座います。 >また、10~100000まで100ずつ増加、というのは、10、110、210、310、・・99910 とういことでしょうか? はいその解釈で間違いありません。
toast-uz

2020/09/16 14:11

ありがとうございます。その解釈で回答しております。
guest

回答1

0

ベストアンサー

計算の部分を以下のように変えると、動作します。

  • XとYのリスト追加において、np計算した結果はスカラーにはならずに1行1列の行列になるため、スカラー値を取り出す操作を入れる。

Python

1X = [] 2Y = [] 3for Z in range(10, 100000, 100): 4 G = np.dot(A.T,A)+Z*np.dot(C.T,C) 5 H = np.dot(A.T,y) 6 x = np.dot(np.linalg.inv(G),H) 7 X.append((np.dot(y.T,y)-np.dot(np.dot(np.dot(2,x.T),A.T),y)+np.dot(np.dot(np.dot(x.T,A.T),A),x))[0, 0]) 8 Y.append(np.dot(np.dot(np.dot(x.T,C.T),C),x)[0, 0]) 9 10plt.plot(X, Y) 11plt.show()

ループの記載は変えていますが、動作としては元のコードと同一です。

投稿2020/09/16 14:05

編集2020/09/16 14:12
toast-uz

総合スコア3266

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

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

S.K12

2020/09/16 14:17

無事にmatlabでプロットしたグラフと同様のグラフをpythonでもプロットする事が出来ました。 コードのどこに問題があるのかもわかりやすくて本当に助かりました。 本当に有難う御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問