top of page
Foto del escritorGato Ingeniero

Resolver Integrales Dobles NO Rectangulares

Actualizado: 6 ene 2022

-> Tiene su menú interactivo, es mas de lo que muestra la imagen.

-> Mantiene una precisión comprobada de 9 decimas.

-> Presenta 3 métodos para resolver las ecuaciones planteadas.

-> Trabaja las ecuaciones en funciones independientes.

-> Las condiciones iniciales deben ser declaradas antes de correr el programa.

-> Las ecuaciones deben ser declaradas antes de correr el programa.

-> Mejorable añadiendo funciones para las ecuaciones para cada caso de integración, si así se desea.

-> Dado que el programa puede ciclarse se puede colocar datos con diferentes funciones y valores iniciales, aunque por ahora esta limitado a una función para todos los casos. Logrando así resolver 3 ejercicios sin terminar de correr el programa.

Acá les dejo el código:

///INTEGRALES DOBLES

#include <iostream>

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <iomanip>

#include <string.h>

using namespace std;

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

struct Vect

{

double v[100];

};

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

double pi=3.14159265 , e=2.71828183;

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

void paso_inicial(double &h1,double &n1,double &c,double &d)

{

double aux1,aux2,aux3;

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

cout<<"\n MODELO DE LA INTEGRAL: I[I F(xy) dx] dy";

cout<<"\n Defina los limites de la integral EXTERNA: ";

cout<<"\n desde c= "; cin>>aux1; cout<<" hasta d= "; cin>>aux2;

cout<<"\n Con cuantos intervalos desea trabajar: ";

cout<<"\n -> "; cin>>aux3;

c=aux1; d=aux2; n1=aux3;

h1=(double) (d-c)/n1;

}

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

void fun_all(double &x,double &y,double &f)

{

f=(double) (x+y)/(cos(x)+cos(y));

}

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

void con_iniciales(double &a,double &b,double y)

{

a=0;

b=1-y;

}

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

void metTrapecio()

{

Vect y,x,fx,S,aa,bb,h3;

double suma2=0,suma,c,d,n1,h1,I,p2=0,p3=0;

paso_inicial(h1,n1,c,d);

system("cls");


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

{

suma=0;

printf("\n %d. Integral Interna: ",i+1);

y.v[i]=(double) c + (i*h1);

con_iniciales(aa.v[i],bb.v[i],y.v[i]);

h3.v[i]=(double) (bb.v[i]-aa.v[i])/n1;

printf("\n Desde a= %.10lf Hasta b= %.10lf Con paso de h= %.10lf \n",aa.v[i],bb.v[i],h3.v[i]);

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

{

x.v[j]=(double) aa.v[i]+(j*h3.v[i]);

fun_all(x.v[j],y.v[i],fx.v[j]);

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

if(j==0 || j==n1) p2+=fx.v[j];

}

for(int k=1 ; k<n1 ; k++)

{

suma=(double) suma+fx.v[k];

}

//printf("\n El valor de las sumas intermedias es: %.10lf ",suma);

S.v[i]=(double) (h3.v[i]/3)*(p2+(2*suma));

//printf("\n El valor de la %d. Integral es: %.10lf",i+1,S.v[i]);

if(i==0 || i==n1) p3+=S.v[i];

printf("\n");

}

for(int l=0 ; l<=n1 ; l++)

{

printf("\n Resultado %d. Integral -> %.10lf",l+1,S.v[l]);

}

for(int k=1 ; k<n1 ; k++)

{

suma2=(double) suma2+S.v[k];

}

I=(float) (h1/3)*(p3+(2*suma2));

printf("\n\n EL VALOR DE LA INTEGRAL DOBLE ES: %.10lf\n_",I);

}

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

void metSimpson()

{

Vect y,x,fx,S,aa,bb,h3;

double c,d,n1,h1,I,p1=0,p2=0,spa=0,sim=0,sp,si;

paso_inicial(h1,n1,c,d);

system("cls");


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

{

sp=0, si=0;

printf("\n %d. Integral Interna: ",i+1);

y.v[i]=(double) c + (i*h1);

con_iniciales(aa.v[i],bb.v[i],y.v[i]);

h3.v[i]=(double) (bb.v[i]-aa.v[i])/n1;

printf("\n Desde a= %.10lf Hasta b= %.10lf Con paso de h= %.10lf \n",aa.v[i],bb.v[i],h3.v[i]);

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

{

x.v[j]=(double) aa.v[i]+(j*h3.v[i]);

fun_all(x.v[j],y.v[i],fx.v[j]);

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

if(j==0 || j==n1) p2+=fx.v[j];

}

for(int k=1 ; k<n1 ; k++)

{

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

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

}

//printf("\n El valor de las sumas pares es : %.10lf ",sp);

//printf("\n El valor de las sumas impares es: %.10lf ",si);


S.v[i]=(float) (h3.v[i]/3)*(p2+(4*si)+(2*sp));

//printf("\n El valor de la %d. Integral es: %.10lf",i+1,S.v[i]);

if(i==0 || i==n1) p1+=S.v[i];

printf("\n");

}

printf("\n Los Valores de las Integrales Internas son: ");

for(int l=0 ; l<=n1 ; l++)

{

printf("\n %d. %.10lf ",l+1,S.v[l]);

}

for(int k=1 ; k<n1 ; k++)

{

if(k%2==0) spa=(double) spa+S.v[k];

else sim=(double) sim+S.v[k];

}

I=(float) (h1/3)*(p1+(4*sim)+(2*spa));

printf("\n\n EL VALOR DE LA INTEGRAL DOBLE ES: %.10lf",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 metGaussLegendre()

{

Vect y,x,fx,S,abscisas,lambdas,lamfun,Suma,aa,bb,AAA,BBB;

double c,d,n1,h1,I,AA,BB,s;

paso_inicial(h1,n1,c,d);

AA=(double) (d-c)/2;

BB=(double) (d+c)/2;

system("cls");

if(n1==2) Lamb_Absc(n1,abscisas,lambdas);

if(n1==3) Lamb_Absc(n1,abscisas,lambdas);

if(n1==4) Lamb_Absc(n1,abscisas,lambdas);

if(n1==5) Lamb_Absc(n1,abscisas,lambdas);

if(n1==6) Lamb_Absc(n1,abscisas,lambdas);



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

{

printf("\n %d. INTEGRAL INTERNA: ",i+1);

y.v[i]=(double) (AA*abscisas.v[i])+BB;

printf(" | Con y[%d]= %.10lf ",i+1,y.v[i]);

con_iniciales(aa.v[i],bb.v[i],y.v[i]);

printf(" | a= %.10lf | b= %.10lf\n",aa.v[i],bb.v[i]);

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

printf("\n ------------------------------------------------------------------------------------");

s=0;

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

{

AAA.v[j]=(bb.v[i]-aa.v[i])/2;

BBB.v[j]=(bb.v[i]+aa.v[i])/2;

x.v[j]=(double) (AAA.v[j]*abscisas.v[j])+BBB.v[j];

fun_all(x.v[j],y.v[i],fx.v[j]);

lamfun.v[j]=(double) (lambdas.v[j]*fx.v[j]);

printf("\n |%d.| %.10lf | %.10lf | %.10lf | %.10lf | %.10lf |",j+1,abscisas.v[j],x.v[j],fx.v[j],lambdas.v[j],lamfun.v[j]);

s=s+lamfun.v[j];

}

for(int k=1 ; k<n1 ; k++)

{

S.v[k]=(double) s*BBB.v[k];

printf("\n Resultado de la Integral %.10lf \n",S.v[k]);

Suma.v[i]=S.v[k];

}

printf("\n");

}

double suma=0;

for(int k=0 ; k<n1 ; k++)

{

suma=(double) suma+Suma.v[k];

}

I=(double) AA*suma;

printf("\n\n EL VALOR DE LA INTEGRAL DOBLE ES: %.10lf \n",I);

}

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

void menumetodos()

{

int opcion;

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

cout<<"\n 1. La Regla Compuesta del Trapecio";

cout<<"\n 2. La Regla Compuesta de Simpson";

cout<<"\n 3. Cuadratura de Gauss Legendre";

cout<<"\n\n -> ";cin>>opcion;

if(opcion==1)

{

system("cls");

metTrapecio();

}

if(opcion==2)

{

system("cls");

metSimpson();

}

if(opcion==3)

{

system("cls");

metGaussLegendre();

}

}

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

void limppant()

{

printf("\n Desea iniciar de nuevo \n 1)SI \n 2)NO ");

int mess; cin>>mess;

if(mess==1)

{

system("cls");

system("rst");

menumetodos();

limppant();

}

if(mess==2)

{

system("close");

}

}

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

int main()

{

menumetodos();

limppant();

return 0;

}


10 visualizaciones0 comentarios

Entradas recientes

Ver todo

留言


Publicar: Blog2_Post
bottom of page