$LC[$i] = $f[$i]/$den; $den = 1; #### use strict; use warnings; sub lagrange { my $x = shift; my $f = shift; my @LC; my $n = @$x; for (my $i=0; $i < $n; $i++) { my $den = 1; for (my $j=0; $j < $n; $j++) { next if $j == $i; $den *= $x->[$i] - $x->[$j]; } $LC[$i] = $f->[$i]/$den; } return \@LC; } sub lageval { my $x = shift; my $LC = shift; my $x0 = shift; my $n = @$x; my $sum = 0; for (my $i=0; $i<$n;$i++) { my $mult = $LC->[$i]; for (my $j = 0; $j<$n; $j++) { next if $j == $i; $mult *= $x0 - $x->[$j]; } $sum += $mult; } return $sum; } my @x = map { $_ - 2 } 0..4; my @f = map {$_**2} @x; my $LC = lagrange \@x, \@f; my $x0 = 0.5; my $y = lageval \@x, $LC, $x0; print "$x0 $y\n";