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

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

ただいまの
回答率

88.92%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 79

S.K12

score 6

前提・実現したいこと

イメージ説明
上記の式において
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)

該当のソースコード

import numpy as np
import matplotlib.pyplot as plt


A = np.array([[0,0,0,1],
[15.625,6.25,2.5,1],
[125,25,5,1],
[421.875,56.25,7.5,1],
[1000,100,10,1],
[1953.125,156.25,12.5,1],
[3375,225,15,1],
[5359.375,306.25,17.5,1],
[8000,400,20,1],
[11390.625,506.25,22.5,1],
[15625,625,25,1],
[20796.875,756.25,27.5,1],
[27000,900,30,1],
[34328.125,1056.25,32.5,1],
[42875,1225,35,1],
[52734.375,1406.25,37.5,1],
[64000,1600,40,1],
[76765.625,1806.25,42.5,1],
[91125,2025,45,1],
[107171.875,2256.25,47.5,1],
[125000,2500,50,1]])

y = np.array([[840],
[856],
[848],
[844],
[860],
[872],
[884],
[912],
[936],
[948],
[956],
[980],
[1000],
[1020],
[1028],
[1032],
[1036],
[1040],
[1040],
[1040],
[1044]])

C = np.array([[0,0,0.00293372,0],
[0.055007241,0.014668598,0.00293372,0],
[0.220028964,0.029337195,0.00293372,0],
[0.49506517,0.044005793,0.00293372,0],
[0.880115857,0.05867439,0.00293372,0],
[1.375181027,0.073342988,0.00293372,0],
[1.980260679,0.088011586,0.00293372,0],
[2.695354813,0.102680183,0.00293372,0],
[3.520463429,0.117348781,0.00293372,0],
[4.455586527,0.132017379,0.00293372,0],
[5.500724108,0.146685976,0.00293372,0],
[6.65587617,0.161354574,0.00293372,0],
[7.921042715,0.176023171,0.00293372,0],
[9.296223742,0.190691769,0.00293372,0],
[10.78141925,0.205360367,0.00293372,0],
[12.37662924,0.220028964,0.00293372,0],
[14.08185372,0.234697562,0.00293372,0],
[15.89709267,0.24936616,0.00293372,0],
[17.82234611,0.264034757,0.00293372,0],
[19.85761403,0.278703355,0.00293372,0],
[22.00289643,0.293371952,0.00293372,0]])

X = []
Y = []
Z = 10
while Z <= 100000 :
     G = np.dot(A.T,A)+Z*np.dot(C.T,C)
     H = np.dot(A.T,y)
     x = np.dot(np.linalg.inv(G),H)
     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))
     Y.append(np.dot(np.dot(np.dot(x.T,C.T),C),x))
     Z = Z+100

plt.plot(X, Y)
plt.show()

試したことなど

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

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

使用環境:windows64bit, Anaconda

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • toast-uz

    2020/09/16 22:46

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

    キャンセル

  • S.K12

    2020/09/16 23:09

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

    >また、10~100000まで100ずつ増加、というのは、10、110、210、310、・・99910 とういことでしょうか?
    はいその解釈で間違いありません。

    キャンセル

  • toast-uz

    2020/09/16 23:11

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

    キャンセル

回答 1

checkベストアンサー

+1

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

  • XとYのリスト追加において、np計算した結果はスカラーにはならずに1行1列の行列になるため、スカラー値を取り出す操作を入れる。
X = []
Y = []
for Z in range(10, 100000, 100):
    G = np.dot(A.T,A)+Z*np.dot(C.T,C)
    H = np.dot(A.T,y)
    x = np.dot(np.linalg.inv(G),H)
    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])
    Y.append(np.dot(np.dot(np.dot(x.T,C.T),C),x)[0, 0])

plt.plot(X, Y)
plt.show()


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/16 23:17

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る