Leser: 2
|< 1 2 >| | 11 Einträge, 2 Seiten |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $EPSILON = 1e-7; my $f = sub { my $x = shift; return $x ** 2 - 2 * $x + 7; }; my $d = sub { my ($f, $x) = @_; my $d_ = sub { my $x = shift; return sprintf "%.3f", ($f->($x+$EPSILON) - $f->($x-$EPSILON))/( 2 * $EPSILON ); }; return defined $x ? $d_->($x) : $d_; }; print Dumper [ map $f->($_), 0..9 ]; print Dumper [ map $d->($f, $_), 0..9 ]; my $d_of_f = $d->($f); print Dumper [ map $d_of_f->($_), 0..9 ];
LanX-+2008-12-19 23:07:32--[...] Also rein mathematisch wird hier punktweise die Steigung angenähert, was ja genau die Definition für die Ableitung ist, wenn Epsilon gegen 0 geht. [...] noch genauer wärs wenn man den Mittelwert der beiden Steigungen von f(x) zu f(x-e) und f(x+e) nähme statt nur f(x-e) zu f(x+e) ... mit e=Epsilon!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Sub::Identify; use Sub::Install; sub g { my $i = shift; return 1 if $i == 0; return $i * g->($i-1); } # Decorator sub trace_sub { my $sub = shift; my $subname = Sub::Identify::sub_name( $sub ); my $lvl = 0; Sub::Install::reinstall_sub({ code => sub { my @args = @_; print " " x $lvl++ ."called $subname(" . join(', ', @args) .")\n" ; my $value = $sub->(@args); print " " x --$lvl ."$subname(". join(', ', @args) .") returns $value\n"; return $value; }, as => $subname, }); return; } trace_sub(\&g); print g(4);
1
2
3
4
5
6
7
8
9
10
11
called g(4)
called g(3)
called g(2)
called g(1)
called g(0)
g(0) returns 1
g(1) returns 1
g(2) returns 2
g(3) returns 6
g(4) returns 24
24
neniro+2008-12-26 18:31:19--die per "PatternMatching" aus multiply(5, add(3, 2)) die ausführlichere Variante add(multiply(5,3), multiply(5,2)) erzeugt, also eine symbolische Umformung.
|< 1 2 >| | 11 Einträge, 2 Seiten |