• Viernes 17 de Mayo de 2024, 03:44

Autor Tema:  implementacion metodo de simpson  (Leído 1524 veces)

Yesu

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
implementacion metodo de simpson
« en: Domingo 12 de Diciembre de 2010, 07:39 »
0
Hola gente, para pedir un poco de ayuda en la optimizacion de un programita que hize. Se trata de un codigo que permite resolver integrales por el metodo de Simpson. El programa en si funciona bien, pero cuando se lo mostre a mi profesor, el muy jodido dijo que queria que el programa pida la ecuacion , y no que este embebida en el codigo..

aqui les dejo el codigo para que vean de que hablo:
------------------------------------------------------------------------------------
Código: C
  1. #include <stdio.h> /*para printf(),scanf()*/
  2. #include <conio.h> /*para getch(),clrscr()*/
  3. #include <stdlib.h>/*para exit()*/
  4. #include <math.h>
  5. //#include <dos.h>
  6. //#define NUMEL 20
  7. double f(double x);
  8. void _error(int n);
  9. enum{INTERVALOS};
  10. enum{SIMPSON1_3=1,SALIR};
  11. int n;
  12. float a,b;
  13. //float X[NUMEL],Fx[NUMEL];
  14.  
  15. /*Metodo de Simpson 1/3 dada una funcion*/
  16. void Simpson1_3(double a,double b,int n,double *Area)
  17. {
  18.  register int i;
  19.  double x;
  20.  double S0,S1;
  21.  double h;
  22.  h=(b-a)/(2*n);
  23.  S0=S1=0;
  24.  for(i=1;i<=(2*n-1);++i){
  25.    x=a+((double)i)*h;
  26.    if(!(i%2))
  27.     S0+=f(x);
  28.    else
  29.     S1+=f(x);
  30.  }
  31.  *Area=(h*(f(a)+4*S1+2*S0+f(b))/3.0);
  32.  
  33.   printf("n El area es -> %5.6f nnn",*Area);
  34.   getch();
  35. }
  36. /*Muestra mensaje de error*/
  37. void _error(int n)
  38. {
  39.   static char *msg[]={
  40.              "Error en los subintervalos",
  41.              ""
  42.             };
  43.   printf("n %s",msg[n]);
  44.   getch();
  45. }
  46.   /*Funcion a integrar*/
  47.   double f(double x)
  48.  {
  49.    float y;
  50.     y = -x * x + 200;
  51.     return y;
  52.  }
  53.  
  54.  void LeeDatos(int opc)
  55. {
  56.  if(opc==SIMPSON1_3){
  57. // clrscr();
  58.  
  59.  putchar('n');
  60.  printf("n Numero de intervalos (PAR) -> ");
  61.  }
  62.  
  63.  scanf("%d",&n);
  64.  if((n<1)||((n%2)!=0)){          //numero de iteraciones menor que 0 o impares
  65.   _error(INTERVALOS);
  66.   exit(1);
  67.  }
  68.  else
  69.   printf("n Valor de a =>");
  70.   scanf("%f",&a);
  71.   printf("n Valor de b =>");
  72.   scanf("%f",&b);
  73. }
  74.  /*Muestra el menu en la pantalla*/
  75.  void Menu(char *titulo,char *opciones[])
  76.  {
  77.     int i;
  78. //  clrscr();
  79.     i=0;
  80. //  gotoxy(34,4);
  81.     printf("%snn",titulo);
  82.     for(;*opciones[i];i++)
  83.     printf("tttt %d.- %sn",i+1,opciones[i]);
  84.     printf("tttt %d.- Salirn",i+1);
  85.     putchar('n');
  86.     printf("tttt Opcion: ");
  87.  }
  88. int main(void)
  89. {
  90.   double Area;
  91.  
  92.   int op;
  93.   char *opciones[]={"Simpson 1/3",
  94.  
  95.                     ""
  96.                    };
  97.   do{
  98.  //  clrscr();
  99.    Menu("Metodos de Integracion",opciones);
  100.    scanf("%d",&op);
  101.    switch(op){
  102.      case SIMPSON1_3:    LeeDatos(SIMPSON1_3);
  103.                          Simpson1_3(a,b,n,&Area);
  104.                          break;
  105.  
  106.      case SALIR:
  107.      //     gotoxy(34,20);
  108.                          printf(" Fin de %s",__FILE__);
  109. //
  110.                          exit(0);
  111.                          break;
  112.      default:
  113.      // gotoxy(34,13);
  114.                          printf("Opcion no permitida. nnn" );
  115.                          getch();
  116.                          break;
  117.  
  118.     }
  119.   }while(op!=SALIR);
  120.  
  121. }
  122.  

--------------------------------------------------------------------------------------------------------------

en este caso, la ecuacion que resuelve el programa es -x * x + 200, pero el profesor quiere que resuelva cualquiera, que seria basicamente cambiar esa ecuacion en el codigo.. pero el quiere que el programa la pida y uno la ingrese cuando se ejecute el programa...

Se que no debe ser muy dificil crear una funcion que pida una ecuacion y la resuelva pero estoy un poco perdido asique si me dan una ayudita se los agradecería un monton!!

desde ya muchas gracias!!

Munire

  • Nuevo Miembro
  • *
  • Mensajes: 6
  • Nacionalidad: es
    • Ver Perfil
Re: implementacion metodo de simpson
« Respuesta #1 en: Domingo 12 de Diciembre de 2010, 13:21 »
0
lo primero que tienes que hacer es decidir el formato del input por ejemplo:

>> x4-2x2+3x-5

aunque tambien podria ser 2x^2, en vez de 2x2.

luego tienes que desarrollar un motor de busqueda que almazene los valores que multiplican a las incognitas. por ejemplo:

almazena x4-2x2+3x-5 en una cadena de texto y busca las "x" la primera x que encontrara es esta: x4 (que es x elevado a 4), el numero de la izquierda lo almazena como "n" y el de la izquierda como "a" , luego encontrara la siguiente "x" coge el valor de la izquierda y el de la dercha  y los almazena tambien, y asi con todos.  seria algo asi:

la "x" esta en cadena =>  a=cadena[i-1]  y  n=cadena[i+1]   ok?

lo siguente seria escribir la "y":

y = a*x^7+b*x^6 ............... +f*x^2+g*x+h

pero hay dos problemas: el grado esta limitado a lo que pongas en el codigo y hay muchas incognitas. hay que intentar hacerlo de otra forma:

y=0
for(n=0 hasta n)
{
      motor de busqueda
      y = y + a * x^n;
}

de esta forma la busqueda se realiza dentro del for, de manera que al encontrar la "x" el valor "a" lo mete en la ecuacion y hace la suma.

se repite el for para n=1 con lo cual busca la x de grado 1, es decir la x que tenga a la derecha un 1 y coge su "a" ( a=cadena[i-1] ) y hace la operacion.

se repite el for para n=2 (ahora imaginate que no hay x^2 o que 0*x^2) busca la x que tenga a la derecha un 2 y como no la encuentra a=0,   y = y + 0  con lo cual no suma nada y pasa a la siguiente "n"

saludos