MATLAB,Python,Scilab,Julia比較 第2章 その34【対称行列と二次形式⑥】

MATLAB,Python,Scilab,Julia比較 第2章 その34【対称行列と二次形式⑥】 数値計算
MATLAB,Python,Scilab,Julia比較 第2章 その34【対称行列と二次形式⑥】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia2-backnumber/

はじめに

正規方程式を導出するまでの説明。
今回は二次形式の多項式表現と行列表現の計算をPythonで実施する。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

ロードマップおよび数式【再掲】

太郎くん
太郎くん

ロードマップと今回使用する数式を再掲。

正規方程式に至る道、二次形式、対称行列、二次形式の微分、グラム行列、二乗和誤差、正規方程式

\(
x^TA\circ x^T
\begin{bmatrix}
1\\
\vdots\\
1
\end{bmatrix}
\)

計算する二次形式の数式

\(
3x^2+2y^2+5xy
\)

フクさん
フクさん

今回は、Pythonで実施する。

Pythonコード

フクさん
フクさん

Pythonコードは以下になる。

import numpy as np
import matplotlib.pyplot as plt

a=3
b=2
c=5
A=np.array([[a,c/2],[c/2,b]])

N=6
ax=np.linspace(0,10,N)
ay=np.linspace(0,10,N)
x,y=np.meshgrid(ax,ay)

fig = plt.figure(figsize=(8, 8))

ax = fig.add_subplot(2, 1, 1, projection='3d')
polyY=a*x**2 +b*y**2 +c*x*y
ax.plot_wireframe(x,y,polyY)

X=np.block([[x.reshape(-1)],[y.reshape(-1)]])
Y=X.T@A*X.T@np.ones((2,1))
matY=Y.reshape(N,N)
ax = fig.add_subplot(2, 1, 2, projection='3d')
ax.plot_wireframe(x, y, matY)

plt.show()

print("polyY=")
print(polyY)
print("matY=")
print(matY)

実行結果

フクさん
フクさん

実行結果は以下。

二次形式の多項式表現と行列表現の計算(Python)
polyY=
[[   0.   12.   48.  108.  192.  300.]
 [   8.   40.   96.  176.  280.  408.]
 [  32.   84.  160.  260.  384.  532.]
 [  72.  144.  240.  360.  504.  672.]
 [ 128.  220.  336.  476.  640.  828.]
 [ 200.  312.  448.  608.  792. 1000.]]
matY=
[[   0.   12.   48.  108.  192.  300.]
 [   8.   40.   96.  176.  280.  408.]
 [  32.   84.  160.  260.  384.  532.]
 [  72.  144.  240.  360.  504.  672.]
 [ 128.  220.  336.  476.  640.  828.]
 [ 200.  312.  448.  608.  792. 1000.]]

考察

太郎くん
太郎くん

処理の流れとしてはMATLABと一緒だね。
二次形式の多項式表現、行列表現で同じ結果になったの一緒だ。

太郎くん
太郎くん

ちょっと気になる点が、projection=’3d’とplot_wireframeかな?

フクさん
フクさん

projection=’3d’は3Dグラフを使用する場合のオプション。
plot_wireframeはワイヤーフレームをグラフ表示するためのメソッドだな。
先のprojection=’3d’のオプションが無いと表示されない。

太郎くん
太郎くん

まぁ、そういう設定が必要ってことか。

まとめ

フクさん
フクさん

まとめだよ。

  • 二次形式の多項式表現と行列表現の計算をPythonで実施。
  • 3Dグラフを表示する際は、projection=’3d’が必要。
  • plot_wireframeでワイヤーフレームでグラフ表示ができる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました