Diary

Diary

日々学んだことをアウトプットする場として初めてみました

python で接線を書く

[目次]

接線とは

実際に接線を描画する前に、正確に定義をしておきましょう。

微分の定義

ここでは PC により数値的に計算するために、極限による微分の定義を用います。

以下にx=aにおける、f(x)微分の値を計算する式を示します。


f ^{'}(a) = \lim _ {x \to a}\frac{f(x+a)-f(x)}{a}

xを微少量変化させた時、微少量と同じオーダーで変化するような係数を(一次)微分と定義していることになります。

以下は微分をコードに起こした例です。

delta_x = 1e-4
derivative = (func(a+delta_x) - func(a)) / delta_x

数値計算においては、極限の定義として上のように微小量を使うことが多いです(妥当かどうかは別途判断が必要)。

接線の定義

x=aにおける、f(x)の接線とは、

傾きがf'(a)x=a,y=f(a)を通る直線

のことであり、数式では以下のように表されます。


y = f ^{'}(a)(x-a) + f(a)

また、接線とは

x=a近傍での関数の近似(テイラー展開)のうち、直線部分のみを残したもの。 つまり、第一次近似である。

であるとも言えます。

以下はx=aにおける接線を返す関数のコード例です。

def tangent(func, x, a):
    delta_x = 1e-4
    derivative = (func(a+delta_x) - func(a)) / delta_x
    return derivative * (x - a) + func(a)

python で実装する

import matplotlib.pyplot as plt

def quad_func(x):  # y=x^2-1を表す関数
    y = x**2 - 1
    return y

def tangent(func, x, a):
    delta_x = 1e-4
    derivative = (func(a+delta_x) - func(a)) / delta_x
    return derivative * (x - a) + func(a)

x = np.linspace(-3, 3)
y = quad_func(x)
plt.plot(x, y, label="y", linestyle="dashed")

## x = 2 の時の接線
a = 2
tangent = tangent(quad_func, x, a)
plt.plot(x, tangent, label="tangent")

## x = 2 の点も描画しておく
plt.scatter(a, quad_func(a))

plt.legend()

plt.xlabel("x", size=14)
plt.ylabel("y", size=14)
plt.grid()

plt.xlim([-3, 3])
plt.ylim([-3, 10])

plt.show()

f:id:kokoichi206:20210820050915p:plain

おまけ

各点における接線を集めると、以下のように放物線の下半分を覆い尽くして面白いです(下に凸だから?)。

f:id:kokoichi206:20210820043607p:plain

おわりに

VSCode で notebook を使ってみましたが、思ったよりも使いやすくて良かったです。