バックナンバーはこちら。
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)
実行結果
フクさん
実行結果は以下。
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でワイヤーフレームでグラフ表示ができる。
バックナンバーはこちら。
コメント