【Python】微分:平均変化率と微分係数を求める

■平均変化率

微分とは、曲線状のある1点における傾きを求めることである。
傾きは、平均変化率(変化の割合)という。
※xが1増加したときのyの増加量(変化量)

関数 y = f(x) において、xがaからbまで変化した時、平均変化率は以下の式で求める。

■微分係数

関数 y = f(x) において、xがaからbまで変化した時、平均変化率(変化の割合)を求める時、bの値を限りなくaに近づげていく(xの増加量を限りなく小さくしていく)と、曲線上にある1点の傾きを求めることができる。
x = a における平均変化率を求めることを微分係数を求めるといい、f'(a)と表す。

f'(a)とは、点(a, f(a))における接戦の傾きである。

■例題

関数f(x)=x2+xについて、以下の3問をPythonを使用して解く。

問題1
xが1から2まで変化する時の平均変化率を求める。

問題2
x = 1における微分係数f'(1)を求める。

問題3
f(x)とA(1,f(1))を通るf(x)の接線をグラフに図示

■サンプルコード

# -*- Coding:UTF-8 -*-
import sympy
import numpy as np
from matplotlib import pyplot as plt


# f(x)=x**2 + xの値を求める関数
def f(x):
    y = x**2 + x

    return y


# 平均変化率を求める関数
def henkaritsu(a, b):

    # 平均変化率を求める
    result = (f(b) - f(a)) / (b - a)

    # 計算結果を返す
    return result


# 微分係数を求める関数
def f_(a):
    # 文字列をセット
    h = sympy.Symbol('h')

    # 微分係数を求める
    result = sympy.limit((f(a+h)-f(a))/h, h, 0)

    # 計算結果を返す
    return result


# グラフ作成関数
def MakeGraph(sessen_katamuki, sessen_seppen):
    # 便宜上、-5から5までの値を0.1間隔で設定
    x_min = -5
    x_max = 5
    x_interval = 0.1
    x = np.arange(x_min, x_max, x_interval)

    # 関数f(x)を格納する配列
    y1 = []
    # 接線のyの値を格納する配列
    y2 = []

    # それぞれ配列に格納していく(便宜上、nは0.1間隔でセット)
    for i in range(len(x)):
        y1.append(f(x[i]))
        y2.append((sessen_katamuki * x[i]) + sessen_seppen)

    # 関数f(x)のグラフを作成
    plt.plot(x, y1)
    # 接線のグラフを作成
    plt.plot(x, y2)

    # グラフにx軸,y軸(0)を図示
    # 補助線(0)を作成 [axhline:水平 axvline:垂直]
    plt.axhline(y=0, color="gray")
    plt.axvline(x=0, color="gray")

    # グラフを表示
    plt.show()


# メイン処理
if __name__ == '__main__':

    # 問題1:xが1から2まで変化する時の平均変化率を求める
    ans1 = henkaritsu(1, 2)
    print('問題1:', ans1)

    # 問題2:x=1における微分係数f'(1)を求める
    ans2 = f_(1)
    print('問題2:', ans2)

    # 問題3:f(x)とA(1,f(1))を通るf(x)の接線をグラフに図示
    # 接線の傾き(a)は問題2の値
    sessen_a = ans2
    # 接線の切片(b)を求める(y = ax + b)
    sessen_b = f(1) - sessen_a * 1
    # グラフの作成
    print('問題3')
    print('接線:y = ', sessen_a, 'x + (', sessen_b, ')')
    MakeGraph(sessen_a, sessen_b)

■実行結果

問題1: 4.0
問題2: 3
問題3
接線:y =  3 x + ( -1 )
タイトルとURLをコピーしました