Donde solo la primera vez daremos un punto de inicio, es decir colocaremos un valor el cual será Xn, todo ello con la función valuada en el punto de inicio y su derivada de igual manera, para las iteraciones posteriores el valor de Xn será el resultado de las operaciones antes mencionadas.
Sin más preambulos les dejo el codigo
%{Bueno dudas, comentarios ya saben ;) y si, sigue vigente la regla del trolling
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a,b,c,a_p,b_p,i=0;
char der, constante=0;
float f,fp,val_ini;
float divi,xsol,error=0,val_ini1;
%}
%%
-?[0-9]+ atoi(yytext);constante++; lee_valores();
[xX] yytext;
"*" yytext;
"^" yytext;
"+" ;
%%
main()
{
printf("Newton-Rapson\n");
printf("Escriba su ec. cuadratica:\n");
yylex();
}
lee_valores ()
{
switch(constante)
{
case 1:
a=atoi(yytext);
break;
case 2:
b=atoi(yytext);
break;
case 3:
c=atoi(yytext);
printf("\nEscriba el valor inicial:\n");
break;
case 4: val_ini=atoi(yytext);
val_ini1=val_ini;
constante=0;
der=1;
deriva_ec();
break;
}
}
deriva_ec()
{
if(der==1)
{
a_p=2*a;
b_p=b*1;
}
der=0;
evalua();
printf("La raiz de la ec:\n f(x)= %f", xsol);
}
evalua()
{
f = (float) (a*val_ini1*val_ini1 + b*val_ini1 + c);
fp = (float) (a_p*val_ini1 + b_p);
i=i++;
divi= (float)f/fp;
xsol= (float)(val_ini1-divi);
error = (float) val_ini1-xsol;
error= fabs (error);
while (i<250 && error >= 0.000001)
{
val_ini1=xsol;
evalua();
}
}
Más info sobre el metodo

0 comentarios:
Publicar un comentario en la entrada