# calculate left- and right-sided derivation of a function # f(x), given as reference, at point $x. # Return: array with derivations (f'+, f'-) sub derive { my ($rF, $x) = @_; my ($dl, $dr, $dr_a, $dl_a) = (0, 0, 0, 0); my $dx = 1.0; # initial step my $i = 0; # loop count my $epsilon = 1e-7; # while ($dx > $epsilon) { $dr = (&$rF($x+$dx)-&$rF($x))/$dx; $dl = (&$rF($x)-&$rF($x-$dx))/$dx; $dx /= 2.0; if ($i++>0) { last if abs($dr-$dr_a) < $epsilon and abs($dl-$dl_a) < $epsilon; } ($dr_a, $dl_a) = ($dr, $dl); } return ($dl, $dr); } my $pi = 3.1415927; my $e = exp(1); sub deg { my ($x) = @_; return $x*180/$pi; } sub rad { my ($x) = @_; return $x*$pi/180; } sub help { print q! Konstanten: Es gibt folgende Konstanten: $pi Pi $e e = exp(1) $l Der Wert des letzten Ausdrucks !; print "press a key to continue ... \n"; $line = ; print q! Funktionen: Die Funktionen deg() und rad() rechnen (Alt-)Grad in Winkeleinheiten um und vice verse: ABAKUS> deg($pi) = 180 ABAKUS> rad(180) = 3.1415927 ABAKUS> cos(rad(180)) = -0.99999999997 derive(\&f, ) liefert die links- und rechtsseitige Ableitung der Funktion f an der Stelle x: f'(x). Beispiel: > sub quad{ my ($x) = @_; return $x*$x; } ABAKUS> derive(\&quad, 0) = 1.19e-007 1.19e-007 ABAKUS> derive(\&quad, 1) = 2.0000 1.99999 ! } print "ABAKUS.PL V1.0 2000 I.Kloeckl\n"; print "type 'help' for help, 'exit' to exit ABAKUS\n"; while( print ("\nABAKUS> "), $line = , chop($line), $line ne 'exit' && $line ne 'quit') { if ($line =~ /^help$/i) { &help; } else { @last = eval($line); $l = $last[0]; print " = @last" if defined @last; } }