Math::Approx::Symbolic - Symbolic representation of interpolated polynomials


Math-Approx-Symbolic documentation Contained in the Math-Approx-Symbolic distribution.

Index


Code Index:

NAME

Top

Math::Approx::Symbolic - Symbolic representation of interpolated polynomials

SYNOPSIS

Top

  use Math::Approx::Symbolic;
  # ... use as you would use Math::Approx ...

  my $symbolic = $approximation->symbolic();

  # ... $symbolic is now a Math::Symbolic object.

DESCRIPTION

Top

This module is a thin wrapper around the Math::Approx module. It subclasses Math::Approx and adds the "symbolic" subroutine that returns a Math::Symbolic object representing the calculated approximation.

EXPORT

None. Ever.

symbolic() method

This is the only method added to the ones from Math::Approx. It takes an optional argument indicating the variable name to use for the symbolic representation of the approximation polynomial.

It returns a Math::Symbolic object representing the approximation polynomial.

EXAMPLE

Top

  use Math::Approx::Symbolic;

  sub poly {
      my($n,$x) = @_;
      return $x ** $n;
  }

  my %x;
  for (1..20) {
      $x{$_} = sin($_/10) * cos($_/30) + 0.3*rand;
  }

  my $approx = new Math::Approx::Symbolic (\&poly, 5, %x);
  $approx->print;
  print "Fit: ", $approx->fit, "\n\n";

  my $function = $approx->symbolic('x');
  # defaults to using variable 'x' without argument.

  print "$function\n";

  print $function->value(x => $_),"\n" foreach keys %x;

  # Work with the symbolic function now.

AUTHOR

Top

(c) 2003 by Steffen Müller

Please send feedback, bug reports, and support requests to the author at approx-symbolic-module at steffen-mueller dot net

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

New versions of this module can be found on http://steffen-mueller.net or CPAN.

Math::Approx

Math::Symbolic


Math-Approx-Symbolic documentation Contained in the Math-Approx-Symbolic distribution.
package Math::Approx::Symbolic;

use 5.006;
use strict;
use warnings;

use Math::Approx;
use Math::Symbolic;

use base 'Math::Approx';

our $VERSION = '0.100';

sub symbolic {
    my $self = shift;
    my $var  = shift;
    $var = 'x' unless defined $var;
    $var = Math::Symbolic::Variable->new($var)
      unless ref($var) =~ /^Math::Symbolic::Variable/;
    my $degree = $self->{N};
    my @coeff  = @{ $self->{A} };

    my $constant = shift @coeff;

    my $cur_degree = $degree;
    my @exps;
    foreach ( reverse @coeff ) {
        push @exps,
          Math::Symbolic::Operator->new(
            '*',
            Math::Symbolic::Constant->new($_),
            (
                  $cur_degree == 1
                ? $var
                : Math::Symbolic::Operator->new(
                    '^', $var, Math::Symbolic::Constant->new($cur_degree)
                )
            )
          );
        $cur_degree--;
    }
    my $symbolic = shift @exps;
    $symbolic += $_ foreach @exps;
    return $symbolic + Math::Symbolic::Constant->new($constant);
}

1;
__END__