Está en la página 1de 7

MTODOS NUMRICOS

MTODOS DE APROXIMACIN DE RACES (MTODO DE LA SECANTE)

Lus Roberto Olascoaga Surmay

Universidad de Crdoba Facultad de Ciencias Bsicas e Ingenieras Departamento de Ingeniera de Sistemas y Telecomunicaciones

CURSO:MtodosNumricos TEMA:Mtodosdeaproximacinderaces(Mtododelasecante) DESCRIPCION:Desarrollopracticodeltemadelmtododelasecantepara aproximacinderacesempleandounlenguajedeprogramacinorientadoa objetos, diseo e implementacin de clases y aplicado a una funcin matemticaparticular. OBJETIVO: Disear e implementar en lazarus una clase para realizar la aproximacindeloscerosdeunafuncinmatemticadadausandoelmtodo delasecante. PALABRASCLAVES:Mtodosdeaproximacinderaces,teoremadelvalor medio, funciones continuas, recursividad, ceros de una funcin, intervalos numricos,erroresderedondeo relativos,pendiente de unarecta,derivada, recta secante, funciones de retrollamada, diseo de eventos, punteros a funciones,programacinorientadaaobjetos,diseodeclases,implementacin coneventos. AUTOR:Lic.LuisOlascoagaSurmay DESARROLLO:Acontinuacinsepresentaeldiseoylaimplementacinde en lazarus de una clase para hallar los ceros de una funcin matemtica especifica,dandocomoentradadosaproximacionesinicialesaloscerosdela funcin, adems de una tolerancia porcentual para el control del error de redondeorelativoentrecadapardeaproximacionesseguidasencontradaspor elmtodo.Analicelateoraexpuestaenclaseyconsulteotrasfuentesacerca delmtododelasecanteyenparticulardelalgoritmoseguidoporestepara encontrar las aproximaciones a los ceros de una funcin continua en un intervalo dado. A continuacin estudie, pase, revise y compile el cdigo

presentadocreandoelproyectocorrespondienteenlazarus.Diseelaventana comoseindicaalfinalyhagalaprogramacindeloseventoscorrespondientes usandoinstanciadelaclasepresentada.


unit usecante; {$mode objfpc}{$H+} interface usesClasses,SysUtils; type

Evento para funcin callback que captura cada raz con el error de redondeo relativo respectivo. }

TOnCalRaiz=procedure(xr,error:double)ofobject; { TSecante } TSecante=class private X1:double; X2:double; Tolerancia:double; CalcRaiz:TOnCalRaiz; public constructorCreate; procedureSetX1(Vx1:double); procedureSetX2(Vx2:double); procedureSetTolerancia(Tol:double); procedureSetCalcRaiz(CalcR:TOnCalRaiz); functionGetX1:double; functionGetX2:double; functionGetTolerancia:double; functionGetCalcRaiz:TOnCalRaiz; functionCalcError(act,ant:double):double; functionValorFx(x:double):double; functionValRaiz(ant,act:double):double; procedureAproximar; end;
implementation { TSecante } constructorTSecante.Create; begin

X1:=0; X2:=0; Tolerancia:=0; CalcRaiz:=nil; end;


procedureTSecante.SetX1(Vx1:double); begin

X1:=Vx1; end;
procedureTSecante.SetX2(Vx2:double); begin

X2:=Vx2; end;
procedureTSecante.SetTolerancia(Tol:double); begin

Tolerancia:=Tol; end;
procedureTSecante.SetCalcRaiz(CalcR:TOnCalRaiz); begin

CalcRaiz:=CalcR; end;
functionTSecante.GetX1:double; begin

result:=X1; end;
functionTSecante.GetX2:double; begin

result:=X2; end;
functionTSecante.GetTolerancia:double; begin

result:=Tolerancia; end;
functionTSecante.GetCalcRaiz:TOnCalRaiz; begin

result:=CalcRaiz; end;
functionTSecante.CalcError(act,ant:double):double; begin

result:=100*Abs(actant)/act; end;
functionTSecante.ValorFx(x:double):double; begin

result:=Exp((x*x))x;

end; functionTSecante.ValRaiz(ant,act:double):double; var

fxi:double;
begin

fxi:=ValorFx(act); result:=act(fxi*(antact))/(ValorFx(ant)fxi); end;


procedureTSecante.Aproximar; var

xr,ant,act,error:double;
begin

ant:=X1; act:=X2; repeat xr:=ValRaiz(ant,act); error:=CalcError(xr,act); ifAssigned(CalcRaiz)then CalcRaiz(xr,error); ant:=act; act:=xr; untilerror<Tolerancia;
end; end.

Eldiseoparalaventanaeselsiguiente:

Enlaseccinprivatedelformulario(clasedelaventana)asegresededeclarar elsiguienteprocedimientoqueserelevento(funcinderetrollamada)para capturarcadarazobtenidaporlaclaseTSecanteypresentarlahastalamatriz (TStringGrid)delaventana:


private procedureAgregaRaiz(xr,error:real);

Pulseshift+ctrl+ceimplementeestemtodocomoseilustraacontinuacin:
procedureTForm1.AgregaRaiz(xr,error:real); var

Fila:Integer;

begin ifDatos.Cells[0,1]<>''then

Datos.RowCount:=Datos.RowCount+1; Fila:=Datos.RowCount1; Datos.Cells[0,Fila]:=FloatToStr(xr); ifFila>1then Datos.Cells[1,Fila]:=FormatFloat('0.00',error); end;

Elcdigoparaeleventoclickdelbotnaproximareselsiguiente:
procedureTForm1.B1Click(Sender:TObject); var

Sec:TSecante;
begin

Datos.RowCount:=2; Datos.Rows[1].Clear; Sec:=TSecante.Create; Sec.SetX1(StrToFloat(Ex1.Text)); Sec.SetX2(StrToFloat(Ex2.Text)); Sec.SetTolerancia(StrToFloat(ETol.Text)); Sec.SetCalcRaiz(@Calcular); Sec.Aproximar; Sec.Free; end;

Pruebelaaplicacinconlasentradasindicadasenlasiguientepantalla:

También podría gustarte