21 lines
525 B
Raku
21 lines
525 B
Raku
sub runge-kutta(&yp) {
|
|
return -> \t, \y, \δt {
|
|
my $a = δt * yp( t, y );
|
|
my $b = δt * yp( t + δt/2, y + $a/2 );
|
|
my $c = δt * yp( t + δt/2, y + $b/2 );
|
|
my $d = δt * yp( t + δt, y + $c );
|
|
($a + 2*($b + $c) + $d) / 6;
|
|
}
|
|
}
|
|
|
|
constant δt = .1;
|
|
my &δy = runge-kutta { $^t * sqrt($^y) };
|
|
|
|
loop (
|
|
my ($t, $y) = (0, 1);
|
|
$t <= 10;
|
|
($t, $y) »+=« (δt, δy($t, $y, δt))
|
|
) {
|
|
printf "y(%2d) = %12f ± %e\n", $t, $y, abs($y - ($t**2 + 4)**2 / 16)
|
|
if $t %% 1;
|
|
}
|