How to calculate an integral by Simpson's method (Spanish code)

This is the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "mn_simpson.h"
#include <stdio.h>
 
//************************************************************
// FUNCION PARA CALCULAR UNA INTEGRAL POR EL METODO DE SIMPSON
//************************************************************
real mn_simpson(
real (*f)(const real x) /* funcion que se integra */,
const real a /* extremo izquierdo del intervalo */,
const real b /* extremo derecho del invervalo*/,
const int N /* numero de intervalos para calcular la integral */)
{
   real integral=0; // variable donde se acumula el valor de la integral
   real f_k=(*f)(a);  // evaluacion de la funcion en a
   real h=(b-a)/(6.*N);  // factor multiplicativo
   for(int i=0;i<N;i++) // bucle para acumular el valor de la integral
   {
      real xk=a+i*(b-a)/N;  // extremo izquierdo subintervalo
      real xk1=a+(i+1)*(b-a)/N; // extremo derecho subintervalo
      real f_k_1=(*f)(xk1);  // evaluación de la función en el extremo derecho
      integral+=h*(f_k+f_k_1+4*(*f)((xk+xk1)/2.)); // acumulacion valor integral
      f_k=f_k_1; // actualizacion valor integral extremo izquierdo
   }
   return integral; // se devuelve el valor de la integral
}
 
//*************************************************************************
// FUNCION PARA CALCULAR UNA INTEGRAL POR ITERACIONES DEL METODO DE SIMPSON
//*************************************************************************
real mn_simpson(
real (*f)(const real x) /* funcion que se integra */,
const real a /* extremo izquierdo del intervalo */,
const real b /* extremo derecho del invervalo*/,
int &Niter /* variable de salida con el numero de iteraciones realizadas */,
const real TOL /* tolerancia para controlar la convergencia */)
{
  int N=1;
  real integral =mn_simpson((*f),a,b,N);
  real error=TOL+1;
  Niter=0;
  while(error>TOL ){
    if(N>1e7) break; // fijamos "a priori" el numero máximo de intervalo a 1e7
    Niter++;
    N*=2;
    real integral2=mn_simpson((*f),a,b,N);
    error=mn_distancia(integral,integral2);
    integral=integral2;
    //printf("integral=%e error=%e N=%d \n",(double) integral,(double) error,N);
  }
  return(integral);
}


This is the Header:

1
2
3
4
5
#include "mn_aritmeticas.h"
#include <math.h>
 
real mn_simpson(real (*f)(const real x),const real a, const real b, const int N);
real mn_simpson(real (*f)(const real x),const real a, const real b, int &Niter,const real TOL);
Last edited on
Topic archived. No new replies allowed.