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

【数学】【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

【数学】【PYTHON】平方根の定理で円を描く

平方根の定理はa^2+b^2=c^2なので、

円の半径rを組み込むと、

y=√r^2-x^2

で求めることができます。

import matplotlib.pyplot as plt
import numpy as np

r = 300
x = np.arange(-r, r + 1)
y = np.sqrt(r**2 - x**2)

#描画
plt.plot(x, y)
plt.axis('equal')
plt.grid(color='0.8')
plt.show()

【数学】【PYTHON】三角関数を使って円を描画する

import matplotlib.pyplot as plt
import numpy as np

#角度
th = np.arange(0, 360)

#円周上の点Pの座標
x = np.cos(np.radians(th))
y = np.sin(np.radians(th))

#描画
plt.plot(x, y)
plt.axis('equal')
plt.grid(color='0.8')
plt.show()

角度0~360に対して

x座標をコサインで、y座標をサインで計算します。

このとき、引数の角度はラジアンで与える必要があります。

【数学】【PYTHON】垂直二等分線を求める

これまでやってきたことを使って、二つの点の線分の中間を垂直に交わる直線を求めます。

例として、(0,1)と(6,5)を結ぶ線分の垂直二等分線を求めてみます。

やり方は、

①線分の傾きを求める

②線分の中点を求める

③線分と直交する直線の傾きを求める

④二つの線の切片を求める

で求めることができるみたいです。

import matplotlib.pyplot as plt
import numpy as np

#元の直線の傾きと切片
a1 = (5-1)/(6-0)
b1 = 1

#線分の中点
cx = (0 + 6) / 2
cy = (1 + 5) / 2

#線分に直交する直線の傾き
a2 = -1 / a1

#線分に直交する直線の切片
b2 = cy - a2 * cx

#直線の式
x = np.arange(0, 7)
y1 = a1*x + b1
y2 = a2*x + b2

plt.plot(x, y1)
plt.plot(x, y2)
plt.axis('equal')
plt.grid(color='0.8')
plt.show()

【数学】【PYTHON】二つの直線の交点を求める

二つの直線の交点を求めるには、

二つの直線の連立方程式を解けば求めることができます。

連立方程式はこちらでやってますね。

例えば、y = -3/2x + 6とy= 1/2x + 2の交点を求めてみました。

from sympy import Symbol, solve

x = Symbol('x')
y = Symbol('y')
ex1 = -3/2*x + 6 - y
ex2 = 1/2*x + 2 - y

print(solve((ex1, ex2)))
:~/python$ python3 simultaneous_equations.py 
{x: 2.00000000000000, y: 3.00000000000000}

【数学】【PYTHON】直線と直交する直線を求める

y=a1x+bとy=a2x+b2の直線があった場合、a1 = a2であれば、平行。

a1 × a2 = -1であれば直交するとのこと。

それを確認するためのグラフ作成です。

この例では、y=1/2x+1/2と直交する直線は、y=-2x+7なので、それを描画します。

from ast import increment_lineno
import matplotlib.pyplot as plt
import numpy as np

def function_y(x):
    return 1 / 2 * x + 1 / 2

def function_y2(x):
    return -2 * x + 7

x = np.arange(-1, 6)
y = function_y(x)
y2 = function_y2(x)

plt.plot(x, y)
plt.plot(x, y2)
plt.axis('equal')
plt.grid(color='0.8')
plt.show()

【数学】【PYTHON】連立方程式を解く

2点を通る直線のグラフを書く、の前に、連立方程式を解くコードを書いてみます。

from sympy import Symbol, solve

a = Symbol('a')
b = Symbol('b')
ex1 = a + b - 1
ex2 = 5 * a + b - 3

print(solve((ex1, ex2)))
:~/python$ python3 simultaneous_equations.py 
{a: 1/2, b: 1/2}

上のコードは1=a + b、3 = 5a + bの解を求めるコードです。

文字a,bをSymbolとして定義することによって、

ex1,ex2に式を設定し、それをsolve()にタプル式として渡します。

そうすると、解が出力されます。

Pythonすげぇ。