バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia2-backnumber/
はじめに
正規方程式を導出するまでの説明。
今回は二次形式の多項式表現と行列表現の計算をMATLABで実施する。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ロードマップおよび数式【再掲】
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
現在の場所としては二次形式。
![正規方程式に至る道、二次形式、対称行列、二次形式の微分、グラム行列、二乗和誤差、正規方程式](https://www.simulationroom999.com/blog/wp-content/uploads/2023/03/02_正規方程式に至る道-1024x313.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
MATLABで二次形式の多項式表現と行列表現の計算をしてみる回だね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そして、行列表現の数式も再掲しておく。
\(
x^TA\circ x^T
\begin{bmatrix}
1\\
\vdots\\
1
\end{bmatrix}
\)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
この数式に対して、多項式表現と行列表現の計算をしてみることになる。
\(
3x^2+2y^2+5xy
\)
MATLABコード
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
MATLABコードは以下になる。
a=3;
b=2;
c=5;
A=[a c/2; c/2 b];
N=6;
ax=linspace(0,10,N);
ay=linspace(0,10,N);
[x,y]=meshgrid(ax,ay);
subplot(2,1,1);
polyY=a.*x.^2+b.*y.^2+c.*x.*y;
mesh(ax, ay, polyY);
X=[x(:)';y(:)'];
Y=X'*A.*X'*ones(2,1);;
matY=reshape(Y,N,N);
subplot(2,1,2);
mesh(ax, ay, matY);
polyY
matY
実行結果
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
実行結果は以下となる。
![二次形式の多項式表現と行列表現の計算(MATLAB)](https://www.simulationroom999.com/blog/wp-content/uploads/2023/03/02_二次形式の多項式表現と行列表現の計算MATLAB.png)
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
考察
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
まぁ数式通りに計算したってことだね。
二次形式の多項式表現、行列表現で同じ結果になったのもわかる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
入力が\(x,y\)のに変数だから、meshgridで平面座標を生成してる感じか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
そうそう。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
meshgridはx軸とy軸を入力すると、その範囲に於いての平面座標を生成してくれる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
3次元グラフはmeshという関数で実現してる感じか。
さほど手間がかかる感じではないね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
この手の処理はMATLABが一番癖が無くて扱いやすいな。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- 二次形式の多項式表現と行列表現の計算をMATLABで実施。
- meshgridにx軸とy軸を入力とすることで平面座標が得られる。
- 平面座標を元に2変数の演算を実施。
- 演算結果をmesh関数を使用して3Dグラフに表示。
バックナンバーはこちら。
コメント