2 Gnu Octave |
Mit
[Lösung, Abweichung, Info] = fsolve(Funktion, Startpunkt [, Optionen]);
wird nach Nullstellen der angegebenen Funktion gesucht. Diese Funktion verarbeitet einen Vektor mit n Elementen als Eingabe und gibt als Ergebnis einen Vektor mit m Elementen zurück. Wird in den Optionen die Option "Jacobian" aktiviert, muss die Funktion eine Liste mit 2 Vektoren zurückgeben: Funktionswert und Jacobi-Matrix (erste Ableitung aller Ergebniskomponenten nach allen Argumentkomponenten).
Im Beispiel soll der Schnittpunkt der drei Flächen
bestimmt werden, siehe Abb. ganz oben.
Aus
ergibt sich das Gleichungssystem:
Mit
ergibt sich:
Für die numerische Lösung mit Octave müssen wir unser Gleichungssystem in Octave-Notation bringen:
Mit der Datei
# Nichlineares Gleichungssystem
# Die Funktion berechnet zwei Rueckgabewerte
# - Ergebnisvektor (Funktionswert)
# - Jacobi-Matrix, nur falls benoetigt
function [y, jmf] = f(x)
y = zeros(2,1);
y(1) = 10 / (x(1)+x(2)) -1 - sqrt(10 - x(1) - x(2));
y(2) = 10 / (x(1) + x(2)) - 10 / (5 + x(1) - x(2));
if nargout > 1
jmf = zeros(2, 2);
jmf(1,1) = 1/(2*sqrt(10-x(1)-x(2))) - 10/((x(1)+x(2))^2);;
jmf(1,2) = 1/(2*sqrt(10-x(1)-x(2))) - 10/((x(1)+x(2))^2);
jmf(2,1) = 10/((5+x(1)-x(2))^2) - 10/((x(1)+x(2))^2);
jmf(2,2) = -10/((x(1)+x(2))^2) - 10/((5+x(1)-x(2))^2);
endif
endfunction
[x, v, info] = fsolve(@f, [0.5; 2.0], optimset("jacobian", "on"));
if (1 == info)
printf("x = %g\ny = %g\nz = %g\n", x(1), x(2), (10/(x(1)+x(2))));
else
printf("Leider keine Loesung gefunden!\n")
end
wird die Lösung
x = 0.201562 y = 2.5 z = 3.70156
gefunden.
Die Octave-Funktion f(x) berechnet die
Funktionswerte und falls mehrere Rückgabewerte verlangt werden auch
die Jacobi-Matrix.
Für beide Rückgabewerte wird zunächst mit zeros() ein mit
Nullen gefüllter Vektor bzw. eine mit Nullen gefüllte Matrix mit
den erforderlichen Abmessungen angelegt. Anschließend werden die
berechneten Werte in den Ergebnisvektor bzw. die Ergebnismatrix
eingetragen.
Siehe auch Beispiel Berechnungen am Trigger.