Sie sind auf Seite 1von 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 simblico de matlab, implementacin de mtodos numericos en procedimientos, funciones y utilizando la unidad grca.

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, herramientas del toolbox simblico y mtodos grcos ms utilizados aplicandolos para solucionar ecuaciones 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 2.1

ECUACIONES NO LINEALES Ecuaciones polinomicas de segundo grado ax2 + bx + c = 0

Este tipo de ecuacin se pueden resolver por varios mtodos, los ms populares son: factorizacin, mtodo numrico, solucin de ecuaciones algebraicas, frmula cuadrtica, anlisis grco de la funcin y = ax2 + bx + c. A continuacin se exponen y se muestran algunas formas de resolverla utilizando matlab.

2.1.1

Factorizacin

Cuando la ecuacin es un trinomio cuadrado perfecto, o aplicando el procedimiento de completacin, la ecuacin 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 funcin factor. Por ejemplo para factorizar las siguientes expresiones del lado derecho de cada ecuacin, : 9x2 + 6x + 1 = 0; 2x2 + 3x En la ventana de comandos, se digita: >> syms x >> factor(9*x^2+6*x+1) 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 5 = 0; 4y 2 x2 y+ 2x 1 =0 16 1 = 0:

(se da enter y el resultado que aparece es el siguiente)

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) = 2x2 + 3x x0 = 1: 5; con valor inicial

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 x0 = rden en la ventana de comandos: >> fzero(2*x^2+3*x-5,-2) ans = -2.5000

2; dando la

Por tanto para este ejemplo particular, la funcin fzero da los dos valores de las raices, x1 = 1 y x2 = 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 2x2 + 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, p 2 2 b 4ac b : x= 2a En matlab se pueden resolver estas ecuaciones, donde las soluciones pueden ser reales o complejas, por ejemplo para solucionar la ecuacin 2x2 + 3x 5 = 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)

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) = ax2 + 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

2.2
2.2.1

Solucin general de ecuaciones no lineales


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 (jxi+1 xi j < 1 );una tolerancia, 2 ; para los valores de la funcin jf (xi+1 )j < 2 ; encuentra el valor de la raz mediante la frmula iterativa, xi = xi
1

f (xi 1 ) : f 0 (xi 1 )

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

Das könnte Ihnen auch gefallen