43 lines
1.3 KiB
Swift
43 lines
1.3 KiB
Swift
import Foundation
|
|
|
|
let numberFormat = " %7.3f"
|
|
let k = 0.07
|
|
let initialTemp = 100.0
|
|
let finalTemp = 20.0
|
|
let startTime = 0
|
|
let endTime = 100
|
|
|
|
func ivpEuler(function: (Double, Double) -> Double, initialValue: Double, step: Int) {
|
|
print(String(format: " Step %2d: ", step), terminator: "")
|
|
var y = initialValue
|
|
for t in stride(from: startTime, through: endTime, by: step) {
|
|
if t % 10 == 0 {
|
|
print(String(format: numberFormat, y), terminator: "")
|
|
}
|
|
y += Double(step) * function(Double(t), y)
|
|
}
|
|
print()
|
|
}
|
|
|
|
func analytic() {
|
|
print(" Time: ", terminator: "")
|
|
for t in stride(from: startTime, through: endTime, by: 10) {
|
|
print(String(format: " %7d", t), terminator: "")
|
|
}
|
|
print("\nAnalytic: ", terminator: "")
|
|
for t in stride(from: startTime, through: endTime, by: 10) {
|
|
let temp = finalTemp + (initialTemp - finalTemp) * exp(-k * Double(t))
|
|
print(String(format: numberFormat, temp), terminator: "")
|
|
}
|
|
print()
|
|
}
|
|
|
|
func cooling(t: Double, temp: Double) -> Double {
|
|
return -k * (temp - finalTemp)
|
|
}
|
|
|
|
analytic()
|
|
ivpEuler(function: cooling, initialValue: initialTemp, step: 2)
|
|
ivpEuler(function: cooling, initialValue: initialTemp, step: 5)
|
|
ivpEuler(function: cooling, initialValue: initialTemp, step: 10)
|