[python]算数・数学①~関数と方程式~ 

# はじめに
機械学習を始めるにも、算数や数学がわからないと、入門書すら読めない。ただそこまで、ちゃんと解説してあるものもない。ということで最低限必要な数学基礎をこの記事で書けたらいいなと思っています。

# 環境
ほぼ影響ないですが、python3系を利用。

# 前提
四則演算や累乗（2乗とか3乗とか）がわかっていること。

# 関数

## 一次関数(一次方程式)

こういうやつのこと。aとかbを係数と言います。
$y=ax+b$

以下で適当に$y=4x+3$の関数を作ってみます。

```py
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(0,11)
y = 4*x+3
plt.plot(x,y)
plt.grid()
```
<img width="300" alt="スクリーンショット 2019-07-12 0.13.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/86a07265-c682-07a0-db11-4390d03e3d1c.png">

この方程式は、xが１進むときにyは４進んでいる。つまり

$
\frac{yの変化量}{xの変化量}
$
$
\frac{4}{1}=4
$

つまり$4x+3$の4は**傾き**を表している。またxが0の時はyは3になり、これを**切片**と呼ぶ。



## 二次関数(二次方程式)

こういうやつのこと。同様にaとかbを係数と言います。
$ax^2+bx+c$
この中では最高次数が２次になっています（xの二乗のこと）。
※bxとかcとかがない場合も当然あります。

一番シンプルな$y=x^2$を書いてみます。

```py
x = np.arange(-1.0,1.01,0.01)
y = x**2
plt.plot(x,y)
plt.grid()
```
<img width="326" alt="スクリーンショット 2019-07-12 0.20.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/6a99a8dc-cb42-7dee-5347-ece5de1119ce.png">

## ついでに三次関数(三次方程式)

こういうやつのこと。
$ax^3+bx^2+cx+d$
この中では最高次数が3次になっています（xの三乗のこと）。

一番シンプルな$y=x^3$を書いてみます。
後々微分のところの例でたくさん出てくる図。

```py
x = np.arange(-1.0,1.01,0.01)
y = x**3
plt.plot(x,y)
plt.grid()
```
<img width="342" alt="スクリーンショット 2019-07-12 0.22.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/fc2b5daa-ab00-23a2-6206-f2d514e0d465.png">

# 連立方程式

人によってはご無沙汰な連立方程式。
例えば、下記グラフ上の赤い２点(3,6)(4,12)を通る直線を求めるときにどうすればいいでしょうか。

<img width="319" alt="スクリーンショット 2019-07-12 0.34.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/a7825de9-6fa4-11bc-47f7-a1695ff2a127.png">

考え方は簡単です。
・ x=3の時にy=６
・ x=4の時にy=12
なので
$6=3a+b$
$12=4a+b$
の共通のa,bを見つければいいだけです。

## 計算

まずはbを消したいので、上の式から下の式を引きます。するとaが残ります。

　$　6=3a+b$
-)$12=4a+b$
ーーーーーーーー
　$-6=-a$　　→　　$　a =6$

あとはa=6を$6=3a+b$に代入すれば、b=-12ということが求められます。
つまり２点を通る直線は$y=6x-12$ということがわかりました。

## コードで書く

```py
from sympy import Symbol,solve
a = Symbol("a")#aを記号として扱う(通常int型とstr型は一緒に計算できない)
b = Symbol("b")#bを記号として扱う(通常int型とstr型は一緒に計算できない)
ex1 = 3*a + b - 6
ex2 = 4*a + b - 12
ans = solve((ex1,ex2))
print(ans[a],ans[b])   #  -> 6 -12
```

グラフで書くとこうなる。

```py
x = np.arange(-1,10,1)
y = 6*x-12
plt.plot(x,y)
plt.plot(4,12,marker="x",color="red")
plt.plot(3,6,marker="x",color="red")
plt.grid()
plt.show()
```
(※さっきと大きさが違うけど、点の位置は一緒)
<img width="306" alt="スクリーンショット 2019-07-12 0.52.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/ea06d23d-a767-1302-e6ef-531270fdac7b.png">

## ちなみに並行する線

切片をずらせば並行する線になる

```py
x = np.arange(-1,10,1)
y = 6*x-12
y_pal = 6*x-7
plt.plot(x,y)
plt.plot(x,y_pal)
plt.plot(3,6,marker="x",color="red")
plt.plot(4,12,marker="x",color="red")
plt.grid()
plt.show()
```

<img width="316" alt="スクリーンショット 2019-07-12 20.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/44961f3b-dec0-6b35-e809-338547565f7c.png">


## ちなみに直交する線

傾きに掛けて−1になる数値を求める。(3,6)の位置を通る線だとすると（ここはなんでもいいけど、もともと指定されている点を使う。）

$a \times {a_{new}} = -1$
$6 \times {a_{new}} = -1$
$6 \times {a_{new}}\div6 = -1\div6$
${a_{new}} = -\frac{1}{6}$

さらに切片も求める。(3,6)の位置で交わるので

$6 = 3\times{-\frac{1}{6}} + b$
$b = \frac{13}{2} $

つまり

$y = -\frac{1}{6}+\frac{13}{2}$

が(3,6)の位置を通る直交する線ということになります。

```py
x = np.arange(-10,10,1)
y = 6*x-12
y_orth = -1/6*x+13/2
plt.plot(x,y_orth)
plt.plot(x,y)
plt.plot(3,6,marker="x",color="red")
plt.plot(4,12,marker="x",color="red")
plt.axis('equal')
plt.grid()
plt.show()
```
※plt.axis('equal')をつけないと自動調整されて、直交にならないので注意

<img width="312" alt="スクリーンショット 2019-07-12 1.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/166e69e8-c872-67a7-abc6-362b6e279d27.png">

## ちなみに２つの線の交わる点を求めるには

さっきの（3,6）を求めるのは、２つの線の連立方程式を解くだけです。

```py
x = np.arange(-1,10,1)
y1 = 6*x-12
y2 = -1/6*x+13/2
plt.plot(x,y1)
plt.plot(x,y2)
plt.axis('equal')
plt.grid()
plt.show()

x = Symbol("x")
y = Symbol("y")
ex1 = 6*x-12 - y
ex2 = -1/6*x+13/2 - y
solve((ex1,ex2))
```
<img width="301" alt="スクリーンショット 2019-07-12 20.24.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241505/438301b9-5593-9e4d-8ebb-15d1a8601acd.png">

## 追記）比例

比例式とはとは　$1:60=5:x$　みたいなやつです。
外項(一番左と一番右)を掛けたものと内項（内側の二つ）を掛けたものが等しくなります。

つまり
$ 1\times x = 60 \times 5 $
$ x = 300 $
みたいになります。

なぜ比例式をここに追記したのかでいうと、「線分」という考え方があるからです。

## 線分とは

**２点を結ぶ**直線のことを「線分」と言い、**どこまでも伸びる**ものは「直線」と言います。その線分をm:nの長さに分けるものを「内分点」と言います。

例えば、
ある点をx1,もう一つをx２とする線分の中に、線分をm：nに分割するxという内分点を作ったとすると、
$x-x1:x2-x = m:n$
となり、上記の性質に従うと
$(x-x1)n = (x2-x)m$
と変形をし、これをxについて解くと
$x = \frac{mx2+nx1}{m+n}$
というようになります。

そしてm：nが同じ、つまり線分を半分ずつに分ける点を「中点」と言います。※当然yも同様に計算できます。

$x = \frac{x2+x1}{2}$
$y = \frac{y2+y1}{2}$

これに実際の座標を入れるだけで、中点を求めることができます。
さらに中点を通る直交する線を「垂直二等分線」と言います。

以下で垂直二等分線の式を求めてみます。
例題は（3,6）,(4,12)という線分にします。

```py
#1.まずは２つの点を通過する線分の式を求める
a = Symbol("a")
b = Symbol("b")
ex1 = 3*a + b -6
ex2 = 4*a +b - 12
ans = solve((ex1,ex2))
print(ans)       ->#{a: 6, b: -12}

#2.次にこの線分の中点を求める
from fractions import Fraction#分数を使う
x_center = Fraction(3+4,2)-> 7/2
y_center = Fraction(6+12,2)-> 9

#3.これに直交する線の傾きを計算する
a_new = Fraction(-1,6)
print(a_new)　     -> -1/6

#3.ついでに切片を計算する
b_new = y_center-a_new*x_center
```

がっちゃんこすると
$y_2 = -\frac{1}{6}x+\frac{115}{12}$
となります。


# ここまで

線形代数でもありますが、「写像fによるxの像はy」みたいな言い方するらしいです。よくわかりませんが。

[次回](https://qiita.com/hiroyuki_mrp/items/d80dfb63a4fcf6cc7510)は平方根や指数・対数について投稿していきます。

#参考
[Sympy+Jupyterで最強の電卓環境を作る](https://qiita.com/pashango2/items/500d23c8f43784b54315#%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%82%92%E8%A7%A3%E3%81%8F)