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
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()
.