You are on page 1of 7

MTODOS NUMRICOS

MTODOS DE APROXIMACIN DE RACES (MTODO DE LA REGLA FALSA)

Lus Roberto Olascoaga Surmay

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

CURSO:MtodosNumricos TEMA:Mtodosdeaproximacinderaces(Mtododelareglafalsa) DESCRIPCION:Desarrollopracticodeltemadelmtododelareglafalsapara 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 delareglafalsa. PALABRASCLAVES:Mtodosdeaproximacinderaces,teoremadelvalor medio, funciones continuas, recursividad, ceros de una funcin, intervalos numricos,erroresderedondeorelativos,ecuacindeunalnea,pendiente, funciones de retrollamada, diseo de eventos, punteros a funciones, programacin orientada a objetos, diseo de clases, implementacin con eventos. AUTOR:Lic.LuisOlascoagaSurmay DESARROLLO:Acontinuacinsepresentaeldiseoylaimplementacinde en lazarus de una clase para hallar los ceros de una funcin matemtica especifica,dandocomoentradaunintervaloyunatoleranciaporcentualparael control del error de redondeo relativo entre cada par de aproximaciones seguidasencontradasporelmtodo. Analicelateoraexpuestaenclasey consulteotrasfuentesacercadelmtododelareglafalsayenparticulardel algoritmoseguidoporesteparaencontrarlasaproximacionesaloscerosde unafuncincontinuaenunintervalodado.Acontinuacinestudie,pase,revise ycompileelcdigopresentadohabiendocreadoelproyectocorrespondiente

enlazarus.Diseelaventanacomoseindicaalfinalyhagalaprogramacinde loseventoscorrespondientesusandoinstanciadelaclasepresentada.
unit uregla_falsa; {$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; { TRegla_Fasa } TRegla_Fasa=class private xa:double; xb:double; Tolerancia:double; CalcRaiz:TOnCalRaiz; public constructorCreate; procedureSetXa(Vxa:double); procedureSetXb(Vxb:double); procedureSetTolerancia(Tol:double); procedureSetCalcRaiz(CalcR:TOnCalRaiz); functionGetXa:double; functionGetxb:double; functionGetTolerancia:double; functionGetCalcRaiz:TOnCalRaiz; functionCalcError(act,ant:double):double; functionValorFx(x:double):double; functionValidaIntervalo:boolean; functionValRaiz(a,b:double):double; procedureAproximar; end;
implementation { TRegla_Fasa } constructorTRegla_Fasa.Create; begin

Xa:=0;

Xb:=0; Tolerancia:=0; CalcRaiz:=nil; end; procedureTRegla_Fasa.SetXa(Vxa:double);


begin

Xa:=Vxa; end;
procedureTRegla_Fasa.SetXb(Vxb:double); begin

Xb:=Vxb; end;
procedureTRegla_Fasa.SetTolerancia(Tol:double); begin

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

CalcRaiz:=CalcR; end;
functionTRegla_Fasa.GetXa:double; begin

result:=Xa; end;
functionTRegla_Fasa.Getxb:double; begin

result:=Xb; end;
functionTRegla_Fasa.GetTolerancia:double; begin

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

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

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

result:=Exp(x)Ln(x); end;

function TRegla_Fasa.ValidaIntervalo:boolean; begin

result:=(ValorFx(xa)*ValorFx(xb))<0; end;
functionTRegla_Fasa.ValRaiz(a,b:double):double; var

fa,fb:double;
begin

fa:=ValorFx(a); fb:=ValorFx(b); result:=a(fa*(ba))/(fbfa); end;


procedureTRegla_Fasa.Aproximar; var

a,b,error:double; ant,xr,prod:double;
begin

a:=xa; b:=xb; ant:=0; repeat xr:=ValRaiz(a,b); error:=CalcError(xr,ant); ifAssigned(CalcRaiz)then CalcRaiz(xr,error); prod:=ValorFx(a)*ValorFx(b); ifprod<0then b:=xr else ifprod>0then a:=xr; ant:=xr; until(error<Tolerancia)or(prod=0); end;
end.

Eldiseoparalaventanaeselsiguiente:

Enlaseccinprivatedelformulario(clasedelaventana)asegresededeclarar elsiguienteprocedimientoqueserelevento(funcinderetrollamada)para capturarcadarazobtenidaporlaclase TRegla_Fasaypresentarlahastala matriz(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

RF:TRegla_Fasa;
begin

Datos.RowCount:=2; Datos.Rows[1].Clear; RF:=TRegla_Fasa.Create; RF.SetXa(StrToFloat(Exa.Text)); RF.SetXb(StrToFloat(Exb.Text)); ifRF.ValidaIntervalothen begin RF.SetTolerancia(StrToFloat(ETol.Text)); RF.SetCalcRaiz(@Calcular); RF.Aproximar; end
else begin

ShowMessage('Intervalonoadecuado'); Exa.SetFocus; end; RF.Free; end;

Pruebelaaplicacinconlasentradasindicadasenlasiguientepantalla:

You might also like