damyarou

python, GMT などのプログラム

2点を通る直線、2直線の交点、3点を通る円、2点を通る円 (2021.09.25)

2点を通る直線

2点 (x_1,y_1) および (x_2,y_2) を通る直線 y=a\cdot x+b を求める


\begin{equation}
a=\cfrac{y_2-y_1}{x_2-x_1} \qquad b=\cfrac{x_2 y_1 - x_1 y_2}{x_2-x_1}
\end{equation}

2直線の交点

2直線 y=a\cdot x+b および y=c\cdot x+d の交点を求める


\begin{equation}
(x,y)=\left(\cfrac{d-b}{a-c}, \cfrac{a d - b c}{a-c}\right)
\end{equation}

最小自乗回帰

直線 y=a\cdot x + b の回帰係数と相関係数


\begin{equation}
a=\cfrac{n\cdot\sum(x_i\cdot y_i)-\sum x_i\cdot \sum y_i}{n\cdot\sum x_i{}^2-\left(\sum x_i\right)^2} 
\end{equation}

\begin{equation}
b=\cfrac{\sum x_i{}^2\cdot \sum y_i-\sum(x_i\cdot y_i)\cdot \sum x_i}{n\cdot\sum x_i{}^2-\left(\sum x_i\right)^2} 
\end{equation}

\begin{equation}
r=\cfrac{\sum(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum(x_i-\bar{x})^2}\cdot\sqrt{\sum(y_i-\bar{y})^2}}
\end{equation}

3点を通る円

3点 (x_1,y_1)(x_2,y_2) および (x_2,y_2) を通る¥の方程式を求める。 ¥の方程式を


\begin{equation}
x^2+y^2+a x+b y+c=0
\end{equation}

とおけば、


\begin{align}
& a x_1 + b y_1 + c = -x_1{}^2-y_1{}^2 \\
& a x_2 + b y_2 + c = -x_2{}^2-y_2{}^2 \\
& a x_3 + b y_3 + c = -x_3{}^2-y_3{}^2
\end{align}

となり、以下の連立方程式を解くことにより、定数 a, b, c が求まる。


\begin{equation}
\begin{bmatrix}
x_1 & y_1 & 1 \\
x_2 & y_2 & 1 \\
x_3 & y_3 & 1
\end{bmatrix}
\begin{Bmatrix}
a \\
b \\
c
\end{Bmatrix}
=
\begin{Bmatrix}
-x_1{}^2-y_1{}^2 \\
-x_2{}^2-y_2{}^2 \\
-x_3{}^2-y_3{}^2
\end{Bmatrix}
\end{equation}

ここで、円の方程式を以下のように置き換えれば、


\begin{equation}
(x-A)^2+(y-B)^2=r^2
\end{equation}

中心座標 (A, B) および半径 r は以下の通り表される。


\begin{equation}
A=-\cfrac{a}{2} \qquad B=-\cfrac{b}{2} \qquad 
r=\sqrt{\cfrac{a^2}{4}+\cfrac{b^2}{4}-c}
\end{equation}

2点を通る円(2直線に接する円)

2点(x_1, y_1)および(x_2, y_2)を通る円の方程式を求める。 求める円の方程式を以下の通りおく。


\begin{equation}
(x-x_c)^2+(y-y_c)^2=r_c{}^2
\end{equation}

f:id:damyarou:20211003123324j:plain:w400

円は、点(x_1, y_1)で直線 I: y=a\cdot x+b に接し、かつ、点(x_2, y_2)で直線 II: y=c\cdot x+d に接するとする。

(x_1, y_1)で直線 I に直交する直線 I': y=A \cdot x+B とすれば、直線の直交条件より、


\begin{equation}
a\times A=-1 \qquad y_1=-\cfrac{1}{a}\cdot x+B \qquad B=y_1+\cfrac{x_1}{a}
\end{equation}

よって、直線 I' は


\begin{equation}
y=-\cfrac{1}{a}\cdot x+y_1+\cfrac{x_1}{a}=A\cdot x+B
\end{equation}

同様に、点(x_2, y_2)で直線 II に直交する直線 II': y=C \cdot x+D とすれば


\begin{equation}
y=-\cfrac{1}{c}\cdot x+y_2+\cfrac{x_2}{c}=C\cdot x+D
\end{equation}

円の中心(x_c, y_c)は、直線 I'と直線II' の交点であるため、


\begin{equation}
(x_c, y_c)=\left(\cfrac{D-B}{A-C}, \cfrac{A D - B C}{A-C}\right)
\end{equation}

ここに、


\begin{align}
&A-C=\cfrac{1}{c}-\cfrac{1}{a} \\
&D-B=y_2+\cfrac{x_2}{c}-\left(y_1+\cfrac{x_1}{a}\right) \\
&A D-B C=-\cfrac{1}{a}\left(y_2+\cfrac{x_2}{c}\right)+\cfrac{1}{c}\left(y_1+\cfrac{x_1}{a}\right)
\end{align}

ここで、直線 II: y=c\cdot x+d を既知とすれば、未知数はaのみとなるため、a を試行的に変化させながら、円の中心(x_c, y_c)を求め、中心から、点(x_1, y_1)および点(x_2, y_2)までの距離が等しくなる条件


\begin{equation}
(x_1-x_c)^2+(y_1-y_c)^2=(x_2-x_c)^2+(y_2-y_c)^2
\end{equation}

を満足するまで繰り返す。

上記により円の中心(x_c, y_c)が求まれば、半径は


\begin{equation}
r_c=\sqrt{(x_1-x_c)^2+(y_1-y_c)^2}
\end{equation}

として求まる。

与えられた点を通る回帰直線

与えられた点 (x_0, y_0) を通る回帰直線 y=a\cdot x+b を求める。 求めたい直線は、点 (x_0, y_0) を通るため、


\begin{equation}
y_0=a\cdot x_0+b \rightarrow b=y_0-a\cdot x_0
\end{equation}

よって、未知数は a のみとなる。

直線回帰したい複数個のデータの組を、(x_i, y_i) とすれば、各点から直線までの距離は


\begin{gather}
d_i=(y_i-y_0)-a(x_i-x_0) \rightarrow d_i{}^2=a^2(x_i-x_0)^2-2a(y_i-y_0)(x_i-x_0)+(y_i-y_0)^2\\
 D=\sum d_i{}^2=a^2\sum (x_i-x_0)^2-2a\sum(y_i-y_0)(x_i-x_0)+\sum(y_i-y_0)^2
\end{gather}

最小二乗法の条件より


\begin{gather}
\cfrac{dD}{da}=a\sum (x_i-x_0)^2-\sum(y_i-y_0)(x_i-x_0)=0
\end{gather}

よって


\begin{gather}
a=\cfrac{\sum (y_i-y_0)(x_i-x_0)}{\sum (x_i-x_0)^2} \qquad b=y_0-a\cdot x_0
\end{gather}

以 上