Open4
数値解析
オイラー法による常微分方程式の数値解析
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)
}
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)
}
台形公式による数値積分
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)
シンプソンの公式による積分
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)