Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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:=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;
fxi:double;
begin
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:
Pulseshift+ctrl+ceimplementeestemtodocomoseilustraacontinuacin:
procedureTForm1.AgregaRaiz(xr,error:real); var
Fila:Integer;
begin ifDatos.Cells[0,1]<>''then
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: