[SOLUCIONADO] Ayuda con algoritmo, método trapezoidal de integración (C++)

Iniciado por neox, Agosto 13, 2011, 11:36:36 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Buenas, estoy empezando un curso de c++ en la universidad, me han puesto a hacer un programa para calcular las integrales de una funcion, queria ver si alguien me puede echar la mano que no tengo idea de como hacerlo.

SALUDOS!!  8)

Hola,

Pon lo que tienes hasta ahora, una idea de lo que quieres hacer y procuraremos ayudarte. Que no te parezca mal, pero hacerte el algoritmo de 0 sería hacerte la tarea.

Un saludo.

la programación es, en general, para automatizar las tareas.

sabes sacar las integrales con lápiz y papel?
ese sería el algoritmo.
¡< blozzter >!

Agosto 13, 2011, 02:35:30 PM #3 Ultima modificación: Agosto 13, 2011, 03:53:07 PM por Sensei
por el momento llevo esto;

Código: c
#include "StdAfx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h> /*para getch(),clrscr()*/
#include <stdlib.h>/*para exit()*/

using namespace std;


double x;
float a,b;
double h;
double So=0.0;
double f(double x);
double Area;
int n;
//Calculo de una integral con el metodo del trapecio
void trapecio(){

double Linf=a,Lsup=b;
int signo=1;
if(a>b){
Linf=b; Lsup=a; signo=-1;
  }
  cout<<"Ingrese el limite inferior";
  cin>>Linf;
  cout<<"Ingrese limite superior";
  cin>>Lsup;
  cout<<"Ingrese el numero de segmentos";
  cin>>n;

  h=(Lsup-Linf)/(double)n;
  for(x=Linf+h;x<Lsup;x+=h)
   So+=f(x);
   Area=(signo*h*(f(a)+2*So+f(b))/2.0);
   cout<<"El area es -> "<<Area<<endl<<endl;
   cout<<"Presione cualquier tecla para salir";
   getch();
}



void main(){
trapecio();
cout<<"Presione enter para salir..."<<endl;
getch();
}


y me esta dando un error; símbolo externo "double __cdecl f(double)" (?f@@YANN@Z) sin resolver al que se hace referencia en la función "void __cdecl trapecio(void)" (?trapecio@@YAXXZ)

a ver si me echan la mano ;)... Saludos

Agosto 13, 2011, 03:31:51 PM #4 Ultima modificación: Agosto 13, 2011, 03:55:19 PM por Sensei
Hola,

Ahora mismo no puedo testearlo, estoy fuera de casa y hasta mañana no llego, imagino que eso del método del cateto tiene que ver con las sumas riemman me he puesto a dibuar en un papel, hice un esquemita y lo he pasado a C (Lo siento pero de C++ todavía no me desenvuelvo), creo que sería algo así:

Código: c

/*Integral método Riemann by sensei to Underc0de.org*/
#include <stdio.h>

void main(void) {
  int n, x;
  double Area=0.0, h;
  double f(double);

  printf("Numero de catetos?: ");
  scanf("%d", &n);
  printf("Limite superior?: ");
  scanf("%d", &Lsup);
  printf("Limite inferior?: ");
  scanf("%d", &Linf);

  h=(Lsup-Linf)/n;
  for(x=Linf;x<Lsup;x++)
     Area+=((f(x*h)+f(x+1)*h))*h/2
  printf("El area calculada es: %f\n", Area);
}

double f(double x){
  double y;
  y=ECUACION A CALCULAR
  return y;
}


Espero haberte ayudado, en tu código creo que el problema es que primero, no aparece "f" por ningún lado, es decir, la ecuación sobre la que trabjar.

Luego, esto, que no entiendo por aque pones el double aquí:

h=(Lsup-Linf)/(double)n; sería sólo h=(Lsup-Linf)/n

Por lo demás creo que está bien, espero haberte ayudado, sino, mañana-pasado en cuanto llegue a casa y esté más concentrado intentaré resolvertelo incluso en C++.

Un saludo!


ya he visto los errores sensei!! gracias.

con respecto a lo de f... podria ser que  agregue un menu con unas 15 funciones, y sobre ellas calcule la integral??..

Se podría hacer, pero el método más fácil es modificar en el code la ecuación y ya está, por ejemplo, para x³-x²-5, pues:

y=x*x*x-x*x-5

Si ya has modificado los errores podrías compartir el código en C++ con todos y así podríamos cerrar el hilo si ya se ha resuelto tu problema.

Un saludo!

listo, lo publicare mañana para todo el que lo necesite!! que lo tengo que dejar bonito jaja!

Saludos y gracias!!

Perfecto, pues cuando lo publiques daremos el tema solucionado, cualquier otro problema aquí nos tienes, aunque imagino que el algoritmo ya funciona, jeje.

Un saludo!

Agosto 14, 2011, 12:43:16 PM #9 Ultima modificación: Agosto 14, 2011, 02:08:17 PM por Sensei
vuelvo con problemas!!! disculpen q moleste tanto pero vengo empezando en esto :P... Mi trabajo requiere hacer un menu con varias funciones, ya lo hago sin embargo hay errores q no entiendo a ver si porfavor me echan la mano!! ahi va el codigo-->

Código: cpp
#include "StdAfx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h> /*para getch(),clrscr()*/
#include <stdlib.h>/*para exit()*/

using namespace std;


double x;
float a,b;
double h;
double So=0.0;
double f(double x);
double Area;
int n;
//Calculo de una integral con el metodo del trapecio
void trapecio(double f(double x)){

double Linf=a,Lsup=b;
int signo=1;
if(a>b){
Linf=b; Lsup=a; signo=-1;
  }
  cout<<"Ingrese el limite inferior";
  cin>>Linf;
  cout<<"Ingrese limite superior";
  cin>>Lsup;
  cout<<"Ingrese el numero de segmentos";
  cin>>n;

  h=(Lsup-Linf)/n;
  for(x=Linf+h;x<Lsup;x+=h)
   So+=f(x);
   Area=(signo*h*(f(a)+2*So+f(b))/2.0);
   cout<<"El area es -> "<<Area<<endl<<endl;
   cout<<"Presione cualquier tecla para salir";
   getch();
}



void main(){
bool men=true;
int op=0;
while (true){
system ("CLS");
cout<<"*************************************************************************"<<endl;
cout<<"MENU DE INTEGRALES"<<endl;
cout<<"*************************************************************************"<<endl; //³¤²
cout<<"1--> x²-5x+25 "<<endl;
cout<<"2--> x³+2x²-x-10 "<<endl;
cout<<"3--> tan(x)/x "<<endl;
cout<<"4--> sen(x) "<<endl;
cout<<"5--> cos(x) "<<endl;
cout<<"6--> tan(x) "<<endl;
cout<<"7--> sen(x)/x "<<endl;
cout<<"8--> cos(x)/x "<<endl;
cout<<"9--> cos(x)/x² "<<endl;
cout<<"10--> sen(x)/x² "<<endl;
cout<<"11--> tan(x)/x² "<<endl;
cout<<"12--> sen(x)²/x "<<endl;
cout<<"13--> cos(x)²/x "<<endl;
cout<<"14--> tan(x)²/x "<<endl;
cout<<"15--> sen(x)*cos(x) "<<endl;
cout<<"16--> SALIR! "<<endl<<endl;
cout<<"Escoja la integral que desea calcular...";
cin>>op;
switch (op) {
case 1:{
f(x*x-5*x+25);
trapecio(f);
break;
   }
case 2:{
f=x*x*x+2*(x*x)-x-10;
trapecio(f);
break;
   }
case 3:{
f=tan(x)/x;
trapecio(f);
break;
   }
case 4:{
f=sin(x);
trapecio(f);
break;
   }
case 5:{
f=cos(x);
trapecio(f);
break;
   }
case 6:{
f=tan(x);
trapecio(f);
break;
   }
case 7:{
f=sin(x)/x;
trapecio(f);
break;
   }
case 8:{
f=cos(x)/x;
trapecio(f);
break;
   }
case 9:{
f=cos(x)/x*x;
trapecio(f);
break;
   }
case 10:{
f=sin(x)/x*x;
trapecio(f);
break;
}
case 11:{
f=tan(x)/x*x;
trapecio(f);
break;
}
case 12:{
f=(sin(x)*sin(x))/x;
trapecio(f);
break;
}
case 13:{
f=(cos(x)*cos(x))/x;
trapecio(f);
break;
}
case 14:{
f=(tan(x)*tan(x))/x;
trapecio(f);
break;
}
case 15:{
f=sin(x)*cos(x);
trapecio(f);
break;
}
case 16:{
men=false;
break;
}
default:cout<<"La opcion digitada no existe!"<<endl;
}
}
}

les agradezco cualquier ayuda!! Saludos

Agosto 14, 2011, 02:07:39 PM #10 Ultima modificación: Agosto 14, 2011, 02:23:15 PM por Sensei
Lo he mirado así por encima y creo que el algoritmo está bien, el error creo que es debido a que utilizas las funciones seno, coseno, ... y no has incluído la librería cmath.

Código: cpp
#include <cmath>


De estar compilando con gcc y desde linux, esta biblioteca a veces da problema y debes utilizar el comando -lm, prueba así de ser tu caso:

Código: bash
$ gcc fuente.c -lm -o <ejecutable>


En todo caso, comenta que errores te dá y en qué estás atascado para intentar guiarte más que para resolver directamente.

Un saludo!

sensei muchisimas gracias por la ayuda!, lo de math ya lo habia agregado por ahi no anda; el error que me sale es este:

1>c:\users\ary\documents\visual studio 2010\projects\integral\integral\integral.cpp(144): error C2659: '=' : función como operando izquierdo

el mismo en todas las lineas donde esta f= bla bla bla

Hola!

Pues la verdad, esto de no estar en mi pc, poder compilar y probar y apenas conocer C++, no ayuda, pero si ese el error me imagino que tiene que ver con las variables de trapecio, fíjate:

void trapecio(double f(double x))

Un saludo!

muy curiosa la forma de este codigo, sobre la funcion del trapecio como que lo vi en un codigo de c++ optimizado asi que no lo entiendo muy bien, pero hay algo que me llama la atencion:
Código: php
f(x*x-5*x+25);

del case 1, bueno en humilde opinion habria que darle asignacion
Código: php
 f=(x*x-5*x+25);

creo que si vemos en msdn el error: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
que seria mejor hacerlo asi:
Código: php
void trapecio(double f, double x)


Bueno es una idea ahora solo estaba leyendo uno de los talleres :)

saludos
Your kung-fu is not strong!

Hola neox!

Veo que no has vuelto a postear en este thread y que tampoco me has contactado por mail como me habías comentado por mp para intentar resolverlo sin postear tanto, jeje.

Lo has solucionado ya por tu cuenta?

De ser así estaría bien que comentaras en que te bloqueaste y como conseguiste solucionarlo, seguro que de esta forma podremos aprender todos y dar el problema como solucionado.

Un saludo.