Está en la página 1de 7

Solucin de ecuaciones no lineales con matlab

Zagalo Enrique Surez Aguilar y Omaida Seplveda Delgado


zagalo.suarez@uptc.edu.co, omaida.sepulveda.uptc.edu.co
Abstract
Se resuelven ecuaciones no lineales utilizando funciones incorporadas de toolbox sim-
blico de matlab, implementacin de mtodos numericos en procedimientos, funciones y
utilizando la unidad grca.
1 Acerca de este taller
El taller pretende mostar aplicaciones de matlab en diferentes niveles para resolver ecuaciones
no lineales. Se desarrolla en dos sesiones.
En la primera sesin se hace una exploracin de matlab, las diferentes ventanas, herramien-
tas del toolbox simblico y mtodos grcos ms utilizados aplicandolos para solucionar ecua-
ciones polinmicas de segundo grado.
En la segunda sesin se implementar un procedimiento para la solucin de una ecuacin
cuadrtica utilizando la frmula general, el mtodo numrico de Newton Raphson para resolver
ecuaciones no lineales generales utilizando el concepto de funcin y un proyecto utilizando la
unidad de interfaz grca y la funcin construida..
2 ECUACIONES NO LINEALES
2.1 Ecuaciones polinomicas de segundo grado ax
2
+ bx + c = 0
Este tipo de ecuacin se pueden resolver por varios mtodos, los ms populares son: fac-
torizacin, mtodo numrico, solucin de ecuaciones algebraicas, frmula cuadrtica, anlisis
grco de la funcin y = ax
2
+bx+c. A continuacin se exponen y se muestran algunas formas
de resolverla utilizando matlab.
1
2.1.1 Factorizacin
Cuando la ecuacin es un trinomio cuadrado perfecto, o aplicando el procedimiento de com-
pletacin, la ecuacin se puede expresar como,
ax
2
+ bx + c = (x + a
1
)(x + a
2
) = 0: (1)
Estos procedimientos se pueden realizar en matlab, utilizando el Symbolic Math Toolbox, la
funcin factor. Por ejemplo para factorizar las siguientes expresiones del lado derecho de cada
ecuacin, :
9x
2
+ 6x + 1 =0; 4y
2
y +
1
16
= 0
2x
2
+ 3x 5 =0; x
2
2x 1 = 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 Mtodo numrico
Cuando no es posible encontrar los factores de la forma (1), matlab tiene incorporada la funcin
fzero que encuentra las raices de funciones no lineales por mtodos numricos, dada la ecuacin
y el valor inicial
Ejemplo .1 Encontrar un cero o raiz de la funcin y = f(x) = 2x
2
+3x5; con valor inicial
x
0
= 1:
En la ventana de comandos se digita:
>>fzero(2*x^2+3*x-5,1)
ans =1
2
Para encontrar el otro cero de la funcin cambiamos el valor incial por x
0
= 2; dando la
rden en la ventana de comandos:
>> fzero(2*x^2+3*x-5,-2)
ans = -2.5000
Por tanto para este ejemplo particular, la funcin fzero da los dos valores de las raices,
x
1
= 1 y x
2
= 2:5
2.1.3 Solucin simblica 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
2x
2
+ 3x 5 = 0; se puede utilizar la funcin solve, digitando en la ventana de comandos:
>>solve(2*x^2+3*x-5=0)
ans = [ -5/2] [ 1]
2.1.4 Solucin utilizando la frmula cuadrtica
La ecuacin de segundo grado se puede resolver utilizando la frmula cuadrtica,
x =
b
2
p
b
2
4ac
2a
:
En matlab se pueden resolver estas ecuaciones, donde las soluciones pueden ser reales o comple-
jas, por ejemplo para solucionar la ecuacin 2x
2
+3x5 = 0; utilizando la frmula cuadrtica,
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 Representacin grca de una funcin de segundo grado.
Mtodo fcil
>>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)
Graca de la parbola y su vrtice
>>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 grca
Se presenta un procedimiento en matlab, empleando las estructuras bsicas de programacin,
para encontrar las raices de una ecuacin polinmica de segundo grado con datos de entrada
los valores de los coecientes, a; b; c; de la funcin cuadrtica, y = f(x) = ax
2
+ bx + c; la
salida las raices (los ceros) de la funcin, reales o complejas, la grca de la funcin, el vrtice
de la parbola.
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),)]; %Cadena de caracteres para una raiz
text(x1,0,s1); %Escribe las coordenadas de una ra\U{ed}z en la figura
s2=[o(,num2str(x2),,,num2str(0),)]; %Cadena de caracteres para la otra raiz
text(x2,0,s2); %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
disp(x1) %Escribe la raiz compleja en la ventana de comandos
fprintf(x2=) %Escribe la conjugada
disp(x2) %Muestra la raiz conjugada
end %Fin para el caso discriminante negativo
5
2.2 Solucin general de ecuaciones no lineales
2.2.1 Construccin de una funcin
Al utilizar la funcin incoprporada en matlab, fzero, para hallar las raices de una ecuacin
general, no solomante polinmica, no es posible determinar el mtodo numrico empleado y
los procedimientos que se requieren para encontrar su solucin. A continuacin se presenta
un guin de una funcin en matlab que implementa el mtodo de Newton para encontrar la
solucin de una ecuacin no lineal.
El mtodo de Newton establece que dada una ecuacin de la forma f(x) = 0; un valor incial
x0; una tolerancia,
1
; para la raz (jx
i+1
x
i
j <
1
);una tolerancia,
2
; para los valores de la
funcin jf(x
i+1
)j <
2
; encuentra el valor de la raz mediante la frmula iterativa,
x
i
= x
i1

f(x
i1
)
f
0
(x
i1
)
:
Una funcin 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<epsilon1)|abs(y)<epsilon2,break,end
end
2.3 Utilizacin de la interfaz grca, GUI
Matlab ofrece un interfaz grca para una mejor interaccin con el usuario, por ejemplo para
implemetar el mtodo de Newton utilizando esta interfaz, grca y un llamado a la funcin
6
construida, funzeros, contendr las siguientes herramientas grcas en un formulario:
3 botones de comando con las funciones de borrar, procesar y salir respectivamente.
5 textos estticos y 5 textos editables para entrar la funcin, el valor inicial, las tolerancias,
nmero de iteraciones y mostar la raz aproximada
1 plano cartesiano para mostar la grca.
Los siguientes guiones en los botones, limpiar, procesar, salir, obtendrn la raz 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