Numerische Annäherungsverfahren

Ich (Zivi) hätte eine Frage zu einem generellen Problem. Angenommen ich habe ein Gleichungssystem mit drei(oder mehr) Unbekannten x,y und z. Zusätzlich dazu 3 Gleichungen (diese sind beliebig, ich habe mir einfach mal etwas komplizierteres ausgedacht):

0.001 =(x+y+z)(x) /(6-x+y)
0.24 =(x+y+z)/(56-2*z)
4=(x+y+2*z)*(x+z)/(2-3x)

Ich möchte nun eindeutige Lösungen für x,y u. z finden.
Die Gleichungen durch Substitution zu lösen ist oft umständlich.
Gibt es in mit Hilfe von Annäherungsverfahren (ähnlich Intervallverschachtelung oder Newton’sche Annäherungsverfahren) Möglichkeiten solche Gleichungen zu lösen.

Vielen Dank für Ideen oder Links! Ich hatte diese Frage schon einmal im Informatik-Forum gestellt, bekam aber keine hilfreichen Antworten.

Ben

Hi,

Stichwort: Gauss-Eliminationsverfahren.
Darunter solltest Du fündig werden.
Ist allerdings kein Näherungsverfahren, sondern ein analytisches. Was es dazu für Abwandlungen gibt weiss ich nicht.

ciao
ralf

Stichwort: Gauss-Eliminationsverfahren

Aus meinem Mathe-Lk kenne ich ein Gauss-Verfahren zur Lösung von linearen (!) Gleichungssysteme. Aber dies ist oft nicht gegeben.

Darum geht das Gauss-Eliminationsverfahren hier, glaube ich, nicht.

Aber vielen Dank für die Hilfe!

Ben

0.001 =(x+y+z)(x) /(6-x+y)
0.24 =(x+y+z)/(56-2*z)
4=(x+y+2*z)*(x+z)/(2-3x)

Gibt es in mit Hilfe von Annäherungsverfahren (ähnlich
Intervallverschachtelung oder Newton’sche
Annäherungsverfahren) Möglichkeiten solche Gleichungen zu
lösen.

Ich würde das mit Hilfe einer Fehlerquadratsummenminimierung machen. Dazu definiert man erst einmal eine Fehlherquadratsumme (FQS) indem man die Gleichchungen zunächst so umstellt, daß links eine Null steht, dann quadriert und die Quadrate addiert. Auf diese Weise erhält man eine Funktion

FQS(x,y,z)=[(x+y+z)(x)/(6-x+y)-0.001]²+[(x+y+z)/(56-2*z)-0.249]²+[(x+y+2*z)*(x+z)/(2-3x)-4]²

mit der nützlichen Eigenschaft für diejenigen Werte von (x,y,z) Null zu werden, die Lösung des Gleichungssystems sind. Da die Funktion nur positive Funktionswerte hat, sind diese Nullstellen auch gleichzeitig Minima. Indem man also FQS(x,y,z) minimiert kann man die Lösungen des Gleichungssystem finden und man findet sogar Näherungslösungen für den Fall, daß das Gleichungssystem überhaupt keine Lösungen hat.

Für die eigentliche Lösung dieser Aufgabe setze ich gern den Solver von EXCEL ein. Man kann das Ganze natürlich auch selbst programmieren. Häufig verwendete Algorithmen sind das Gradientenverfahren, das Newtonverfahren oder der Marquardt-Levenberg-Algorithmus.

Gibt es in mit Hilfe von Annäherungsverfahren (ähnlich
Intervallverschachtelung oder Newton’sche
Annäherungsverfahren) Möglichkeiten solche Gleichungen zu
lösen.

Ja, gibt es *fg*. Wenn die Frage aber eigentlich lautet: „Wie macht man denn …?“ kann ich auch nochmal genauer darauf eingehen, wie’s geht. Dann solltest Du Dich aber auf kompliziertere Sachen einstellen, die man nicht unbedingt mit aus dem Abi bringt oder während des Zivildienstes lernt.

Vielen Dank Zentrum! Vielen Dank MrStupid!

Ich habe schon einen Diplom-Mathematiker, und je einen Mathe- und Informatikstudent in meinem Bekanntenkreis nach möglichen Annäherungsverfahren befragt und keiner wusste etwas.

Deshalb wäre es wirklich schön, wenn Du, Zentrum, ein paar Sätze über die Namen der Verfahren und ihrer Grundidee nennen könntest, die Du im Sinn hast. Wenn es so ist, dass alle Verfahren (falls es mehrere gibt) viel zu schwer sind, dann belasse ich es dabei, und weiss wenigstens die Namen der Verfahren…

Ich habe kurz einmal „Gradientenverfahren“ und Marquardt-Levenberg-Algorithmus in eine Suchmaschine eingegeben. Dabei schien das erste Verfahren nur für lineare Gleichungen zu gelten, stimmt das? Ich habe mich mit beiden aber noch nicht beschäftigt, habe aber schon viel „neue“ Mathematik gesehen. Die Anzahl der Links ist spärlich.

Am schönsten wäre es, wenn es ein Newtonsche Annäherungsverfahren, hatte MrStupid erwähnt und ist meine Lieblingsanwendung in der gymnasialen Analysis, für mehr als eine Variabel geben würde, womit man mit Hilfe von Analysis zum Ziel kommt. Jedoch stelle ich mir vor, dass selbst wenn man mit Rücksicht auf alle 3 Variabeln ableitet
FQS(x,y,z)=[(x+y+z)(x)/(6-x+y)-0.001]²+[(x+y+z)/(56-2*z)-0.249]²+[(x+y+2*z)*(x+z)/(2-3x)-4]² und FQS’(x,y,z) bildet, das nicht hilft. Ich weiss zwar aus meinem Mathe-Lk, dass man sehr leicht per Taschenrechner eine Ableitung für komplizierte Funktion von Typ f(x) an einem Punkt x1 errechnen kann, jedoch hat man hier in diesem Fall, FQS(x,y,z), wieder Probleme mit 3 (oder mehr) Variabeln.

Vielen Dank für ein paar Informationen von Experten!

Gruss
Ben

Also, wenn … das mit der Fehlerquadratur und dem Excel ist schon keine ganz schlechte Idee. Wenn man das Problem auf sowas reduzieren kann und man einen Iterationsknecht sucht, ist der Solver echt nicht schlecht. Wenn man aber selber was verstehen oder machen will, ist es eine schlechte Lösung.

Gut, für eindimensionale Funktionen (also irgendwas mit f(x) = 0) scheinst Du ja die entsprechenden Verfahren zu kennen. Ich werd mal noch ebend kurz etwas resümieren, damit wir beide über das gleiche reden. Und weil mir der Newton am besten gefällt werd ich den erklären.

Erstmal muß ich darauf hinweisen, daß Newton nur Nullstellen sucht. Wenn Du also eine Funktion g(x) = a mit a != 0 hast, mußt Du die umformen zu f(x) = g(x)-a = 0, klar. Was wird denn nun eigentlich genau gemacht? Die Funktion wird in einem Punkt linarisiert, von dieser Linearisierung wird die Nullstelle bestimmt und das ist der neue Punkt für die nächste Linearisierung. Ausgehend von f(x) ist am Punkt x0 eine linarisierte Funktion
phi(x)=f’(x0)*(x - x0) + f(x0).
Die Nullstelle davon ist
phi(x)=0 -> x = x0 - f(x0)/f’(x0).
Das dürfte Dir vielleicht bekanntvorkommen, weil es genau das ist, was man nach NEWTON machen muß.

Und genau das machen wir jetzt für mehrdimensionale Funktionen. Wir gehen von einer Funktion fn(xk) aus. Die hochgestellten Indezes laufen immer von 1…N bzw. 1…K usw. Sind keine Potenzen, sondern Laufindezes, x1 würde dem x in Deinem Beispiel entsprechen, x2 dem y, x3 dem z usw. je nachdem, wieviele Du noch hast. Vorzugsweise sollte N==K sein, also Du solltest genausoviele Gleichungen wie Unbekannte haben. Das ist nicht zwingend, aber notwendige Bedingung für eindeutige Lösbarkeit. In Deinem Fall ist diese Bedingung auch erfüllt. Alles, was wir jetzt noch machen ist die Linearisierung an der Stelle xk0 (jetzt wird vielleicht auch klar, warum hochgestellt und tiefgestellt: die hochgestellten laufen durch Variablen- oder Funktionslisten, die tiefgestellten durch die Iteration):
phin(x)=D(fn)(xk0) * (xk - xk0) + fn(xk0)
Bei näherer Betrachtung ist das fast das gleiche wie bei der eindimensionalen NEWTON-Iteration. Was noch zu klären wäre ist vielleicht das D(fn)(xk0). Das Dingens nennt man Jakobi-Matrix. Und zwar wird für das Element (i)(j) so einer Matrix die erste partielle Ableitung von fi nach xj an der Stelle xj0 gebildet. Wissen Zivis, was eine partielle Ableitung ist? Ach, ich mach später sowieso noch ein Beispiel. Und für das Dingens wird jetzt ganz normal 'ne Nullstelle gesucht. Also
phin(x) = 0 -> xk = xk0 - fn(xk0)*(D(fn)(xk0))-1.
Die ()-1 am Ende um die Jakobi-Matrix bedeutet, daß die Inverse gemeint ist. Das ist auch der Grund, warum genausoviele Gleichungen wie Variablen da sein sollten, weil sonst diese Matrix nicht quadratisch wäre und man sich nur Ärger damit einhandelt. Matrizeninversion? Hm, das sind irgendwie alles nicht gerade Sachen, die man aus dem Abi mitbringt oder während des Zivildienstes lernt. Egal, am Beispiel wird’s vielleicht klar. Das dabei ermittelte xk ist wieder Startpunkt für die neue Linearisierung usw.

Jetzt Dein Beispiel:

0.001 =(x+y+z)(x) /(6-x+y)
0.24 =(x+y+z)/(56-2*z)
4=(x+y+2*z)*(x+z)/(2-3x)

Formen wir erstmal um:

(x + y + z)(x) /(6 - x + y) - 0.001 =0
(x + y + z)/(56 - 2*z) - 0.24 =0
(x + y + 2*z)*(x + z)/(2 - 3x) - 4 =0

Um mal auf die Notation oben zu verweisen wäre jetzt
f1(xk) = f1(x1, x2, x3) = f1(x, y, z) = (x + y + z)(x) /(6 - x + y) - 0.001
f2(xk) = f1(x1, x2, x3) = f2(x, y, z) = (x + y + z)/(56 - 2*z) - 0.24
f3(xk) = f1(x1, x2, x3) = f3(x, y, z) = (x + y + 2*z)*(x + z)/(2 - 3x) - 4

Zuerst mußt Du Dir einen Anfangspunkt suchen. Ich hab keine Ahung, wo der sein könnte, nehmen wir also

xk0 = (x0, y0, z0).

Jetzt die Jakobi-Matrix und die Sache mit den partiellen Ableitungen: man tut einfach so, als sei die Funktion nur von einer Variable abhängig, nämlich von der, nach der man ableitet. Alle anderen sieht man als konstant an. Zum Beispiel bei der … ähm … ih, die enthalten ja alle Brüche … naja, muß ich durch. Nemen wir die dritte und leiten sie nach z ab:
s/w=u*v/w = (x + y + 2*z)*(x + z)/(2 - 3x)
(Die 4 hab ich gleich mal weggelassen, weil die durch die Ableitung eh rausfällt.)
So, wie war das jetzt…

s’ = (u*v)’ = u’*v + u*v’ =
2*(x + z) + (x + y + 2z)*1 =
2x + 2z + x + y + 2z = 3x + y + 4z

(s/w)’ = (s’*w - s*w’)/w² =
((3x + y + 4z)*(2 - 3x) - (x + y + 2*z)*(x + z)*0)/(2 - 3x)² =
(3x + y + 4z)*(2 - 3x)/(2 - 3x)² =
(3x + y + 4z)/(2 - 3x)

Puh, verstanden? Mit den anderen geht das analog, ich will jetzt nicht alles auseinanderklamüsern.
Am Ende erhälst Du eine Jakobi-Matrix, die so aussehen dürfte (Wie stell ich das gleich dar?):

  1. Zeile:
    (12x-x²+2xy+6y+y²+6z+zy)/(6-x+y)² | x*(6-2x-z)/(6-x+y)² | x/(6-x+y)
  2. Zeile:
    1/(56 - 2z) | 1/(56 - 2z) | (28+x+y)/2/(-28+z)²
  3. Zeile:
    (4x-3x²+6z+2y+3yz+6z²)/(-2+3x)² | (x+z)/(2-3x) | (3x+4z+y)/(2-3x)

Bitte nochmal nachrechnen, können sich Fehler eingeschlichen haben. In der ersten Zeile geht’s nur um f1, zweite f2 usw., erste Spalte ist partielle Ableitung nach x, zweite nach y usw. Das läßt sich für beliebig große Systeme entsprechend fortsetzen. In diese Matrix setzt Du jetzt das xk0 ein. Und da das konkrete Zahlenwerte enthält erhälst Du eine Matrix nur mit Zahlen. Jetzt geht’s an die Inversion. Setz 'nen Taschenrechner drauf an oder ein Computerrechensystem. Oder greif Dir ein Buch [1] und find’s selber raus. Wie sowas geht würde den Rahmen deutlich sprengen. Außerdem gibt’s für numerisch bestückte Matrizen ausgefeilte Algorithmen, wie man sowas am günstigsten machen kann, besonders für große und spärlich besetzte Matrizen hat die FEM da gute Methoden entwickelt. Ich schweife ab.
So, dann mußt Du noch in die Funktionen fn das xk0 einsetzen, dann mußt Du bissl wissen, wie man mit Matrizen rechnet, alles zusammenwürfeln und Du kriegst Deinen neuen Punkt für die Linearisierung.
War das jetzt verständlich? Wenn nicht, dann frag nach, am besten per Mail, und wir werden versuchen den Problemen gemeinsam auf die Schliche zu kommen.
Das Zentrum.

[1] Bronstein-Semendjajew: Taschenbuch der Mathematik;

1 „Gefällt mir“

Diese Gleichungen sind nicht unbedingt der Gestalt,
die der numerischen Lösung leicht zugänglich ist.
Ich würde es mit dem einfachsten algorithmus,
der regula falsi probieren. Aber Achtung, die Lösung
kann oszillieren!

Harald

Ich habe kurz einmal „Gradientenverfahren“ und
Marquardt-Levenberg-Algorithmus in eine Suchmaschine
eingegeben. Dabei schien das erste Verfahren nur für lineare
Gleichungen zu gelten, stimmt das?

Das stimmt nicht und nachdem Zentrum bereits das Newton-Verfahren erläutert hat, werde ich nun ein wenig zur Optimierung nach dem Gradientenverfahren schreiben:

jedoch hat man hier in diesem Fall,
FQS(x,y,z), wieder Probleme mit 3 (oder mehr) Variabeln.

Genau an diesem Punkt setzt das Gradientenverfahren an, indem es ein Optimierungsproblem mit mehreren Parametern auf ein Probelm mit nur einem Parameter zurückführt und dieses dann mit einer eindimensionalen Optimierung löst.

Dazu wird das Problem

FQS(x,y,z) => Min.

überführt in das Optimierungsproblem

FQS(t) = FQS[(x0, y0,z0)-t*grad FQS(x0, y0,z0)] => Min.

Man sucht also an einem Punkt (x0, y0,z0) die Abstiegsrichtung, indem man den Gradienten der Funktion durch Ableitung nach allen gesuchten Parametern bildet und bewegt sich dann in entgegengesetzer Richtung dieses Gradienten, bis die Fehlerquadratsumme minimal wird. Dort berechnet man erneut die Absteigsrichtung usw.

Man kann den Gradienten in diesem Fall zwar analytisch berechnen, aber wenbn man das Verfahren möglichst universell gestalten will, dann bietet sich eine Näherungslösung an, indem man anstelle des Differentialquotienten den Differenzenquotienten verwendet. Die Näherung für den Gradienten lautet dann

( FQS(x0+d, y0,z0) - FQS(x0, y0,z0)]/d )
( [FQS(x0, y0+d,z0) - FQS(x0, y0,z0)]/d )
( FQS(x0, y0,z0+d) - FQS(x0, y0,z0)]/d )

Für das so erhaltene eindimensionale Optimierungsproblem stehen eine Reihe von Lösungsverfahren zur Verfügung.

In der Nähe des Minimums verwende ich (wegen seiner Einfachheit) das DSCP-Verfahren, bei dem durch drei Funktionswerte von FQS(t) eine Parabel gelegt wird, deren Minimum als Ausgangspunkt für den nächsten Iterationsschritt herhalten muß.

Sehr robust (weil es sich um einen Suchalgorithmus handelt) ist auch das Verfahren des goldenen Schnittes. Dazu wählt man sich zunächst ein Intervall (l,r), innerhalb dessen man das Minimum vermutet und berechnet die Funktionswerte von FQS(t) an zwei Positionen t1 und t2 innerhalb des Intervalls. Die Positionen werden dabei nach dem goldenen Schnitt gewählt:

t1 = l+(r-l)*(3-wurzel(5))/2 und t2 = r-(r-l)*(3-wurzel(5))/2

Ist nun FQS(t1) kleiner als FQS(t2) dann setzt man

l’ = t1, t1’ = t2 und
t2’ = r-(r-l’)*(3-wurzel(5))/2

andernfalls

r’ = t2, t2’ = t1 und
t1’ = l+(r’-l)*(3-wurzel(5))/2

Durch die Verwendung des goldenen Schnittes muß dabei (im Gegensatz zum Halbierungsverfahren) in jedem Iterationsschritt nur ein neuer Funktionswert berechnet werden.

Darüber hinaus gibt es natürlich noch eine Vielzahl weiterer Algorithmen, die für den linearen Schritt des Gradientenverfahrens verwendet werden können. Im Einfachsten Fall kann man übrigens vollständig auf die lineare Minimierung verzichten und nur einen einzigen Schritt in Richtung der Abstiegsrichtung machen, wobei die Schrittweite im Laufe des Verfahrens verringert wird (z.B. durch halbierung der Schrittweite wenn das Verfahren zu oszillieren beginnt).

Vielen Dank für den Vorschlag!

Gibt es hier nicht auch Probleme eine Funktion bzw. Gleichungen mit 3 Variabeln zu lösen. Das Vorgeschlagene Verfahren ist im Grunde ja „nur“ eine Vorstufe des Newtonschen Annäherungsverfahrens, oder?

Gruss

Ben

Vielen Dank Zentrum! Vielen Dank MrStupid!

Ich möchte mich herzlich für die Darstellung beider Verfahren bedanken. Sie sind recht komplex, jedoch werde ich versuchen mich intensiv damit auseinandersetzen.

Als ich die Frage nach einem geeigneten Annäherungsverfahren gestellt hatte, dachte ich es gebe recht simple Lösungen. Als ich mich gestern im Internet umgeschaut habe, stellte ich fest, dass es extra sehr teure Spezialprogramme für diesen Zweck gibt.

Alles Gute

Ben

Man möge mir verzeihen, wenn ich die Frage beantworte:

Das Newton-Verfahren und Regula Falsi sind fast identisch. Einziger Unterschied ist folgender: beim Newton (egal, ob für einzelne Gleichungen oder Systeme) werden analytisch gegebene Funktionen verwendet, von denen kann man auch (meistens) analytische Ableitungen bilden. Manchmal hat man aber Funktionen auch nur durch Stützstellen gegeben. Oder sie sind von einer Koplexität, daß sich die Ableitung einfach nicht mehr „bewältigen“ lassen. Dann geht man von dem Differentialquotienten zum Differenzenquotienten über:

df/dx -> Df/Dx

wobei

Df/Dx = (f(x1) - f(x0))/(x1 -x0)

Das ist dann nicht mehr der Anstieg der Tangente am Punkt x0, sondern der Sekante durch x0 und x1, eine durchaus übliche Näherung. Und das kann man sowohl für die Ableitung in der einzelnen Gleichung als auch für partiellen Ableitungen in der Jakobi-Matrix anwenden. Zu sagen, das Regula Falsi eine Vorstufe von Newton ist, ist also nicht ganz richtig, es ist mehr eine Vereinfachung.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Da fällt mir noch ein Verfahren ein:
Man kann sich selbst ein Näherungsverfahren stricken, indem man das Gleichungsystem so um stellt, daß links nur die gesuchten Variablen stehen. Im einfachsten Fall sieht das so aus:

x = x + (x+y+z)(x) /(6-x+y) - 0.001
y = y + (x+y+z)/(56-2*z) - 0.24
z = z + (x+y+2*z)*(x+z)/(2-3x) - 4

Jetzt setzt man auf den rechten Seiten der Gleichungen die Startwerte ein und erhält auf der linken Seite den Startwert für den nächsten Iterationsschritt.

Dieses Verfahren hat allerdings einen gewaltigen Haken welcher darin besteht, daß es manchmal divergiert. Soweit ich weiß gibt es auch ein Konvergenzkriterium, mit dem man das im Vorfeld testen kann. Aber ich kann mich leider nicht mehr erinnern, wie das aussieht.

Fixpunktiteration
Hi, MrStupid,

das von Dir erwähnte Verfahren heißt Fixpunktiteration.

Man berechnet nach der Vorschrift

(*) xn+1 = f(xn)

bei vorgegebenem x0 eine Folge.

Dieses Verfahren hat allerdings einen gewaltigen Haken welcher
darin besteht, daß es manchmal divergiert. Soweit ich weiß
gibt es auch ein Konvergenzkriterium, mit dem man das im

Man finde eine Metrik d und eine reelle Zahl q