Runge-Kutta method: Difference between revisions

(→‎{{header|Perl 6}}: golfing a bit)
Line 500:
<lang perl6>sub runge-kutta(&yp, \δt) {
return -> \t, \y {
my @dy =t + δt, *y yp(+ t6 R/ [+] <1 2 2 1> , yZ* );
map {
push @dy, δt * yp( t + δt/2, y + @dy[0]/2 );
state $yp = 0;
push @dy, δt * yp( t + δt/2, y + @dy[1]/2 );
push @dy, δt δt* yp($yp = yp(t + $_*δt , y + @dy[2] δt*$_*$yp));
t + δt}, y<0 + 6 R1/2 [+] <1 2 /2 1> Z* @dy;
}
}
 
my &RK = runge-kutta { $^t * sqrt($^y) }, .1;
 
loop ( my ($t, $y) = (0, 1); $t <= 10; ($t, $y) = RK($t, $y)) {
printf "y(%2.0f) =  %12f ±  %e\n", $t, $y, abs($y - ($t**2 + 4)**2 / 16)
if $t == $t.Int;
}</lang>
}
</lang>
{{out}}
<pre>y( 0) = 1.000000 ± 0.000000e+00
1,935

edits