「Python」カテゴリーアーカイブ

【数学】【PYTHON】逆行列を使って連立方程式の解を求める。

【数学】【PYTHON】行列の逆行列を求める。 | 自分、ぼっちですが何か? (taki-lab.site)

5x + 3y = 9
2x + y = 4

という連立方程式があった場合、

行列を使って以下の様に書き換えることができます。

これを左辺の逆行列を掛け合わせると、

となり、これを計算することによって、解を求めることができます。

>>> import numpy as np
>>> A = np.matrix([[5, 3], [2, 1]])
>>> inv_A = np.linalg.inv(A)
>>> B = np.matrix([[9], [4]])
>>> inv_A * B
matrix([[ 3.],
        [-2.]])
>>>

【数学】【PYTHON】行列の逆行列を求める。

【数学】【PYTHON】行列のかけ算を行う | 自分、ぼっちですが何か? (taki-lab.site)

逆行列とは、元の行列にかけ算を行うと、単位行列にる行列のことです。

Pythonでは、linalg.inv()の関数を使用すると、一瞬で計算できます。

>>> import numpy as np
>>> A = np.matrix([[5, 3], [2, 1]])
>>> B = np.linalg.inv(A)
>>> B
matrix([[-1.,  3.],
        [ 2., -5.]])

で、試しにA×Bを計算して単位行列になるかどうかを計算してみたんですが、

>>> (A * B).astype(np.int64)
matrix([[1, 0],
        [0, 0]])

ん?

単位行列なら右下が1になるはずなんだが?

astype(np.int64)とは、inv()を計算すると、出力が浮動小数になるため、整数に変換する関数なんですが、

ちなみに、astype(np.int64)を取り除くと、

>>> (A * B)
matrix([[ 1.00000000e+00, -8.88178420e-16],
        [ 2.22044605e-16,  1.00000000e+00]])

e-16は小さい値なので、整数化するとほぼ0ですが、

右下はどうみても1ですね。

???

【数学】【PYTHON】行列のかけ算を行う

【数学】【PYTHON】行列の足し算・引き算を行う | 自分、ぼっちですが何か? (taki-lab.site)

行列のかけ算もnumpyのmatrix()を使えば簡単にできます。

実数倍のかけ算

>>> import numpy as np
>>> A = np.matrix([[80, 140], [30, 25]])
>>> 0.8 * A
matrix([[ 64., 112.],
        [ 24.,  20.]])

これは単純に各要素を実数倍する計算結果。

行列同士のかけ算

>>> A = np.matrix([[1, 3], [2, 1]])
>>> B = np.matrix([[150, 250], [130, 230]])
>>> A * B
matrix([[540, 940],
        [430, 730]])

行列同士のかけ算は、特殊な(めんどくさい)計算が必要になるのですが、

numpyを使えば簡単に計算してくれます。

【数学】【PYTHON】行列の足し算・引き算を行う

【数学】【PYTHON】法線ベクトル(ベクトルの外積)を求める | 自分、ぼっちですが何か? (taki-lab.site)

NumPyのmatrix()を使用すれば、行列も簡単に扱うことができるようになります。

たとえば、こんな行列の計算を行う場合、

>>> import numpy as np
>>> A = np.matrix([[50, 40],[10, 10]])
>>> B = np.matrix([[30, 100],[20, 15]])
>>> A+B
matrix([[ 80, 140],
        [ 30,  25]])

【数学】【PYTHON】法線ベクトル(ベクトルの外積)を求める

法線ベクトルとは、2つのベクトルから計算されるベクトルで、

その向きは2つのベクトルの表現される面とは垂直のベクトルとなり、

その向きは「右ねじの法則」と呼ばれる法則によって決まります。

>>> import numpy as np
>>> a = np.array([0, 1, 2])
>>> b = np.array([2, 0, 0])
>>> np.cross(a, b)
array([ 0,  4, -2])

法線ベクトルの計算はcross()関数で求めることができます。

便利。

法線ベクトルはCGの世界では、法線ベクトルと光りのベクトルによって、

画面に表示する色や明るさなどを計算するのに使用されます。

【数学】【PYTHON】2つのベクトルのなす角度を求める。

この公式で求めることができます。

このケースを解いてみると、

>>> import math
>>> import numpy as np
>>> a = np.array([2,7])
>>> b = np.array([6,1])
>>> c = np.array([2,3])
>>> d = np.array([6,5])
>>>
>>> va = b - a
>>> vb = d - c
>>>
>>> norm_a = np.linalg.norm(va)
>>> norm_b = np.linalg.norm(vb)
>>>
>>> dot_ab = np.dot(va, vb)
>>>
>>> cos_th = dot_ab / (norm_a * norm_b)
>>> rad = math.acos(cos_th)
>>> deg = math.degrees(rad)
>>> print(deg)
82.8749836510982
>>>

変数a,b,c,dは各座標の値を示しています。

va,vbはベクトルの成分を計算しています。

引き算で計算できるのは便利。

np.linalg.norm()でベクトルの大きさを求めています。

ベクトルの各成分を2乗した和の平方根を計算してくれます。

np.dot()はベクトルの内積を求めています。

cos_thには上の公式を使用した計算結果が入ります。

これをcosの逆関数を計算し、ラジアンを角度に変換すると、

およそ83度という計算結果となります。

【数学】【PYTHON】ベクトルの演算

ベクトルの演算を行うときは、成分同士を足したり引いたりして計算するんですが、

Numpyの配列を使えば、そういった演算もライブラリでやってくれます。

便利。

>>> import numpy as np
>>> a = np.array([2, 2])
>>> b = np.array([2, -1])
>>> a+b
array([4, 1])
>>> a-b
array([0, 3])
>>> 2*a
array([4, 4])
>>>

【数学】【PYTHON】ベクトルの方向を求める

ベクトルが示す座標(x,y)からベクトルの角度θを求めます。

計算式は、tanの逆関数を使います。

これをPythonで計算させます。

>>> import math
>>> rad = math.atan2(3,2)
>>> th = math.degrees(rad)
>>> th
56.309932474020215

atan2(x,y)でtanの逆関数の計算結果をラジアンで取得することができます。

ラジアンから角度の変換はdegrees()を使用します。

ベクトルの終端の座標が(3,2)ならば、角度はおよそ56度となります。

【数学】【PYTHON】ヘロンの公式

2ヶ月開いてしまった・・・

ぼちぼち再開していきます。

ヘロンの公式は三角形の3辺の長さから面積を求める公式です。

三角形の三辺の長さをそれぞれa,b,cとすると、計算式は以下になります。

import math

x = [1, 3, 6]
y = [5, 1, 4]

a = math.sqrt((x[1] - x[0])**2 + (y[1] - y[0])**2)
b = math.sqrt((x[2] - x[1])**2 + (y[2] - y[1])**2)
c = math.sqrt((x[2] - x[0])**2 + (y[2] - y[0])**2)
s = (a + b + c) / 2

ans = math.sqrt(s * (s - a) * (s - b) * (s - c))

print(ans)
$ python3 heron_area.py 
8.999999999999996

A(1,5),B(3,1),C(6,4)、a=辺AB,b=辺BC,c=辺ACとすると、

面積はおよそ9となります。

【数学】【PYTHON】点と直線の距離を計算する

点(x1, y1)と直線ax+by+c=0の距離を求める公式は、

で求められます。

数式をWordで書くのめんどくさ。

点(1,6)から直線y=3/4x-1を計算する処理です。

分数を取り払って3x-4y-1=0に変換してます。

>>> import math
>>> x = 1
>>> y = 6
>>> a = 3
>>> b = -4
>>> c = -4
>>> math.fabs(a*x + b*y + c) / math.sqrt(a**2 + b**2)
5.0