しろねこらぼ(旧)

しろねこの気まぐれ技術日記

二次元平面上に置かれた二点間の距離を求める

二次元平面上に置かれた二点p_{1}(x_{1},y_{1}),p_{2}(x_{2},y_{2}) 間の距離d(p_{1},p_{2})
\begin{align}
d(p_{1},p_{2})=\sqrt{(x_{2}-x_{1})^2+(y_{2}-y_{1})^2}
\end{align}
で与えられる。カレントディレクトリに

function d =distance(P1,P2)
  d=sqrt((P2(1,1)-P1(1,1))^2+P2(1,2)-P1(1,2)^2);
end

としたm-ファイルを置き、main.mで

P1=[1,1];
P2=[2,2];
distance(P1,P2)

とすれば計算してくれる。

巡回セールスマン問題がおもしろそうなのでmatlabでシミュレーションしてみる #1

巡回セールスマン問題とは、あるセールスマンが複数の都市を訪れるとき、どのような順番で巡回すれば最も効果的(時間、移動距離、交通費等)かを解くグラフ理論の有名な問題の一つである。
この問題の難しい点は巡回する都市の数が多くなると計算量が爆発的に増えてしまい、コンピュータを用いての解析でさえ困難にしてしまう点にある。

今回は少ない有限の都市(以降ノード)を定義し、その点列について巡回セールスマン問題を考えていきたいと思う。
とりあえず次のプログラムでノードを設定することにする。

min=3;
max=10;
num=[min,max];
X=[-10,10];
Y=[-10,10];

A=randi(num);

point=zeros(A,2);

for i=1:1:length(point)
    point(i,:)=[randi(X),randi(Y)];
end

B=randi([1,A]);

startpoint=point(B,:);

都市といっても座標さえ与えてあればいいと思うのでこれで。
このプログラムは3~10個の整数の乱数を生成する。巡回セールスマン問題を解く上で都市(point)が10個もポイントがあれば十分だろう。
始点(startpoint)も乱数で与えられる。次回は組み合わせの個数を計算してみようと思う。

位相空間の定義を眺める

集合Sに対し,部分集合の族\mathcal{O}が次の条件
\begin{align}
S \in \mathcal{O} ,\phi \in \mathcal{O}\\
U_{1} , \cdots , U_{m} \in \mathcal{O} \Rightarrow \bigcap_{k=1}^{m} U_{k} \in \mathcal{O}\\
U_{\lambda} \in \mathcal{O} (\forall \lambda \in \Lambda) \Rightarrow \bigcup_{\lambda \in \Lambda} U_{\lambda} \in \mathcal{O}
\end{align}
を満たしているとき、\mathcal{O}Sの位相という。 また、位相の定められた集合の組み(X,\mathcal{O})位相空間という。

さて・・・これが何に使えるか・・・

プラトンの多面体定理をオイラーの多面体定理を使わずに証明する

n角形の内角の和は
\begin{align}
\pi (n-2)
\end{align}
より、一つの角は
\begin{align}
\frac{\pi (n-2)}{n}
\end{align}
となる。
ここで、正多角形をいくつか張り合わせ立体を作ることを考える。いくつか張り合わせ立体にするためには平面にならないよう2 \pi より小さくしなければならないので
\begin{align}
\frac{ \pi (n-2)}{n} x < 2 \pi
\end{align}
これを整理すれば
\begin{align}
(n-2)(x-2) < 4
\end{align}
よりこれを満たすものは
\begin{align}
(n,x)=(3,3),(3,4),(3,5),(4,3),(5,3)
\end{align}
これらはそれぞれ、正四面体、正八面体、正二十面体、正六面体、正十二面体に対応している。

pythonで記述した関数を別ファイルに記述し直してimportする

いつも忘れるのでまとめておく。
pythonのバージョンはpython3.7を利用している。

始めに次のようなコードを考える。

print('Hello! python')

これを関数化して別ファイルに移せば

import greeting
greeting.helloworld()

def helloworld():
    print('Hello! python')

これで同様な結果を得ることができる。
ここで、greeting.pyを

def helloworld():
    print('Hello! python')
def hey():
    print('hey')
def hello():
    print('hello')

のように変更する。main.pyでの呼び出しをfrom-importに変更すれば

from greeting import hey
hey()

のように関数呼び出しをすることができるようになる。

異なるブロック線図で表されるシステム同士を等価変換する条件を求める

下図で示すようなシステムの伝達関数を考える。
f:id:sironekoblog:20210224065150j:plain
まず、このシステムの伝達関数W_{1}(s)
\begin{align}
W_{1}(s)=\dfrac{G(s)}{1+G(s)H(s)}
\end{align}
で表すことができる。

ここで次のような別のシステムについて考える。
f:id:sironekoblog:20210224065205j:plain
\begin{align}
W_{2}(s)=\dfrac{G_{1}(s) G_{2}(s)}{1+G_{2}(s)H'(s)+G_{1}(s)G_{2}(s) }
\end{align}
ここでG(s),H(s)
\begin{align}
G(s)&=G_{1}(s) G_{2}(s)\\
H(s)&=1+\dfrac{H'(s)}{G_{1}(s)}
\end{align}
であれば伝達関数
\begin{align}
W_{2}(s)=\dfrac{G(s)}{1+G(s)H(s)}
\end{align}
となり、W_{1}(s),W_{2}(s)は等価となる。