35 lines
795 B
Plaintext
35 lines
795 B
Plaintext
fn runge_kutta4(fx: &Fn(f64, f64) -> f64, x: f64, y: f64, dx: f64) -> f64 {
|
|
let k1 = dx * fx(x, y);
|
|
let k2 = dx * fx(x + dx / 2.0, y + k1 / 2.0);
|
|
let k3 = dx * fx(x + dx / 2.0, y + k2 / 2.0);
|
|
let k4 = dx * fx(x + dx, y + k3);
|
|
|
|
y + (k1 + 2.0 * k2 + 2.0 * k3 + k4) / 6.0
|
|
}
|
|
|
|
fn f(x: f64, y: f64) -> f64 {
|
|
x * y.sqrt()
|
|
}
|
|
|
|
fn actual(x: f64) -> f64 {
|
|
(1.0 / 16.0) * (x * x + 4.0).powi(2)
|
|
}
|
|
|
|
fn main() {
|
|
let mut y = 1.0;
|
|
let mut x = 0.0;
|
|
let step = 0.1;
|
|
let max_steps = 101;
|
|
let sample_every_n = 10;
|
|
|
|
for steps in 0..max_steps {
|
|
if steps % sample_every_n == 0 {
|
|
println!("y({}):\t{:.10}\t\t {:E}", x, y, actual(x) - y)
|
|
}
|
|
|
|
y = runge_kutta4(&f, x, y, step);
|
|
|
|
x = ((x * 10.0) + (step * 10.0)) / 10.0;
|
|
}
|
|
}
|