Función fzero MATLAB

Ammar Ali 15 febrero 2024
Función fzero MATLAB

Este tutorial discutirá cómo encontrar las raíces de una función no lineal usando la función fzero() en MATLAB.

Función fzero() de MATLAB

La función fzero() se utiliza para encontrar las raíces de una función no lineal. La función utiliza diferentes métodos de interpolación como métodos de bisección y secante para encontrar las raíces de la función no lineal dada.

La sintaxis básica de la función fzero() se encuentra a continuación.

roots = fzero(fun, x0);

La sintaxis anterior devolverá las raíces de la fun a partir del punto x0. Por ejemplo, encontremos el valor de pi encontrando las raíces de la función seno cerca de 3.

Vea el código a continuación.

clc
clear

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

Producción :

value = 3.1416

Los comandos clc y clear se utilizan para borrar el comando y la ventana del espacio de trabajo en el código anterior. Como podemos ver en la salida, el valor devuelto por la función fzero() es aproximadamente igual al valor de pi.

En lugar de pasar un solo punto como punto de partida, también podemos pasar un intervalo para encontrar la raíz de la función no lineal dada. Por ejemplo, encontremos la raíz de la función coseno en el intervalo de 1 a 3.

Vea el código a continuación.

clc
clear

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

Producción :

value = 1.5708

Tenga en cuenta que los valores de la función en los extremos del intervalo deben diferir en signo; de lo contrario, habrá un error, y si aparece el error, tenemos que cambiar el signo de uno de los valores del intervalo. No usamos valores de intervalo con signos diferentes en el código anterior porque los signos cos(1) y cos(3) ya son diferentes.

Tenga en cuenta que la función de entrada cuya raíz queremos encontrar debe tener un solo parámetro, y si tiene más de un parámetro, debemos pasar los valores de los otros parámetros antes de encontrar la raíz. Por ejemplo, creemos una función con dos parámetros, pasemos el valor de un parámetro y luego encontremos la raíz de la función.

Vea el código a continuación.

clc
clear

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

Producción :

x = 0.5236

En el resultado anterior, pasamos la función f_1 dentro de la función fzero() porque la función f contiene dos parámetros y su raíz no se evaluará a menos que pasemos el valor de un parámetro.

También podemos configurar algunas otras opciones dentro de la función fzero() como el gráfico del punto actual o el valor de la función usando el argumento PlotFcns, configurando el valor de tolerancia que por defecto está configurado en 2.2e-16 usando el TolX, funciones de salida que se llamarán en cada iteración de la función fzero() mediante el argumento OutputFcn, comprobar el valor de la función objetivo mediante el argumento FunValCheck y el nivel de visualización mediante el Argumento Display.

Para configurar las opciones, tenemos que hacer una estructura de todas las opciones usando la función optimset(). Por ejemplo, configuremos las opciones anteriores para una función no lineal.

Vea el código a continuación.

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)

Producción :

Zero found in the interval [-0.412, 0.612]

x = 0.5236

gráfica de la función fzero

En el resultado anterior, podemos ver el intervalo en el que se ha encontrado el cero y también podemos ver la gráfica del punto actual y la gráfica de los valores de la función en diferentes iteraciones.

La opción de visualización tiene cuatro tipos desactivados para que no haya salida, iter para salida en cada iteración, final para solo salida final y notificación para salida solo si la función no converge.

Podemos configurar la opción FunValCheck en on o off, y si está en on, la función mostrará un error si la salida es infinita, NaN o compleja, y si es configurado en off, no se mostrará ningún error.

También podemos encontrar la raíz de una función definiéndola como una estructura de problema usando el argumento problem.

Usaremos el comando problem.objective para definir la función. Usaremos el comando problem.x0 para inicializar el punto o intervalo de partida.

Usaremos el comando problem.solver para definir el método de resolución. Podemos usar el comando problem.options para configurar las opciones.

El problema del nombre puede cambiar a cualquier carácter o cadena. Por ejemplo, usemos la estructura del problema para encontrar la raíz de una función no lineal.

Vea el código a continuación.

clc
clear

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

Producción :

root =

    1.8115

También podemos obtener otra información de la función fzero() como el valor de la función, el indicador de salida, que indicará la condición de salida, y la información sobre el proceso de búsqueda de raíces.

El indicador de salida puede devolver 1 (que indica que la función convergió), -1 (que indica que el algoritmo finalizó debido a la función de salida o gráfica), -3 (que indica infinito o el valor NaN fue encontrado), -4 (que indica que se encontró un valor complejo), -5 (que indica que el algoritmo convergió en un punto singular) y -6 (que indica que la función no detectó un cambio en el signo ).

Por ejemplo, encontremos la raíz de una función no lineal y obtengamos toda la información sobre el proceso. Vea el código a continuación.

clc
clear

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

Producción :

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 función también devolvió el intervalo entre las iteraciones, el número total de iteraciones y el algoritmo utilizado para encontrar la raíz de la función no lineal. Consulte este enlace para obtener más detalles sobre la función 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