13.07.2015 Views

MÉTODOS NUMÉRICOS

MÉTODOS NUMÉRICOS

MÉTODOS NUMÉRICOS

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CURSO: Métodos NuméricosTEMA: Métodos de aproximación de raíces (Método de la secante)DESCRIPCION: Desarrollo practico del tema del método de la secante paraaproximación de raíces empleando un lenguaje de programación orientado aobjetos, diseño e implementación de clases y aplicado a una funciónmatemática particular.OBJETIVO: Diseñar e implementar en lazarus una clase para realizar laaproximación de los ceros de una función matemática dada usando el métodode la secante.PALABRAS CLAVES: Métodos de aproximación de raíces, teorema del valormedio, funciones continuas, recursividad, ceros de una función, intervalosnuméricos, errores de redondeo relativos, pendiente de una recta, derivada,recta secante, funciones de retrollamada, diseño de eventos, punteros afunciones, programación orientada a objetos, diseño de clases, implementacióncon eventos.AUTOR: Lic. Luis Olascoaga SurmayDESARROLLO: A continuación se presenta el diseño y la implementación deen lazarus de una clase para hallar los ceros de una función matemáticaespecifica, dando como entrada dos aproximaciones iniciales a los ceros de lafunción, además de una tolerancia porcentual para el control del error deredondeo relativo entre cada par de aproximaciones seguidas encontradas porel método. Analice la teoría expuesta en clase y consulte otras fuentes acercadel método de la secante y en particular del algoritmo seguido por este paraencontrar las aproximaciones a los ceros de una función continua en unintervalo dado. A continuación estudie, pase, revise y compile el código


presentado creando el proyecto correspondiente en lazarus. Diseñe la ventanacomo se indica al final y haga la programación de los eventos correspondientesusando instancia de la clase presentada.unit usecante;{$mode objfpc}{$H+}interfaceuses Classes, SysUtils;type{Evento para función callback que captura cada raízcon el error de redondeo relativo respectivo.}TOnCalRaiz = procedure (xr,error:double) of object;{ TSecante }TSecante=classprivateX1:double;X2:double;Tolerancia:double;CalcRaiz:TOnCalRaiz;publicconstructor Create;procedure SetX1(Vx1:double);procedure SetX2(Vx2:double);procedure SetTolerancia(Tol:double);procedure SetCalcRaiz(CalcR:TOnCalRaiz);function GetX1:double;function GetX2:double;function GetTolerancia:double;function GetCalcRaiz:TOnCalRaiz;function CalcError(act,ant:double):double;function ValorFx(x:double):double;function ValRaiz(ant,act:double):double;procedure Aproximar;end;implementation{ TSecante }constructor TSecante.Create;begin


X1:=0;X2:=0;Tolerancia:=0;CalcRaiz:=nil;end;procedure TSecante.SetX1(Vx1: double);beginX1:=Vx1;end;procedure TSecante.SetX2(Vx2: double);beginX2:=Vx2;end;procedure TSecante.SetTolerancia(Tol: double);beginTolerancia:=Tol;end;procedure TSecante.SetCalcRaiz(CalcR: TOnCalRaiz);beginCalcRaiz:=CalcR;end;function TSecante.GetX1: double;beginresult:=X1;end;function TSecante.GetX2: double;beginresult:=X2;end;function TSecante.GetTolerancia: double;beginresult:=Tolerancia;end;function TSecante.GetCalcRaiz: TOnCalRaiz;beginresult:=CalcRaiz;end;function TSecante.CalcError(act, ant: double): double;beginresult:=100*Abs(act­ant)/act;end;function TSecante.ValorFx(x: double): double;beginresult:=Exp(­(x*x))­x;


end;function TSecante.ValRaiz(ant, act: double): double;varfxi:double;beginfxi:=ValorFx(act);result:=act­(fxi*(ant­act))/(ValorFx(ant)­fxi);end;procedure TSecante.Aproximar;varxr,ant,act,error:double;beginant:=X1;act:=X2;repeatxr:=ValRaiz(ant,act);error:=CalcError(xr,act);if Assigned(CalcRaiz) thenCalcRaiz(xr,error);ant:=act;act:=xr;until error


Pruebe la aplicación con las entradas indicadas en la siguiente pantalla:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!