Solución de ecuaciones no lineales con matlab Zagalo Enrique Suárez Aguilar y Omaida Sepúlveda Delgado
[email protected], omaida.sepulveda.uptc.edu.co
Abstract
Se resuelven ecuaciones no lineales utilizando funciones incorporadas de toolbox simbólico de matlab, implementación de métodos numericos en procedimientos, funciones y utilizando la unidad grá…ca.
1
Acer Acerca ca de este este ta tall ller er
El taller pretende mostar aplicaciones de matlab en diferentes niveles para resolver ecuaciones no lineales. Se desarrolla en dos sesiones. En la primera sesión se hace una exploración de matlab, las diferentes ventanas, herramientas del toolbox simbólico y métodos grá…cos más utilizados aplicandolos para solucionar ecuaciones polinómicas de segundo grado. En la segunda sesión se implementará un procedimiento para la solución de una ecuación cuadrática utilizando la fórmula general, el método numérico de Newton Raphson para resolver ecuaciones no lineales generales utilizando el concepto de función y un proyecto utilizando la unidad de interfaz grá…ca y la función construida..
2 2.1
ECUA ECUACI CION ONES ES NO LINE LINEAL ALES ES Ecuaci Ecuacione ones s polinom polinomica icas s de segu segundo ndo grad grado o ax2 + bx + c = 0
Este Este tipo de ecuació ecuación n se pueden pueden resolve resolverr por varios varios métodos, métodos, los más popu p opular lares es son: son: facfactorización, método numérico, solución de ecuaciones algebraicas, fórmula cuadrática, análisis grá…co de la función y = ax 2 + bx + c. A continuación se exponen y se muestran algunas formas de resolverla utilizando matlab.
1
2.1.1
Factorización
Cuando la ecuación es un trinomio cuadrado perfecto, o aplicando el procedimiento de completación, la ecuación se puede expresar como, ax2 + bx + c = (x + a1)(x + a2 ) = 0 :
(1)
Estos procedimientos se pueden realizar en matlab, utilizando el Symbolic Math Toolbox, la función factor. Por ejemplo para factorizar las siguientes expresiones del lado derecho de cada ecuación, : 9x2 + 6x + 1 = 0; 2x2 + 3x
y + 161 = 0 2x 1 = 0:
4y 2 x2
5 = 0;
En la ventana de comandos , se digita: >> syms x >> factor(9*x^2+6*x+1)
(se da enter y el resultado que aparece es el siguiente)
ans = (3*x+1)^2 >> syms y >> factor(4*y^2-y+1/16) ans = 1/16*(8*y-1)^2 >> factor(2*x^2+3*x-5) ans =(2*x+5)*(x-1) >> factor(x^2-2*x-1) ans =x^2-2*x-1 2.1.2
Método numérico
Cuando no es posible encontrar los factores de la forma (1), matlab tiene incorporada la función fzero que encuentra las raices de funciones no lineales por métodos numéricos, dada la ecuación y el valor inicial Ejemplo .1 Encontrar un cero o raiz de la función y = f (x) = 2 x2 + 3x
x0 = 1:
En la ventana de comandos se digita: >>fzero(’2*x^2+3*x-5’,1) ans =1
2
5; con valor inicial
Para encontrar el otro cero de la función cambiamos el valor incial por x0 = órden en la ventana de comandos:
2; dando la
>> fzero(’2*x^2+3*x-5’,-2) ans = -2.5000
Por tanto para este ejemplo particular, la función fzero da los dos valores de las raices, x1 = 1 y x 2 = 2:5 2.1.3
Solución simbólica de ecuaciones algebraicas
Matlab, en Symbolic Math Toolbox, tiene incorporadas funciones que permiten encontrar soluciones de sistemas de ecuaciones algebraicas, por ejemplo para hallar las soluciones de 2x2 + 3x 5 = 0; se puede utilizar la función solve, digitando en la ventana de comandos:
>>solve(’2*x^2+3*x-5=0’) ans = [ -5/2] [ 1] 2.1.4
Solución utilizando la fórmula cuadrática
La ecuación de segundo grado se puede resolver utilizando la fórmula cuadrática,
p b b 4ac x = : 2
2
2a
En matlab se pueden resolver estas ecuaciones, donde las soluciones pueden ser reales o comple jas, por ejemplo para solucionar la ecuación 2 x2 + 3x 5 = 0; utilizando la fórmula cuadrática, se digita lo siguiente en la ventana de comandos.
>>a=2;b=3;c=-5; >>x1=(-b+sqrt(b^2-4*a*c))/(2*a) x1=1 >>x2=(-b-sqrt(b^2-4*a*c))/(2*a) x2 = -2.5000 2.1.5
Representación grá…ca de una función de segundo grado.
Método fácil
>>ezplot(’9*x^2+6*x+1’) >>grid on >>title(’Funcion de segundo grado’) >>xlabel(’x’)
3
Utilizando vectores
>>x=-6:0.1:6 >>y=9*x.^2+6.*x+1 >>plot(x,y) >>grid on >>title(’Funcion de segundo grado’) >>xlabel(’x’) Gra…ca de la parábola y su vértice
>>a=3;b=-2;c=3; >>h=-b/(2*a) >>k=(4*a*c-b^2)/(4*a) >>x=-6:0.1:6 >>y=a.*x.^2+b.*x+c >>plot(x,y,’r’) >>grid on >>s=[’o(’,num2str(h),’,’,num2str(k),’)’] >>text(h,k,s) 2.1.6
Procedimiento sin utilizar interfaz grá…ca
Se presenta un procedimiento en matlab, empleando las estructuras básicas de programación, para encontrar las raices de una ecuación polinómica de segundo grado con datos de entrada los valores de los coe…cientes, a;b;c; de la función cuadrática, y = f (x) = ax2 + bx + c ; la salida las raices (los ceros) de la función, reales o complejas, la grá…ca de la función, el vértice de la parábola. clc;
%Limpia ventana de comandos
fprintf(’Gr\U{e1}fica de Ecuaciones de segundo grado \n \n’) %Titulo del programa a=input(’Valor del coeficiente de x^2, a=?’);
%Entrada del valor de a
b=input(’Valor del coeficiente de x, b=?’);
%Entrada del valor de b
c=input(’Valor del termino independiente, c=?’);
%Entrada del valor de c
h=-b/(2*a);
%Calculo de la primera coordenada del vertice
k=(4*a*c-b^2)/(4*a);
%Calculo de la segunda coordenada del vertice
x=-20:0.1:20;
%Vector de valores que toma la variable independiente, x
y=0*x;
%y=0
plot(x,y,’r’);
%Grafica el eje x
y=a.*x.^2+b.*x+c;
%Vector de valores que toma la variable dependiente y
hold on;
%Permite graficar varias funciones en un misma figura
4
plot(x,y,’r’);
%Grafica la funcionn y=a*x^2+b*x+c
axis([-20 20 -20 20]);
%Limites de la figura [xmin xmax ymin ymax]
title(’Grafica de Funciones de la forma y=a*x^2+b*x+c’);%Titulo de la grafica xlabel(’x’);
%Etiqueta para el eje de las abscisas
ylabel(’y’);
%Etiqueta para el eje de las ordenadas
grid on;
%Activa la cuadricula de la grafica
s=[’o(’,num2str(h),’,’,num2str(k),’)’]; %Cadena de caracteres para las coordenadas del vertice text(h,k,s);
%Escribe el vertice en la figura
d=b^2-4*a*c;
%Calculo del discriminante
if d>0
%Caso para el cual el discriminate positivo
x1=(-b+sqrt(d))/(2*a);
%Calculo de una ra\U{ed}z por la formula cuadratica
x2=(-b-sqrt(d))/(2*a);
%Calculo de otra raiz por la formula cuadratica
fprintf(’Raices reales distintas x1=%10.2f x2=%10.2f \n’,x1,x2); %Escribe raices en la ventana de comandos s1=[’o(’,num2str(x1),’,’,num2str(0),’)’]; text(x1,0,s1);
%Escribe las coordenadas de una ra\U{ed}z en la figura
s2=[’o(’,num2str(x2),’,’,num2str(0),’)’]; text(x2,0,s2);
%Cadena de caracteres para una raiz %Cadena de caracteres para la otra raiz
%Escribe las coordenadas de la otra raiz en la grafica
end
%Fin para el caso discriminante positivo
if d==0
%Caso cuando el discriminate es 0
x1=-b/(2*a);
%Calculo de una raiz
x2=x1;
%Raiz repetida
fprintf(’Raices reales repetidas x1=%10.2f x2=%10.2f \n’,x1,x2); %Escribe raices en la ventana de comandos end
%Fin para el caso discriminante cero
if d<0
%Caso discriminante negativo
x1=(-b+sqrt(d))/(2*a);
%Calculo de la primera raiz compleja
x2=(-b-sqrt(d))/(2*a);
%Calculo de la raiz conjugada
fprintf(’raices complejas conjugadas x1=’) %Escribe en la ventana de comandos
end
disp(x1)
%Escribe la raiz compleja en la ventana de comandos
fprintf(’x2=’)
%Escribe la conjugada
disp(x2)
%Muestra la raiz conjugada %Fin para el caso discriminante negativo
5
2.2 2.2.1
Solución general de ecuaciones no lineales Construcción de una función
Al utilizar la función incoprporada en matlab, fzero, para hallar las raices de una ecuación general, no solomante polinómica, no es posible determinar el método numérico empleado y los procedimientos que se requieren para encontrar su solución. A continuación se presenta un guión de una función en matlab que implementa el método de Newton para encontrar la solución de una ecuación no lineal. El método de Newton establece que dada una ecuación de la forma f (x) = 0; un valor incial x0; una tolerancia, 1 ; para la raíz ( xi+1 xi < 1 );una tolerancia, 2 ; para los valores de la función f (xi+1 ) < 2 ; encuentra el valor de la raíz mediante la fórmula iterativa,
j
j
j
j
xi = x i
1
f f ((xx
) : 1)
i1
0
i
Una función que realiza esta tarea es la sguiente: function [x0,err,k,y]=funzeros(f,x0,epsilon1,epsilon2,maxiter) %Datos % - f es la funcion, introducida como una cadena de caracteres % - x0 es la aproximacion inicial a un cero de la funcion f % - epsilon1 es la tolerancia para x0 % - epsilon2 es la tolerancia para los valores de la funcion % - maxiter es el maximo n\U{fa}mero de iteraciones %Resultados % - x0 aproximaci\U{f3}n a la raiz % - err es una estimacin del error de aproximacion % - k es el n\U{fa}mero de iteraciones realizadas % - y es el valor de la funci\U{f3}n f(x0) df=diff(f); for k=1:maxiter x1=x0-subs(f,x0)/subs(df,x0); %formula iterativa de Newton err=abs(x1-x0); %calculo del error x0=x1; %actualizacion de x0 y=subs(f,x0); %evaluacion de f(x0) if (err
2.3
Utilización de la interfaz grá…ca, GUI
Matlab ofrece un interfaz grá…ca para una mejor interacción con el usuario, por ejemplo para implemetar el método de Newton utilizando esta interfaz, grá…ca y un llamado a la función 6
construida, funzeros, contendrá las siguientes herramientas grá…cas en un formulario: 3 botones de comando con las funciones de borrar, procesar y salir respectivamente. 5 textos estáticos y 5 textos editables para entrar la función, el valor inicial, las tolerancias, número de iteraciones y mostar la raíz aproximada 1 plano cartesiano para mostar la grá…ca. Los siguientes guiones en los botones, limpiar, procesar, salir, obtendrán la raíz aproximada: %-------------------------------------------------------------------function varargout = procesar_Callback(h, eventdata, handles, varargin) f=get(handles.vfuncion,’string’) x0=str2num(get(handles.vx0,’string’)) epsilon1=str2num(get(handles.vepsilon1,’string’)) epsilon2=str2num(get(handles.vepsilon2,’string’)) maxiter=str2num(get(handles.vmaxiter,’string’)) [x0,err,k,y]=funzeros(f,x0,epsilon1,epsilon2,maxiter) cadena=’El valor de la raiz es ’; cadena=[cadena,num2str(x0)] set(handles.vraiz,’string’,cadena); set(handles.axes1); cla; ezplot(’0’) hold on ezplot(f) grid on % -------------------------------------------------------------------function varargout = salir_Callback(h, eventdata, handles, varargin) close(gcbf); % -------------------------------------------------------------------function varargout = limpia_Callback(h, eventdata, handles, varargin) limpiar=’’ set(handles.vfuncion,’string’,limpiar); set(handles.vx0,’string’,limpiar); set(handles.vepsilon1,’string’,limpiar); set(handles.vepsilon2,’string’,limpiar); set(handles.vmaxiter,’string’,limpiar); set(handles.vraiz,’string’,limpiar); set(handles.axes1); cla;
7