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

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

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

はじめに

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

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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
\)

フクさん
フクさん

今回は、Juliaで実施する。

Juliaコード

フクさん
フクさん

Juliaコードは以下になる。

using PyPlot

function meshgrid(xin,yin)
	nx=length(xin)
	ny=length(yin)
	xout=zeros(ny,nx)
	yout=zeros(ny,nx)
	for jx=1:nx
	    for ix=1:ny
	        xout[ix,jx]=xin[jx]
	        yout[ix,jx]=yin[ix]
	    end
	end
	return (x=xout, y=yout)
end

a=3;
b=2;
c=5;
A=[a c/2; c/2 b];

N=6;
ax=range(0,10,length=N);
ay=range(0,10,length=N);
x,y=meshgrid(ax,ay);

fig, (ax1, ax2) = plt.subplots(2, 1, 
	figsize=(8, 8), 
	subplot_kw=Dict("projection" => "3d"))

polyY=a.*x.^2+b.*y.^2+c.*x.*y;
ax1.plot_wireframe(x, y, polyY, rstride=1, cstride=1);

X=[x[:]';y[:]'];
Y=X'*A.*X'*ones(2,1);
matY=reshape(Y,N,N);

ax2.plot_wireframe(x, y, matY);

plt.tight_layout()
plt.show()

polyY
matY

実行結果

フクさん
フクさん

実行結果は以下になる。

二次形式の多項式表現と行列表現の計算(Julia)
polyY
6×6 Matrix{Float64}:
   0.0   12.0   48.0  108.0  192.0   300.0
   8.0   40.0   96.0  176.0  280.0   408.0
  32.0   84.0  160.0  260.0  384.0   532.0
  72.0  144.0  240.0  360.0  504.0   672.0
 128.0  220.0  336.0  476.0  640.0   828.0
 200.0  312.0  448.0  608.0  792.0  1000.0

matY
6×6 Matrix{Float64}:
   0.0   12.0   48.0  108.0  192.0   300.0
   8.0   40.0   96.0  176.0  280.0   408.0
  32.0   84.0  160.0  260.0  384.0   532.0
  72.0  144.0  240.0  360.0  504.0   672.0
 128.0  220.0  336.0  476.0  640.0   828.0
 200.0  312.0  448.0  608.0  792.0  1000.0

考察

太郎くん
太郎くん

二次形式の多項式表現と、行列表現に差異がないことは確認できたね。

太郎くん
太郎くん

しかし、これは、MATLABとPythonを混ぜたような感じになったねぇ。

フクさん
フクさん

演算部分は、MATLABと同じだが、
グラフの描画がPyPlotを使ってる影響でPythonふぅだな。
PyPlot自体はpythonで使用したmatplotlibのラッパーだから、そうなるのだろう。

太郎くん
太郎くん

あと、meshgridを自作している?

フクさん
フクさん

類似関数が無いか探したのだけど、見つからず、結果自作した。

太郎くん
太郎くん

そういうこともあるのかー。

フクさん
フクさん

もしかしたらmeshgridを使うのとは別の平面座標生成方法がJuliaのセオリーとしてあるのかもしれないが、
ちょっと見つけられなかったな。

太郎くん
太郎くん

まぁ、ツール、言語毎のポリシーってあるそうだもんねー。

まとめ

フクさん
フクさん

まとめだよ。

  • 二次形式の多項式表現と行列表現の計算をJuliaで実施。
  • 3Dグラフを表示する際は、”projection” => “3d”が必要。
  • meshgridが無いので自作した。

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

コメント

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