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;
}
Comments