関数の微分

2 min read読了の目安(約2000字

はじめに

Swiftで高校数学をコーディングしています。

微分の定義

定点x_0における微分f'(x)は次のように定義される。

f'(x_0)=\lim_{\Delta x \to0}\frac {f(x_0 + \Delta x) - f(x_0)}{\Delta x}

これをクロージャで表現することを試みる。関数と定点を引数にして、一つの値を返すと考えると...

typealias function = (Double) -> Double
typealias defferential = (function,Double)-> Double

functionについては前の記事で書いたもの。

左側微分を行うクロージャの実装

let leftLimitF: (function,Double)-> Double
leftLimitF = { f,x in
    var deltaX = 1.0
    var answer: Double = f(x)
    while deltaX > 0.0001 {
        
        answer = (f(x+deltaX) - f(x))/deltaX
        
        deltaX /= 10
    }
    return answer
}

\Delta x0に近づけるという処理はwhile文の中で一定の数値より小さくなるまで繰り返すことで再現している。

その中で何度もanswerを更新している。

typealias function = (Double) -> Double
typealias defferential = (function,Double)-> Double

let f: function
let leftLimitF: (function,Double)-> Double

f = { x in
    x*x+2
}

leftLimitF = { f,x in
    var deltaX = 1.0
    var answer: Double = f(x)
    while deltaX > 0.0001 {
        
        answer = (f(x+deltaX) - f(x))/deltaX
        
        deltaX /= 10
    }
    return answer
}

leftLimitF(f,1)//2.00099999999992

右側微分を行うクロージャの実装

右側極限のanswerの中身を

answer = (f(x+deltaX) - f(x))/deltaX

に変更するだけだ。

左側微分と右側微分の比較

typealias function = (Double) -> Double
typealias defferential = (function,Double)-> Double

let f: function
let leftLimitF: (function,Double)-> Double
let rightLimitF: (function,Double)-> Double

f = { x in
    x*x+2
}
leftLimitF = { f,x in
    var deltaX = 1.0
    var answer: Double = f(x)
    while deltaX > 0.0001 {
        
        answer = (f(x+deltaX) - f(x))/deltaX
        
        deltaX /= 10
    }
    return answer
}

rightLimitF = { f,x in
    var deltaX = 1.0
    var answer: Double = f(x)
    while deltaX > 0.0001 {
        
        answer = (f(x) - f(x-deltaX))/deltaX
        
        deltaX /= 10
    }
    return answer
}
rightLimitF(f,1)//1.999000000000084
leftLimitF(f,1)//2.00099999999992