Wie Interpolation von Daten (Zahlenwerte)?

04/10/2012 - 17:31 von Astrid | Report spam
Hallo zusammen,

habe ein Feld mit x-Werten und ein dazugehoeriges Feld von y-Werten.
Z.B.

my @myx = (1,2,3,4,5);
my @myy = (2,4,6,8,10);

Jetzt brauche ich einen interpolierten y-Wert fuer z.B. die Stelle
x=2.7.
Man kann natuerlich alles interpolationsmaessig selber programmieren.

Bin auf das Modul Math::Interpolator gestossen. Es liest sich so, als
wenn es das
macht, was ich moechte.

Habe leider noch nicht so viel tiefgehende Perl-Erfahrung.
Daher komme ich mit dem, was auf den CPAN-Seiten steht, ueberhaupt
nicht zurecht, wie
ich da jezt meine Datenwerte von x und y in das Math::Interpolator-
System hineinbekomme?

Mein Ergebnis bekomme ich dann wahrscheinlich mit:

$ergebnis = $ipl->y(2.7)

Aber die Schritte dazwischen?

Gruss, Astrid
 

Lesen sie die antworten

#1 Peter J. Holzer
04/10/2012 - 20:00 | Warnen spam
On 2012-10-04 15:31, Astrid wrote:
habe ein Feld mit x-Werten und ein dazugehoeriges Feld von y-Werten.
Z.B.

my @myx = (1,2,3,4,5);
my @myy = (2,4,6,8,10);

Jetzt brauche ich einen interpolierten y-Wert fuer z.B. die Stelle
x=2.7.
Man kann natuerlich alles interpolationsmaessig selber programmieren.

Bin auf das Modul Math::Interpolator gestossen. Es liest sich so, als
wenn es das
macht, was ich moechte.

Habe leider noch nicht so viel tiefgehende Perl-Erfahrung. Daher
komme ich mit dem, was auf den CPAN-Seiten steht, ueberhaupt nicht
zurecht, wie ich da jezt meine Datenwerte von x und y in das
Math::Interpolator- System hineinbekomme?



Ja, ich hab's auch mehrmals lesen müssen, bevor ich es verstanden habe.

Zwei Dinge sind wesentlich:

| A list of zero or more point objects must be supplied.

Du musst also aus Deinen zwei Arrays eine Liste von
Math::Interpolator::Knot Objekten machen:

use Math::Interpolator::Knot;
use List::MoreUtils qw(pairwise);

my @knots = pairwise { Math::Interpolator::Knot->new($a, $b) } @myx, @myy;

(pairwise ist eine praktische Funktion aus List::MoreUtils, die aus zwei
Arrays jeweils die Elemente an der gleichen Stelle entnimmt und damit
etwas macht, z.B. Math::Interpolator::Knot->new aufrufen)

| Normally it would not be desired to instantiate this class directly,
| because it contains no interpolation methods. A subclass such as
| Math::Interpolator::Linear or Math::Interpolator::Robust should be
| instantiated instead.

D.h., Math::Interpolator->new aufzurufen ist sinnlos, weil das System
dann noch nicht weiß, *wie* es interpolieren soll. Statt dessen nimmt
man eine Subklasse, die eine konkrete Methode implementiert:

my $ipl = Math::Interpolator::Robust->new(@knots);


Mein Ergebnis bekomme ich dann wahrscheinlich mit:

$ergebnis = $ipl->y(2.7)



Ja.

Hier ist das ganze Script:

#!/usr/bin/perl
use 5.010;
use warnings;
no warnings qw/once/;
use strict;
use Math::Interpolator::Robust;
use Math::Interpolator::Knot;
use List::MoreUtils qw(pairwise);

my @myx = (1,2,3,4,5);
my @myy = (2,4,6,8,10);

my @knots = pairwise { Math::Interpolator::Knot->new($a, $b) } @myx, @myy;

my $ipl = Math::Interpolator::Robust->new(@knots);

my $y = $ipl->y(2.7);

say $y;
__END__

hp

_ | Peter J. Holzer | Deprecating human carelessness and
|_|_) | Sysadmin WSR | ignorance has no successful track record.
| | | |
__/ | http://www.hjp.at/ | -- Bill Code on

Ähnliche fragen