Euler method: Difference between revisions
Content added Content deleted
(Added Swift solution) |
|||
Line 3,324: | Line 3,324: | ||
80 20.005 |
80 20.005 |
||
90 20.002 |
90 20.002 |
||
</pre> |
|||
=={{header|Swift}}== |
|||
{{trans|C}} |
|||
<lang 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)</lang> |
|||
{{out}} |
|||
<pre> |
|||
Time: 0 10 20 30 40 50 60 70 80 90 100 |
|||
Analytic: 100.000 59.727 39.728 29.797 24.865 22.416 21.200 20.596 20.296 20.147 20.073 |
|||
Step 2: 100.000 57.634 37.704 28.328 23.918 21.843 20.867 20.408 20.192 20.090 20.042 |
|||
Step 5: 100.000 53.800 34.280 26.034 22.549 21.077 20.455 20.192 20.081 20.034 20.014 |
|||
Step 10: 100.000 44.000 27.200 22.160 20.648 20.194 20.058 20.017 20.005 20.002 20.000 |
|||
</pre> |
</pre> |
||