jueves, noviembre 03, 2011

Resolución de Ec. cuadráticas con Newton-Raphson

No, no se han equivocado de blog... como les había comentado hace tiempo andamos intentando cursar un posgrado, de ahí el hecho de postear algunas cosas un poco mas "técnicas", ahora les traigo un sencillo programa realizado en flex el cual resuelve una ecuación cuadrática por medio del método de Newton-Raphson, para ello crea una serie de iteraciones según la formula:

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
%{
#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();
    }
       
}
Bueno dudas, comentarios ya saben ;) y si, sigue vigente la regla del trolling

Más info sobre el metodo

0 comentarios:

Publicar un comentario