Integración numérica: C++ Linux

La integración numérica, mediante los métodos trapezoidal y de Simpson, exigen poco esfuerzo de programación en C++. Aquí los usamos para encontrar el área, entre 0 y 6, para la parábola y = x² (aunque no necesitamos la forma explícita de la función; sólo los valores de y como función de x). Los valores de la función se establecen para valores de x igualmente espaciados (h fijo) y para un número par de sub-intervalos h (número impar de puntos). Estos valores se disponen en el archivo datos.in (carpeta datos); tal como se señala a continuación:


7
1

0
1
4
9
16
25
36

y se llaman desde el programa principal. Los dos primeros valores corresponden al número total de datos de f(x) y h; respectivamente. El código es el siguiente:


#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

void trapezoide (int n, float h, float *f, float & sum);
void simpson (int n, float h, float *f, float & sum);

int main() {

   cout << "Integracion numerica\n\n";

   ifstream label1 ("datos//datos.in");

   int n, i;

   float h, *f, sum;

   label1 >> n >> h;

   f = new float [n];

   cout << "Numero de valores de f(x) = " << n << "\n\n";

   cout << "Valor de h = " << h << "\n\n";   

   cout << "Valores de f(x)\n   f(x)\n";

   for (i = 0; i < n; i++){

      label1 >> f[i];

      cout << setw(5) << setiosflags(ios::right) << f[i] << "\n";

   }

   cout << endl;

   sum = 0;

   simpson (n, h, f, sum);

   cout << "Regla de Simpson\n";

   cout << "area = " << sum << "\n\n";

   sum = 0;

   trapezoide (n, h, f, sum);

   cout << "Regla del Trapezoide\n";

   cout << "area = " << sum << "\n\n";

   return 0;

}

void trapezoide (int n, float h, float *f, float & sum) {

   int i;

   for (i = 1; i < n -1; i+=2){

      sum = sum + (h/2)*(f[i-1] + 2*f[i] + f[i + 1]);

   }

}

void simpson (int n, float h, float *f, float & sum) {

   int i;

   for (i = 1; i < n -1; i+=2){

      sum = sum + (h/3)*(f[i-1] + 4*f[i] + f[i + 1]);

   }

}

Después de grabarlo como integración.c++ en la carpeta INTEGRACIÓN, en cónsola nos movemos hacia dicha carpeta y allí compilamos con:

g++ integracion.c++ -o integracion

La ejecución, con ./integracion [Enter], produciría una salida similar a esta:

Integracion numerica

Numero de valores de f(x) = 7

Valor de h = 1

Valores de f(x)
f(x)
0
1
4
9
16
25
36

Regla de Simpson
area = 72

Regla del Trapezoide
area = 73

El área calculada por el método de Simpson (función en simpson) es más exacta que la determinada por la regla trapezoidal (función en trapezoide); la integral de x² entre 0 y 6 es precisamente 72.

Esta entrada fue publicada en Código C++. Guarda el enlace permanente.

13 respuestas a Integración numérica: C++ Linux

  1. vladimir dijo:

    como puedo cambiar la funcion de integracion como por ejemplo:
    ln(sen(x))/raiz cuadrada de (X), y ademas si los limites de integracion son 0 a pi/2

    • Como la función que tu propones no está definida en cero vamos a cambiar los límites de integración a 1 y pi/2 (1.5707963268). El valor de h, para que sea equivalente al ejemplo aquí expresado con 7 valores, sería (1.5707963268-1)/6 = 0.095132721. Ahora determinamos los f(x) para cada x en una hoja de cálculo:

             x        f(x)
      1.000000000	-0.172603746
      1.095132721	-0.112443350
      1.190265442	-0.068029598
      1.285398163	-0.036419928
      1.380530885	-0.015499034
      1.475663606	-0.003730717
      1.570796327	0.000000000
      

      Para construir el nuevo datos.in tendríamos:

      7
      0.095132721
      
      -0.172603746
      -0.112443350
      -0.068029598
      -0.036419928
      -0.015499034
      -0.003730717
      0.000000000
      

      Con el archivo anterior podrías determinar la integral de LN(SIN(X)) / SQRT(X) entre 1 y pi/2.

      • Aquí está el resultado:

        Integracion numerica
        
        Numero de valores de f(x) = 7
        
        Valor de h = 0.0951327
        
        Valores de f(x)
           f(x)
        -0.172604
        -0.112443
        -0.0680296
        -0.0364199
        -0.015499
        -0.00373072
            0
        
        Regla de Simpson
        area = -0.0301265
        
        Regla del Trapezoide
        area = -0.0306731
        
  2. jorge arpaiz dijo:

    como puedo hacer para una funcion de f(x)=(1/(2pi))1/2 ex2/2

  3. Xavi dijo:

    si quiero proponer el resultado de la integral hasta la sext cifra decimal, como lo hago?

  4. Tyr dijo:

    pregunta: Como seria el codigo para identificar las 2 reglas de simponson 1/3 y 1/2 y la del trapecio. osea que el algoritmo identifique como debe resolver cada regla, digamos si se tienen estos datos
    x y los 2 primeros son por trapecio, del 2 al 4 por 3/8, 4 al 10 1/3 y 10 y 11 por trapecio
    336 0.5
    294.4 2
    266,4 3
    260.8 4
    260.5 6
    249.6 8
    193.6 10
    165.6 11

    teniendo esta tabla o cualquier dato introducido por el usuario. te identifique los segmentos para que pueda hacerlo por trapecio sipmson 1/3 y 1/8

    para que me entiendas mejor el algoritmo realice esto

    x= [(2-0.5)/2]*(330+294.4)+1/3[294.4+4(266.4)+260.8]+
    [(3*2)/8]*[260.8+3(260.5+249.6)+193.6] + 1/2(193.6+165.6)

  5. Edgar dijo:

    sera que me pueden pasar el codigo en c++ de como calcular integracion y diferenciación xf ……..Urgente

  6. juan sanchez dijo:

    el codigo al ejecutar no aparece nada quepodria ser

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s