top of page
Foto del escritorGato Ingeniero

Resolver Integrales Simples

Actualizado: 6 ene 2022

En la gama de trabajos que presentare, busco una interfaz mas cómoda al usuario. Presento también 3 maneras de resolver el ejercicio que se nos sea planteado.

Asimismo solo debemos colocar el numero de la opción con la cual trabajar y terminar la entrada con "enter".

Cree una función donde entraría la ecuación con la cual se desarrollaría el programa, es decir, el ingreso de la ecuación a trabajar se lo hace antes de hacer correr el programa.

-> En el caso del método del Trapecio y del método de Simpson tenemos una sola entrada, es modificable claro, solo es añadir otra función y declararla dentro del código.

-> Para el método de Gauss Legendre introduje otra función dado que el trabajo viene a ser diferente.

-> La exactitud que comprobaba es de 9 decimas.


Acá les dejo el código:


///INTEGRALES SIMPLES

#include <iostream>

#include <math.h>

#include <stdlib.h>

#include <iomanip>

#include <stdio.h>

using namespace std;

///-----------------------------------------------------------------

struct Vect

{

double v[100];

};

///-----------------------------------------------------------------

void Ec_Trapecio_Simpson (double &x,double &fx,double a,double h,int i)

{

x=(double)a+(i*h);

fx=(double) pow((pow(x,2)+1),cos(x));

}

///-----------------------------------------------------------------

void metTrapecio()

{

Vect fx;

Vect x;

double I,h,a,b,s=0;

int n;

printf("\n *****METODO DEL TRAPECIO***** ");

printf("\n Ingrese los limites de la ecuacion: \n");

printf("\n a -> "); cin>>a;

printf("\n b -> "); cin>>b;

printf("\n Ingrese # de intervalos: "); cin>>n;

h=(double)(b-a)/n;

printf("\n Por lo tanto el paso h sera: %.10lf\n",h);

for(int j=0 ; j<=n ; j++)

{

Ec_Trapecio_Simpson(x.v[j],fx.v[j],a,h,j);

s=(double) s + fx.v[j];

}

printf("\n TABLA DE RESULTADOS");

printf("\n i x[i] Fx[i]");

cout<<"\n ----------------------------------";

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

{

printf("\n %d | %.10lf | %.10lf |",i,x.v[i],fx.v[i]);

}

I=(double)(h/2)*((2*s)-fx.v[0]-fx.v[n]);

printf("\n\n EL RESULTADO DE LA INTEGRAL SERA: %.10lf \n",I);

}

///-----------------------------------------------------------------

void metSimpson(int des)

{

Vect fx;

Vect x;

double I,h,a,b,s=0,sp=0, si=0;

int n;

printf("\n *****METODO DEL SIMPSON***** ");

printf("\n Ingrese los limites de la ecuacion: \n");

printf("\n a -> "); cin>>a;

printf("\n b -> "); cin>>b;

printf("\n Ingrese # de intervalos: "); cin>>n;

h=(double)(b-a)/n;

printf("\n Por lo tanto el paso h sera: %.10lf\n",h);

for(int j=0 ; j<=n ; j++)

{

Ec_Trapecio_Simpson(x.v[j],fx.v[j],a,h,j);

s=(double) s + fx.v[j];

}


if(des==1)

{

for(int i=1 ; i<n ; i++)

{

if(i%2==0) sp=(double) sp+fx.v[i];

else si=(double) si+fx.v[i];

}

printf("\n i x[i] Fx[i]");

cout<<"\n ----------------------------------";

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

{

printf("\n %d | %.10lf | %.10lf",i,x.v[i],fx.v[i]);

}

I=(double)(h/3)*(fx.v[0]+fx.v[n]+(4*si)+(2*sp));

printf("\n\n EL RESULTADO DE LA INTEGRAL SERA: %.10lf \n",I);

}

if(des==2)

{

for(int i=1 ; i<n ; i++)

{

if(i%3==0)

sp=(double) sp+fx.v[i];

else

si=(double) si+fx.v[i];

}

printf("\n i x[i] Fx[i]");

cout<<"\n ----------------------------------";

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

{

printf("\n %d | %.10lf | %.10lf",i,x.v[i],fx.v[i]);

}

I=(double)(3*h/8)*(fx.v[0]+fx.v[n]+(3*si)+(2*sp));

printf("\n\n EL RESULTADO DE LA INTEGRAL SERA: %.10lf \n",I);

}

}

///-----------------------------------------------------------------

void Lamb_Absc(int valor,Vect &abscisas,Vect &lambdas)

{

if(valor==2)

{

abscisas.v[0]=(double) -1/sqrt(3);

abscisas.v[1]=(double) 1/sqrt(3);

lambdas.v[0]=1;

lambdas.v[1]=1;

}

if(valor==3)

{

abscisas.v[0]=(double) -sqrt(0.6);

abscisas.v[1]= 0;

abscisas.v[2]=(double) sqrt(0.6);

lambdas.v[0]=(double) 5/9;

lambdas.v[1]=(double) 8/9;

lambdas.v[2]=(double) 5/9;

}

if(valor==4)

{

abscisas.v[0]=(double) -0.861136311594053;

abscisas.v[1]=(double) -0.339981043584856;

abscisas.v[2]=(double) 0.339981043584856;

abscisas.v[3]=(double) 0.861136311594053;

lambdas.v[0]=(double) 0.347854845137454;

lambdas.v[1]=(double) 0.652145154864546;

lambdas.v[2]=(double) 0.652145154864546;

lambdas.v[3]=(double) 0.347854845137454;

}

if(valor==5)

{

abscisas.v[0]=(double) -0.906179845938664;

abscisas.v[1]=(double) -0.538469310105683;

abscisas.v[2]= 0;

abscisas.v[3]=(double) 0.538469310105683;

abscisas.v[4]=(double) 0.906179845938664;

lambdas.v[0]=(double) 0.236926885056189;

lambdas.v[1]=(double) 0.478628670499366;

lambdas.v[2]=(double) (128/225);

lambdas.v[3]=(double) 0.478628670499366;

lambdas.v[4]=(double) 0.236926885056189;

}

if(valor==6)

{

abscisas.v[0]=(double) -0.932469514203152;

abscisas.v[1]=(double) -0.661209386466265;

abscisas.v[2]=(double) -0.238619186083197;

abscisas.v[3]=(double) 0.238619186083197;

abscisas.v[4]=(double) 0.661209386466265;

abscisas.v[5]=(double) 0.932469514203152;

lambdas.v[0]=(double) 0.171324492379171;

lambdas.v[1]=(double) 0.360761573048139;

lambdas.v[2]=(double) 0.467913934572691;

lambdas.v[3]=(double) 0.467913934572691;

lambdas.v[4]=(double) 0.360761573048139;

lambdas.v[5]=(double) 0.171324492379171;

}

}

///-----------------------------------------------------------------

void Ec_GaussLegendre(double A,double B,double &x,double &fx,double absc)

{

x=(double) (A*absc)+B;

fx=(double) pow((pow(x,2)+1),cos(x));

}

///-----------------------------------------------------------------

void metGaussLegendre(int num)

{

Vect fx,x,ab,la;

double I,a,b,A,B,s=0;

printf("\n *****METODO DE GAUSS LEGENDRE***** ");

printf("\n Ingrese los limites de la ecuacion: \n");

printf("\n a -> "); cin>>a;

printf("\n b -> "); cin>>b;

A=(double) (b-a)/2;

B=(double) (b+a)/2;


if(num==2) Lamb_Absc(num,ab,la);

if(num==3) Lamb_Absc(num,ab,la);

if(num==4) Lamb_Absc(num,ab,la);

if(num==5) Lamb_Absc(num,ab,la);

if(num==6) Lamb_Absc(num,ab,la);

for(int i=0 ; i<num ; i++)

{

Ec_GaussLegendre(A,B,x.v[i],fx.v[i],ab.v[i]);

}

printf("\n i t[i] x[i] fx[i] lambda[i] lambda[i]*fx[i] \n");

cout<<"------------------------------------------------------------------------------\n";

for(int i=0 ; i<num ; i++)

{

printf("\n %d | %.10lf | %.10lf | %.10lf | %.10lf | %.10lf",i+1,ab.v[i],x.v[i],fx.v[i],la.v[i],(la.v[i]*fx.v[i]));

}

for(int i=0 ; i<num ; i++)

{

s=(double) s + (la.v[i]*fx.v[i]);

}

I=(double) A * (s);

printf("\n\n EL RESULTADO DE LA INTEGRAL SERA: %.10lf \n",I);

}

///-----------------------------------------------------------------

void menu()

{

int op,des,n,nn;

printf("\n ******DEVELOPED BY ALEXIS HUGO SEGALES RAMOSETH****** ");

printf("\n\n Escoja el metodo de integracion: ");

printf("\n\n 1. Metodo del Trapecio");

printf("\n\n 2. Metodo de Simpson");

printf("\n\n 3. Metodo de Gauss Legendre");

printf("\n\n -> ");cin>>op;

system("cls");

if(op==1)

{

metTrapecio();

}

if(op==2)

{

printf("\n\n Desea resolver por: ");

printf("\n\n 1) SIMPSON 1/3");

printf("\n\n 2) SIMPSON 3/8");

printf("\n\n -> "); cin>>des;

system("cls");

metSimpson(des);

}

if(op==3)

{

printf("\n\n Ingrese # de puntos: "); cin>>n;

if(n>1 && n<7)

{

system("cls");

metGaussLegendre(n);

}

else

{

printf("\n El numero de puntos esta fuera de los limites.\n");

printf("\n Coloque nuevo # de puntos >1 % <7 :\n ->"); cin>>nn;

system("cls");

metGaussLegendre(nn);

}

}

}

///-----------------------------------------------------------------

void limppant()

{

cout<<"\n Desea Volver a iniciar?\n 1) SI \n 2) NO \n\n";

int mess; cin>>mess;

if(mess==1)

{

system("cls");

system("reset");

menu();

limppant();

}

if(mess==2)

{

system("close");

}

}

///-----------------------------------------------------------------

int main()

{

menu();

limppant();

return 0;

}



31 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comments


Publicar: Blog2_Post
bottom of page