Fonction fzero MATLAB

Ammar Ali 15 février 2024
Fonction fzero MATLAB

Ce tutoriel discutera de la recherche des racines d’une fonction non linéaire à l’aide de la fonction fzero() dans MATLAB.

Fonction fzero() de MATLAB

La fonction fzero() est utilisée pour trouver les racines d’une fonction non linéaire. La fonction utilise différentes méthodes d’interpolation comme les méthodes de sécante et de bissection pour trouver les racines de la fonction non linéaire donnée.

La syntaxe de base de la fonction fzero() est ci-dessous.

roots = fzero(fun, x0);

La syntaxe ci-dessus renverra les racines du fun à partir du point x0. Par exemple, trouvons la valeur de pi en trouvant les racines de la fonction sine près de 3.

Voir le code ci-dessous.

clc
clear

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

Production:

value = 3.1416

Les commandes clc et clear sont utilisées pour effacer la commande et la fenêtre de l’espace de travail dans le code ci-dessus. Comme nous pouvons le voir dans la sortie, la valeur renvoyée par la fonction fzero() est approximativement égale à la valeur de pi.

Au lieu de passer un seul point comme point de départ, nous pouvons également passer un intervalle pour trouver la racine de la fonction non linéaire donnée. Par exemple, trouvons la racine de la fonction cosine dans l’intervalle de 1 à 3.

Voir le code ci-dessous.

clc
clear

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

Production:

value = 1.5708

Notez que les valeurs de la fonction aux extrémités de l’intervalle doivent différer en signe ; sinon, il y aura une erreur, et si l’erreur apparaît, nous devons changer le signe d’une des valeurs d’intervalle. Nous n’avons pas utilisé de valeurs d’intervalle avec des signes différents dans le code ci-dessus car les signes cos(1) et cos(3) diffèrent déjà.

Notez que la fonction d’entrée dont nous voulons trouver la racine ne doit avoir qu’un seul paramètre, et si elle a plus d’un paramètre, nous devons passer les valeurs des autres paramètres avant de trouver la racine. Par exemple, créons une fonction avec deux paramètres, transmettons la valeur d’un paramètre, puis trouvons la racine de la fonction.

Voir le code ci-dessous.

clc
clear

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

Production:

x = 0.5236

Dans la sortie ci-dessus, nous avons passé la fonction f_1 dans la fonction fzero() car la fonction f contient deux paramètres, et sa racine ne sera pas évaluée à moins que nous passions la valeur d’un paramètre.

Nous pouvons également définir d’autres options à l’intérieur de la fonction fzero() comme tracé du point actuel ou de la valeur de la fonction à l’aide de l’argument PlotFcns, en définissant la valeur de tolérance qui est définie par défaut sur 2.2e-16 à l’aide de l’argument TolX, sorties des fonctions qui seront appelées à chaque itération de la fonction fzero() à l’aide de l’argument OutputFcn, vérifier la valeur de la fonction objectif à l’aide de l’argument FunValCheck, et le niveau d’affichage à l’aide de l’argument Display.

Pour définir les options, nous devons créer une structure de toutes les options à l’aide de la fonction optimset(). Par exemple, définissons les options ci-dessus pour une fonction non linéaire.

Voir le code ci-dessous.

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)

Production:

Zero found in the interval [-0.412, 0.612]

x = 0.5236

graphique de la fonction fzero

Dans la sortie ci-dessus, nous pouvons voir l’intervalle où zéro a été trouvé, et nous pouvons également voir le tracé du point actuel et le tracé des valeurs de fonction à différentes itérations.

L’option d’affichage a quatre types off pour aucune sortie, iter pour la sortie à chaque itération, final pour la sortie finale uniquement et notifier pour la sortie uniquement si la fonction ne converge pas.

On peut régler l’option FunValCheck sur on ou off, et si elle est sur on, la fonction affichera une erreur si la sortie est infini, NaN, ou complexe, et si elle est réglé sur off, aucune erreur ne s’affichera.

On peut aussi trouver la racine d’une fonction en la définissant comme une structure de problème à l’aide de l’argument problem.

Nous allons utiliser la commande problem.objective pour définir la fonction. Nous utiliserons la commande problem.x0 pour initialiser le point de départ ou l’intervalle.

Nous utiliserons la commande problem.solver pour définir la méthode de résolution. Nous pouvons utiliser la commande problem.options pour définir les options.

Le problème de nom peut changer pour n’importe quel caractère ou chaîne. Par exemple, utilisons la structure du problème pour trouver la racine d’une fonction non linéaire.

Voir le code ci-dessous.

clc
clear

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

Production:

root =

    1.8115

Nous pouvons également obtenir d’autres informations de la fonction fzero() comme la valeur de la fonction, le drapeau de sortie, qui indiquera la condition de sortie, et les informations sur le processus de recherche de la racine.

Le drapeau de sortie peut renvoyer 1 (qui indique que la fonction a convergé), 1 (qui indique que l’algorithme s’est terminé en raison de la sortie ou de la fonction de tracé), -3 (qui indique l’infini ou que la valeur NaN a été rencontré), -4 (qui indique qu’une valeur complexe a été rencontrée), -5 (qui indique que l’algorithme a convergé vers un point singulier) et -6 (qui indique que la fonction n’a pas détecté de changement de signe ).

Par exemple, trouvons la racine d’une fonction non linéaire et obtenons toutes les informations sur le processus. Voir le code ci-dessous.

clc
clear

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

Production:

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]'

La fonction a également renvoyé l’intervalle entre les itérations, le nombre total d’itérations et l’algorithme utilisé pour trouver la racine de la fonction non linéaire. Consultez ce lien pour plus de détails sur la fonction fzero().

Auteur: 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