Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
http://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  math. Ableitung  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Sebastian Pizer
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2009
Beiträge: 603
Beitrag Sebastian Pizer Mitglied 15:34:28 04.10.2009   Titel:              Zitieren

Es gibt noch einen bequemen Mittelweg zwischen symbolischer Differentiation und numerischer Differentiation: Automatische Differentiation.

Man kann sich zB in C++ eine Klasse bauen, die neben Funktionswerten auch die Ableitung speichert (als Wert) und dann mit entsprechend überladenden Operatoren, die die Kettenregel anwenden, rechnen.

Man bekommt dabei nicht die Ableitung als Funktion/Formel, sondern als einen Wert an einem bestimmten Punkt. Der Wert wird aber "richtig" ausgerechnet und nicht wie bei numerischer Differenzierung approximiert. Es tritt bei AD also nicht so schnell das Problem der numerischen Auslöschung auf.

Also, wenn man eigentlich nur Funktionswert + Ableitung an bestimmten Punkten und nicht in Formel-Form braucht, ist AD sehr geeignet.

Gruß,
SP
Theodor
Unregistrierter




Beitrag Theodor Unregistrierter 17:29:21 04.10.2009   Titel:              Zitieren

Aber die Jacobi Matrix beinhaltet doch sämtliche partielle Ableitungen!? Somit ist doch die automatische Differenziation eher eine Anwendung und kein Mittel zur Differenziation?!
Sebastian Pizer
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2009
Beiträge: 603
Beitrag Sebastian Pizer Mitglied 17:48:18 04.10.2009   Titel:              Zitieren

Theodor schrieb:

Aber die Jacobi Matrix beinhaltet doch sämtliche partielle Ableitungen!?

Ja und?

Theodor schrieb:

Somit ist doch die automatische Differenziation eher eine Anwendung und kein Mittel zur Differenziation?!

1. Wo ist denn da der Zusammenhang?
2. Wie kommst Du darauf?
mathe
Unregistrierter




Beitrag mathe Unregistrierter 18:54:33 04.10.2009   Titel:              Zitieren

So ich habe mich ein wenig eingelesen und so ganz schlau werde ich noch nicht daraus:
1) Was hat es mit der Verkettung auf sich?! Warum ist u.a. im o.g. Script von 2 Verketteten Funktkionen die Rede? Geht das nicht mit zB f(x)=x²?
2) Sehe ich das richtig dass bei der Berechnung (S10) einfach nur ein Operatorbaum durchlaufen wird?
3) Seite 12 veranlasst mich zu fragen: Was genau ist die Vorteil der automatischen Ableitung? Schließlich werden da ja auch rudimentäre Ableitungsregeln umgesetzt.

Leider verstehe ich nicht so recht was AD aus macht ... :(

BTW: Mittlerweile ist de rThread endgültig im falschen Forum? ;)


@Theodor: Wie bitte?
Sebastian Pizer
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2009
Beiträge: 603
Beitrag Sebastian Pizer Mitglied 19:49:11 04.10.2009   Titel:              Zitieren

mathe schrieb:

1) Was hat es mit der Verkettung auf sich?! Warum ist u.a. im o.g. Script von 2 Verketteten Funktkionen die Rede? Geht das nicht mit zB f(x)=x²?

Der Punkt ist, Deine Funktion "f", die Du berechnen und ableiten willst, kannst Du aus ganz vielen kleinen elementaren Operationen zusammensetzen, zB so: f(x) = g4(g3(g1(x),g2(x)). Das können Multiplikation, Addition, Subtraktion, etc etc etc. Die führst Du hintereinander aus --> Kettenregel anwenden.

Hier mal eine vereinfachte Skizze, wie so etwas in C++ aussehen könnte:
C++:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <cmath>
 
class fpad // forward propagating automatic differentiation
{
  double value_;
  double deriv_;
public:
  fpad(double v, double d=0) : value_(v), deriv_(d) {}
 
  double value() const {return value_;}
  double derivative() const {return deriv_;}
 
  const fpad& equalsTransform(double newVal, double outer_deriv)
  { deriv_ = deriv_ * outer_deriv; // Kettenregel
    value_ = newVal;
  }
 
  const fpad& operator+=(fpad const& x)
  { value_ += x.value_;
    deriv_ += x.deriv_;
    return *this;
  }
 
  const fpad& operator-=(fpad const& x)
  { value_ -= x.value_;
    deriv_ -= x.deriv_;
    return *this;
  }
 
  const fpad& operator*=(fpad const& x)
  { // Produkt-Regel:
    deriv_ = deriv_ * x.value_ + value_ * x.deriv_;
    value_ *= x.value_;
    return *this;
  }
 
  friend const fpad operator+(fpad const& a, fpad const& b)
  { fpad r(a); r+=b; return r; }
 
  friend const fpad operator-(fpad const& a, fpad const& b)
  { fpad r(a); r-=b; return r; }
 
  friend const fpad operator*(fpad const& a, fpad const& b)
  { fpad r(a); r*=b; return r; }
};
 
fpad sin(fpad t)
{
  using std::sin;
  using std::cos;
  double v = t.value();
  t.equalsTransform(sin(v),cos(v)); // Verkettung
  return t;
}
 
int main()
{
  fpad x (0.123, 1.0); // Identitaet für x=0.123
                       // 1.0 ist die Ableitung der Identitaet
  fpad y = x*x - 3*sin(x) + 2;
  std::cout << "f(x) = x*x - 3*sin(x) + 2\n"
               "fuer x=0.123 ist f (x) = " << y.value() << "\n"
               "             ist f'(x) = " << y.derivative() << "\n";
}


Vereinfacht ist das Beispiel deswegen, weil "fpad" nur eine einzige Ableitung speichert und keine Division besitzt -- die kann ich nicht aus dem Kopf auf die Schnelle ;). Das Prinzip sollte jetzt aber klar sein.

Diese Variante von AD, in der die Ableitungen an einem Punkt "mitgeschleift" werden, nennt sich "forward propagation". Es gibt dann noch "backward propagation", bei der während man rechnet ein Baum aufgebaut wird, über den man hinterher die Ableitungen berechnet.

Gruß,
SP


Zuletzt bearbeitet von Sebastian Pizer am 23:36:44 04.10.2009, insgesamt 3-mal bearbeitet
otze
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.01.2004
Beiträge: 7831
Beitrag otze Mitglied 23:13:26 04.10.2009   Titel:              Zitieren

Das "Problem" an dem Ansatz ist allerdings, dass man nicht beliebige Ableitungen berechnen kann.

_________________
Jesus Christus! Da blickt ja kein Mensch mehr durch.
Sebastian Pizer
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2009
Beiträge: 603
Beitrag Sebastian Pizer Mitglied 23:15:24 04.10.2009   Titel:              Zitieren

otze schrieb:
[...]dass man nicht beliebige Ableitungen berechnen kann.

Was meinst Du? Ableitungen beliebigen Grades? Müsste eigentlich mit einer Erweiterung der Klasse funktionieren. Sonst gibt's ja noch "backward propagation". Dies könnte man sowohl dynamisch als auch per Expression-Templates machen.

Gruß,
SP


Zuletzt bearbeitet von Sebastian Pizer am 23:33:18 04.10.2009, insgesamt 1-mal bearbeitet
C++ Forum :: C++ (alle ISO-Standards) ::  math. Ableitung  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.