Schrift
[thread]7924[/thread]

?Ableitung einer Funktion ermitteln?



<< >> 9 Einträge, 1 Seite
EagleFox
 2006-04-25 20:15
#65322 #65322
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Wie kann ich am geschicktesten das Maximum und/oder Minimum der Ableitung eines Graphen ermitteln?
Ich habe einen Graphen aus z.B. 1000 Datenpunkten (1000 Zeilen in einer Datei X). Nun suche ich die Stelle, an der die Ableitung maximal wird, und zwar so, dass ich noch zwischen steigendem und fallendem Maximum unterscheiden kann.
Hat jemand vielleicht schon mal sowas programmiert?
dominicn
 2006-04-25 20:48
#65323 #65323
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
Ich habe sowas noch nicht programmiert. Aber auf Anhieb fallen mir folgende Möglichkeiten ein:

a) Ermittle eine Funktion, auf deren Graph alle deine Datenpunkte liegen. Bei 1000 Punkten ist das wahrscheinlich keine schöne Sache und funktioniert wahrscheinlich auch nur näherungsweise. Wenn du aber eine solche Funktion hast kannst du die wahrscheinlich ohne Probleme ableiten und deine Berechnungen anstellen. Das geht zumindest dann sehr gut, wenn du mit Polynomen arbeitest.

b) Man könnte die Ableitung an einer bestimmten Stelle auch numerisch ermitteln, also so wie das z.B. ein Graphiktaschenrechner macht. Wenn man z.B. die Ableitung am Punkt P(px, py) ermitteln will und weiß, dass der Punkt Q(qx, qy) der nächstgelegene Punkt nach links und R(rx, ry) der nächstgelegene Punkt nach rechts ist, dann könnte man setzen:
Anstieg im Punkt P = http://img255.imageshack.us/img255/5062/abl8fb.th.jpg
Das ist jetzt das arithmetische Mittel der Anstiege der Strecken QP und PR, evtl. ist eine andere Mittelwertberechnung sinnvoller.
Das müsste man dann für jeden Punkt machen und für die zweite Ableitung nochmal.


Das sind jetzt alles nur schnelle Überlegungen, die sicher nicht sehr ausgereift sind ... nur Diskussionsanstöße ...\n\n

<!--EDIT|dominicn|1145984678-->
Ronnie
 2006-04-25 21:32
#65324 #65324
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich habe es noch nie verwendet, aber CPAN:PDL::Graphics::Limits klingt nicht schlecht.
EagleFox
 2006-04-26 13:25
#65325 #65325
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Danke erst mal für die Antworten.
@dominicn
Zum Vorschlag a. Das ist nicht möglich. Die Funktionen müssten Röntgenspektren beschreiben, die sehr kompliziert sind. Wenn ich die Funktion dazu hätte, bräuchte ich keine Extremwerte mehr zur Analyse. Das fällt also aus.

zu b. Das könnte klappen, wird meiner Meinung nach zwar nicht sehr genau, ist aber einen Versuch Wert.
Ich werde mich mal mit Ronnies Vorschlag beschäftigen, das sieht wirklich vielversprechender aus.
Ich hoffe ich verstehe diese Anwendung.
Danke erst mal.
Dubu
 2006-04-26 14:52
#65326 #65326
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@EagleFox: Nein, dominicn hat mit a) schon recht: Du brauchst eine - zumindest lokale - Funktion die deine Messdaten beschreibt. Wenn du deine Messwerte direkt nimmst, wie in b) vorgeschlagen, dann gehst du implizit von einer linearen Funktion zwischen zwei Messpunkten aus, was natürlich keine Messwertschwankungen berücksichtigt.
Für lokale Fits bei Messdaten, die einer stetigen Funktion folgen sollen, bieten sich z.B. kubische oder B-Splines an.
Die Bestimmung passender Spline-Parameter und daraus der lokalen Ableitung wird dem Leser als Übung überlassen. ;)

Dass PDL::Graphics::Limits irgendetwas damit zu tun hätte, kann ich nicht sehen.
EagleFox
 2006-04-26 17:40
#65327 #65327
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
ok, dass PDL::Graphics::Limits mir ne Lösung brächte, habe ich nun auch verworfen, nachdem ich mir mal näher angeschaut habe, was das überhaupt macht.
@Dubu:
Vielen Dank für Deine Übungsaufgabe. Soweit bin ich leider noch nicht, dass ich das programmieren könnte.
Crian
 2006-04-26 17:45
#65328 #65328
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Aber zu Splines gibt es garantiert auch Module... sonst schau mal in Algorithmen mit Perl (S. 656 ff) oder jedes andere Algorithmenbuch.\n\n

<!--EDIT|Crian|1146059248-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
EagleFox
 2006-05-10 13:51
#65329 #65329
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

nach kleiner Abwesendheitsphase habe ich nun das folgende Programm geschrieben, welches mithilfe einer Gausskurve die Funktion glättet (jedenfalls soll es das tun!). Leider macht das Programm mehr so garnichts! Ich erhalte weder Fehlermeldungen, noch schreibt das Programm etwas in die vorgesehene Datei!

Hier der Code:
Code: (dl )
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
39
40
41
42
43
44
45
46
47
#! /usr/bin/perl

use strict;
use warnings;
#use diagnostics;

my $pi = 4 * atan2( 1, 1 );


my $punkte = 60; # Anzahl der Punkte im Spektrum
my $sigma = 2; # Breite der Gausskurve
my $bereich = 3; # Grenzen der Summe
my $ende = $punkte - $bereich;
my $b = $bereich;

my $file = $ARGV[0];
my $out = "gauss2.test";

my $gauss;
my @array;


open(my $outfh,">",$out) or die $!;
open(my $datei,"<",$file) or die $!;
@array = <$datei>;

# print "Das Array hat ".scalar @array." Zeilen!\n";


for(my $n = $b; $n == $ende; $n++){
my $imin = $n - $bereich;
my $imax = $n + $bereich;

$gauss = 0;

for(my $i = $imin; $i == $imax; $imin++){
$gauss = $gauss + ((-1/(sqrt(2*$pi)*($sigma**3)))*$array[$i]*($i - $n)*exp((($i - $n)**2)/(2*($sigma**2))));
}

print $outfh $gauss,"\n";

}



close $datei;
close $outfh;


Das Array ist auf jeden Fall nicht leer, das habe ich mit der auskommentierten Zeile geprüft. Ich habe mir die Arraydaten auch mal ausgeben lassen. Aber warum läuft die Schleife nicht???

Vorher hatte ich mal die Variable $n an der Stelle deklariert, wo ich jetzt $b deklariere. Und anstatt $i hatte ich direkt $imin eingesetzt. Dann bekam ich immer die seltsame Meldung:

Code: (dl )
1
2
Useless use of private variable in void context at ./test.pl line 42. 
Useless use of private variable in void context at ./test.pl line 46.


In den Zeilen 42 und 46 sind die beiden for-Schleifen jeweils zuende (also da steht nur } ).
Was soll mir das sagen?

Ich hoffe Ihr habt ne Idee!
Strat
 2006-05-11 16:27
#65330 #65330
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
for(my $n = $b; $n == $ende; $n++){

sieht komisch aus, vor allem das $n == $ende (solange $n == $ende ist, laeuft die schleife); vermutlich meinst du
Code: (dl )
for(my $n = $b; $n <= $ende; $n++){

oder besser noch:
Code: (dl )
for my $n ($b..$ende) {

nebenbei: die Variablen $a und $b sollte man in perl nur fuer die sort-funktion verwenden, in eigenen codes hingegen nicht. Warum nicht einfach statt $b $lowerIndex? das ist auch viel besser lesbar

dito bei der inneren schleife\n\n

<!--EDIT|Strat|1147350504-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2006-04-25 20:15.