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

【数学】【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すげぇ。

【数学】【PYTHON】いろいろな関数のグラフを表示する

もっと複雑なグラフを描画するには、もっと細かい単位でxの値を変化させなければなりません。

なので、pythonのnumpyライブラリを使用します。

import matplotlib.pyplot as plt
import numpy as np

def func1(x):
    return 3 * x

x = np.arange(-1.0, 1.01, 0.01)
y = func1(x)

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

npを使用するもう一つのメリットは、yの計算にfor文を使用する必要がなく、

1行で書くことができるということです。

なるほど、pythonが支持される理由はここにあるかもしれない。

【数学】【PYTHON】簡単な関数のグラフを表示する

こちらのコードを元に、簡単な関数のグラフを書いてみます。

今回はテキストにあるように、y=3x-24のグラフを表示させてみます。

import matplotlib.pyplot as plt

def func1(x):
    return 3 * x - 24

x = list(range(1,11))
y = []
for i in range(10):
    y.append(func1(x[i]))

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

簡単な関数(一次関数)ていどならこのコードでも問題無いですが、

二次関数とかになると、きれいなグラフを書くのは難しいです。

次回はそのようなグラフも書けるようにしてみます。

【数学】【PYTHON】グラフを表示する

今回から新しい章に入ります。

関数をグラフに表示しようってやつ。

まずは、グラフを表示するライブラリを使えるようにします。

matplotlibというモジュールを使用します。

$ sudo apt-get install python3-matplotlib
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7]
y = [64.3, 63.8, 63.6, 64.0, 63.5, 63.2, 63.1]

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

【数学】【PYTHON】10進数に変換する

これも

>>> int('0b11010', 2)
26
>>> int('0x1A', 16)
26

のようにint関数で計算してくれるのですが、

これもコードで書きます。

import sys
import re

args = sys.argv

def aby2dec(target, m):
    n = len(target) - 1
    sum = 0

    for i in range(len(target)):
        alpha_search_result = re.search('[A-F]', target[i])
        if alpha_search_result:
            num = ord(alpha_search_result.group()) - 55
        else:
            num = int(target[i])
        sum += (m ** n) * num
        n -= 1
    return sum

print(aby2dec(args[1], int(args[2])))

サンプルコードでは[A-F]をif文でベタ書きしていたのですが、

ここでは正規表現とASCIIコードで取得するようにしました。

演算子**で階乗計算できるんですね。

【数学】【PYTHON】10進数を16進数に変換する

こちらも同じようにhex(26)を実行すれば’0x1a’を出力されますが、

これをPythonのコードで書きます。

import sys

args = sys.argv

def dec2hex(target):
    division = target
    hex = []

    while division != 0:
        remainder_of = division % 16
        division = division // 16
        if remainder_of >= 10:
            hex.append(chr(55 + remainder_of))
        else:
            hex.append(remainder_of)

    hex.reverse()
    return hex

print(dec2hex(int(args[1])))
taki@DESKTOP-4VF3GEO:~/python$ python dec2hex.py 26
[1, 'A']

こちらもサンプルでは[A-F]を愚直にif文で書いていますが、

AはASCIIコードで65(0x41)なので、55に余りを足してchrで変換することで[A-F]に変換しています。

【数学】【Python】10進数を2進数に変換する

Pythonだったら

taki@DESKTOP-4VF3GEO:~/python$ python
Python 2.7.18 (default, Mar  8 2021, 13:02:45) 
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bin(26)
'0b11010'
>>> 

という感じで変換出来るんですが、あえてロジックで組んでみます。

import sys

args = sys.argv

print(args)
def dec2bin(target):
    division = target
    amari = []

    while division != 0:
        amari.append(division % 2)
        division = division // 2
    
    amari.reverse()
    return amari

print(dec2bin(int(args[1])))

taki@DESKTOP-4VF3GEO:~/python$ python dec2bin.py 26
['dec2bin.py', '26']
[1, 1, 0, 1, 0]

引数をdivisionに置き換えているのは、引数に計算結果を代入するのはよろしくないという考えの元、サンプルコードを書き換えています。