MATLAB fzero-Funktion

Ammar Ali 15 Februar 2024
MATLAB fzero-Funktion

Dieses Tutorial behandelt das Finden der Nullstellen einer nichtlinearen Funktion mit der Funktion fzero() in MATLAB.

MATLAB-Funktion fzero()

Die Funktion fzero() wird verwendet, um die Wurzeln einer nichtlinearen Funktion zu finden. Die Funktion verwendet verschiedene Interpolationsmethoden wie Sekanten- und Halbierungsmethoden, um die Wurzeln der gegebenen nichtlinearen Funktion zu finden.

Die grundlegende Syntax der Funktion fzero() ist unten.

roots = fzero(fun, x0);

Die obige Syntax gibt die Wurzeln des fun ab dem Punkt x0 zurück. Lassen Sie uns zum Beispiel den Wert von Pi finden, indem wir die Wurzeln der sine-Funktion in der Nähe von 3 finden.

Siehe Code unten.

clc
clear

f = @sin;
x0 = 3;
value = fzero(f,x0)

Ausgabe:

value = 3.1416

Die Befehle clc und clear werden verwendet, um den Befehl und das Arbeitsbereichsfenster im obigen Code zu löschen. Wie wir in der Ausgabe sehen können, ist der von der Funktion fzero() zurückgegebene Wert ungefähr gleich dem Wert von pi.

Anstatt einen einzelnen Punkt als Startpunkt zu übergeben, können wir auch ein Intervall übergeben, um die Wurzel der gegebenen nichtlinearen Funktion zu finden. Lassen Sie uns zum Beispiel die Wurzel der cosine-Funktion im Intervall von 1 bis 3 finden.

Siehe Code unten.

clc
clear

f = @cos;
x0 = [1 3];
value = fzero(f,x0)

Ausgabe:

value = 1.5708

Beachten Sie, dass sich die Werte der Funktion an den Endpunkten des Intervalls im Vorzeichen unterscheiden sollten; Andernfalls tritt ein Fehler auf, und wenn der Fehler auftritt, müssen wir das Vorzeichen eines der Intervallwerte ändern. Wir haben im obigen Code keine Intervallwerte mit unterschiedlichen Vorzeichen verwendet, da sich die Vorzeichen von cos(1) und cos(3) bereits unterscheiden.

Beachten Sie, dass die Eingabefunktion, deren Wurzel wir finden möchten, nur einen Parameter haben sollte, und wenn sie mehr als einen Parameter hat, müssen wir die Werte der anderen Parameter übergeben, bevor wir die Wurzel finden. Lassen Sie uns beispielsweise eine Funktion mit zwei Parametern erstellen, den Wert eines Parameters übergeben und dann die Wurzel der Funktion finden.

Siehe Code unten.

clc
clear

f = @(x,c) cos(c*x);
c = 3;
f_1 = @(x) f(x,c);
x = fzero(f_1,0.1)

Ausgabe:

x = 0.5236

In der obigen Ausgabe haben wir die Funktion f_1 innerhalb der Funktion fzero() übergeben, da die Funktion f zwei Parameter enthält und ihre Wurzel nicht ausgewertet wird, es sei denn, wir übergeben den Wert eines Parameters.

Wir können auch einige andere Optionen innerhalb der Funktion fzero() als Plot des aktuellen Punkts oder Funktionswerts mit dem Argument PlotFcns festlegen, indem wir den Toleranzwert festlegen, der standardmäßig auf 2.2e-16 eingestellt ist, indem wir das TolX-Argument, Ausgabefunktionen, die bei jeder Iteration der fzero()-Funktion mit dem OutputFcn-Argument aufgerufen werden, den Wert der Zielfunktion mit dem FunValCheck-Argument prüfen und die Anzeigeebene mit dem Display-Argument.

Um die Optionen zu setzen, müssen wir mit der Funktion optimset() eine Struktur aller Optionen erstellen. Lassen Sie uns beispielsweise die obigen Optionen für eine nichtlineare Funktion festlegen.

Siehe Code unten.

clc
clear

f = @(x,c) cos(c*x);
c = 3;
f_1 = @(x) f(x,c);
options = optimset('PlotFcns',{@optimplotx,@optimplotfval},'Display','final','FunValCheck','on','TolX',1.1e-16);
x = fzero(f_1,0.1,options)

Ausgabe:

Zero found in the interval [-0.412, 0.612]

x = 0.5236

fzero-Funktionsplot

In der obigen Ausgabe können wir das Intervall sehen, in dem Null gefunden wurde, und wir können auch das Diagramm des aktuellen Punkts und das Diagramm der Funktionswerte bei verschiedenen Iterationen sehen.

Die Anzeigeoption hat vier Arten von Aus für keine Ausgabe, iter für die Ausgabe bei jeder Iteration, final für nur die endgültige Ausgabe und Notify für die Ausgabe nur, wenn die Funktion nicht konvergiert.

Wir können die Option FunValCheck auf on oder off setzen, und wenn sie auf on eingestellt ist, zeigt die Funktion einen Fehler an, wenn die Ausgabe unendlich, NaN oder komplex ist, und wenn dies der Fall ist auf off gestellt, wird kein Fehler angezeigt.

Wir können die Wurzel einer Funktion auch finden, indem wir sie mit dem Argument problem als Problemstruktur definieren.

Wir werden den Befehl problem.objective verwenden, um die Funktion zu definieren. Wir werden den Befehl problem.x0 verwenden, um den Startpunkt oder das Intervall zu initialisieren.

Wir werden den Befehl problem.solver verwenden, um die Lösungsmethode zu definieren. Wir können den Befehl problem.options verwenden, um die Optionen festzulegen.

Das Namensproblem kann sich in ein beliebiges Zeichen oder eine Zeichenfolge ändern. Lassen Sie uns beispielsweise die Problemstruktur verwenden, um die Wurzel einer nichtlinearen Funktion zu finden.

Siehe Code unten.

clc
clear

p.objective = @(x)sin(cosh(x));
p.x0 = 1;
p.solver = 'fzero';
p.options = optimset(@fzero);
root = fzero(p)

Ausgabe:

root =

    1.8115

Wir können auch andere Informationen von der Funktion fzero() erhalten, wie den Funktionswert, das Exit-Flag, das die Exit-Bedingung anzeigt, und die Informationen über den Prozess der Wurzelfindung.

Das Exit-Flag kann 1 (was anzeigt, dass die Funktion konvergiert ist), -1 (was anzeigt, dass der Algorithmus aufgrund der Ausgabe- oder Plot-Funktion beendet wurde), -3 (was anzeigt, dass der Wert unendlich oder NaN war gefunden), -4 (was anzeigt, dass ein komplexer Wert aufgetreten ist), -5 (was anzeigt, dass der Algorithmus zu einem singulären Punkt konvergiert ist) und -6 (was anzeigt, dass die Funktion keine Änderung des Vorzeichens erkannt hat ).

Lassen Sie uns zum Beispiel die Wurzel einer nichtlinearen Funktion finden und alle Informationen über den Prozess erhalten. Siehe Code unten.

clc
clear

Myfun = @(x) exp(-exp(-x)) - x;
x0 = [0 1];
[root fval exitflag output] = fzero(Myfun,x0)

Ausgabe:

root =

    0.5671


fval =

     0


exitflag =

     1


output =

  struct with fields:

    intervaliterations: 0
            iterations: 5
             funcCount: 7
             algorithm: 'bisection, interpolation'
               message: 'Zero found in the interval [0, 1]'

Die Funktion gab auch das Intervall zwischen den Iterationen, die Gesamtzahl der Iterationen und den Algorithmus zurück, der verwendet wurde, um die Wurzel der nichtlinearen Funktion zu finden. Überprüfen Sie diesen Link für weitere Details über die Funktion fzero().

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook