#!/usr/bin/perl -w
use PDL;
use PDL::Math;
use PDL::NiceSlice;
use PDL::RungeKutta;
# solve y' = 1/x, y(1) = 0 , x in [1,100]
# Solution: y = ln(x)
$Y0=zeroes(1); # y(1)=0
@esargs=(); # extra arguments for error evaluation function
$t0=1; # initial moment
$dt0=0.1; # initial time step
$t1=100; # final moment
$eps=1.e-9; # requested error
$verbose=0;
# integration
($evt,$evy,$evd,$i,$j) =
rkevolve($t0,$Y0,$dt0,\&DE,$t1,$eps,\&error,\@esargs,$verbose);
$check=log($evt);
wcols "%15.10f",$evt,$evy((0)),$check,$evd((0)),'test.dat',
{ HEADER => "# t y computed y exact error" };
print "\n$i steps\n$j times reset\nresults writed in test.dat\n";
sub DE { # differential eq
my ($t,$y)= @_;
my $yd=ones(1)/$t;
return $yd;
}
sub error { # error scale
my ($t,$Y) = @_;
my $es=ones(1);
return $es;
}