Now suppose that you want to pass a function as an argument to another function. For example, you want to use Euler's method to estimate the value of the solution to the boundary value problem .
Here the idea is to define a subroutine which uses the Euler method on an arbitrary function given the starting point, stepsize, and number of interations to perform.
Here is the core of the Euler subroutine
## Usage: euler(function_reference, $x_0, $y_0, $step_size, $number_of_steps); ## Returns an array (@xcoords, @ycoords) ## sub euler { ## Grab the parameters which were passed in the function call my $fn_ref = shift; my $local_x0 = shift; my $local_y0 = shift; my $local_step_size = shift; my $local_number_of_steps = shift; ## a local variable my $i; ## Initialize the arrays of coordinates to return my @xcoords = ($local_x0); my @ycoords = ($local_y0); ## Perform Euler's method the requisite number of times for ($i = 1; $i <= $local_number_of_steps; $i++) { $xcoords[$i] = $xcoords[$i-1] + $local_step_size; $ycoords[$i] = $ycoords[$i-1] + $local_step_size * &$fn_ref($xcoords[$i-1], $ycoords[$i-1]); } return (@xcoords, @ycoords); }
Next we make a function reference to pass to the Euler subroutine
## Make a function object for f(x,y) = x^2 + y^2 $f_ref = new Fun( sub { my $x = shift; ## local variable my $y = shift; ## local variable return $x**2 + $y**2 ## return f(x,y) } );
Finally, we invoke the Euler routine with the following syntax, the function reference being $f_ref->rule()
@x_and_y_coords = euler($f_ref->rule(),$x0,$y0,$step_size,$number_of_steps);
Note that the array which is returned has length 2*($number_of_steps + 1) with entries where is $number_of_sreps