Open4

数値解析

Amane OtsukaAmane Otsuka

オイラー法による常微分方程式の数値解析

typealias multFunction = (Float,Float) -> Float

var x: Float = 0.0
var y: Float = 0.0
var h: Float = 0.1
let derivative: multFunction = { x, y in
    return 1-2*x
}

for _ in 0 ..< 4 {
    y += h*derivative(x,y)
    x += h
    print(y)
}
Amane OtsukaAmane Otsuka

4次ルンゲ・クッタ法による数値解析

typealias multFunction = (Float,Float) -> Float

var x: Float = 0.0
var y: Float = 1.0
var h: Float = 0.25
let derivative: multFunction = { x, y in
    return x+y
}

var k_1: Float = 0.0
var k_2: Float = 0.0
var k_3: Float = 0.0
var k_4: Float = 0.0

for _ in 1 ..< 5 {
    k_1 = derivative(x,y)
    k_2 = derivative(x+h/2, y+h/2*k_1)
    k_3 = derivative(x+h/2, y+h/2*k_2)
    k_4 = derivative(x+h, y+h*k_3)
    
    y += h*(k_1+2*k_2+2*k_3+k_4)/6
    x += h
    print(y)
}
Amane OtsukaAmane Otsuka

台形公式による数値積分

typealias function = (Float) -> Float
typealias multFunction = (Float,Float) -> Float

let lower: Float = 0.0
let upper: Float = 1.0
var sum: Float = 0.0
var x = lower
var num: Float = 8.0
var h = (upper-lower)/num

let integrands: function = { x in
    return 4.0/(1.0+pow(x, 2))
}

for i in 0 ... Int(num) {
    if i == 0 || i == Int(num) {
        sum += h/2*integrands(x)
    } else {
        sum += h*integrands(x)
    }
    x += h
}
print(sum)
Amane OtsukaAmane Otsuka

シンプソンの公式による積分

typealias function = (Float) -> Float
typealias multFunction = (Float,Float) -> Float

let lower: Float = 0.0
let upper: Float = 1
var sum: Float = 0.0
var x = lower
var num: Float = 4.0
var h = (upper-lower)/num

let integrands: function = { x in
    return pow(x,5)
}

for i in 0 ... Int(num) {
    if i == 0 || i == Int(num) {
        sum += h/3*integrands(x)
    } else if i.isMultiple(of: 2){
        sum += h/3*2*integrands(x)
    } else {
        sum += h/3*4*integrands(x)
    }
    x += h
}
print(sum)