Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Programa en C que integre y derive (integración y derivación numérica)

Estas en el tema de Programa en C que integre y derive (integración y derivación numérica) en el foro de C/C++ en Foros del Web. ¡Muy buenos tiempos tenga toda la comunidad de ForosDelWeb! Antes que nada, muchas gracias por tomarse la molestia de leer este tema, sepan que cualquier ...
  #1 (permalink)  
Antiguo 23/11/2010, 19:43
 
Fecha de Ingreso: diciembre-2009
Ubicación: Guadalajara, Jalisco
Mensajes: 300
Antigüedad: 14 años, 4 meses
Puntos: 13
Pregunta Programa en C que integre y derive (integración y derivación numérica)

¡Muy buenos tiempos tenga toda la comunidad de ForosDelWeb!

Antes que nada, muchas gracias por tomarse la molestia de leer este tema, sepan que cualquier aportación es bien recibida.

El motivo de mi consulta es porque necesito realizar un programa en ANSI C para la consola, capaz de integrar y derivar un determinado valor que el usuario le introduzca (derivación e integración numérica) y la verdad, no sé por dónde comenzar.

Tengo muy sólidas bases en programación estructurada, así como dirigida a objetos; por lo que podré interpretar los códigos que me proporcionen; sin embargo, al parecer esta aplicación requiere bastantes cálculos matemáticos, para lo cual desafortunadamente, no soy muy bueno que digamos.

En verdad, espero que me puedan ayudar y sepan que de antemano, estoy sumamente agradecido por sus aportaciones, cualesquiera que éstas sean. Cualquier aportación es bien recibida. Muchas gracias y espero con ansias sus respuestas.

Saludos.
  #2 (permalink)  
Antiguo 24/11/2010, 03:54
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Programa en C que integre y derive (integración y derivación numérica)

Si no tienes la base matemática, no lo tienes fácil. Te puedo dar uin par de sugerencias:

Hay un libro titulado Numerical Recipes in C (no recuerdo ahora editorial ni autor), este libro trae funciones para un montón de cosas de análisis numérico junto con algo de teoría. El libro es en inglés, no sé si hay alguna traducción al castellano.

Mira en esta web:

http://www.thefreecountry.com/

En la sección Programming -> Source Code/Libraries puedes encontrar varias librerías matemáticas, quizás alguna te sirva.
  #3 (permalink)  
Antiguo 25/11/2010, 03:03
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Programa en C que integre y derive (integración y derivación numérica)

En realidad no es tan dificil, de hacer, son unas cuantas lineas de codigo, el problema es entender los fundamentos de la integracion y derivacion numerica.

Dime que tan preciso necesitas que sea? Para la integracion numerica, para que no te lo compliques tanto con la regla de 3/8 de simpson (que a mi gusto es de las mas precisas), puedes utilizar rectangulos.

Veras, la integracion de una funcion, no es nada mas que encontrar el area bajo la grafica de una funcion. (El area bajo la curva)



Pero esto que significa exactamente? Veras, todas las funciones polinomiales te generan una grafica, y si encuentras el area bajo la grafica de una determinada funcion, entonces estas encontrando la integral numerica de dicha funcion.

Si lo que buscas no es necesariamente precision, puedes utilizar el metodo de los rectangulos para encontrar la integral numerica.

El metodo de los rectangulos basicamente consiste en que, vas a ver la grafica como si estuviera hecha a base de puros rectangulos, posteriormente encuentras el area de cada rectangulo, y lo vas sumando hasta que sumes el area de todos los rectangulos detro del intervalo [a,b].

Observa la siguiente grafica:



Veras que la grafica esta dividida en rectangulos, si encuentras el area de cada rectangulo y despues la sumas, estas encontrando el area bajo la curva.
Como veras, en la grafica, hay una h en la parte baja, y representa el espaciado que hay entre punto y punto. Este espaciado te sirve para encontrar la precision de tus resultados. En el primer escenario, con una h grande (un espaciado grande), veras que hay muchos errores de sobre estimacion, y sub estimacion, lo cual repercute directa y negativamente en la exactitud y validez de tu resultado.

Si disminuyes el espaciado, disminuyes a su vez el error, lo cual te da una mejor precision, aunque no te fies demasiado, que este metodo no es de los mas correctos que existen. Es para el programador "flojo" o poco precavido, o que realmente no le interesa la exactitud del resultado.

En este caso, la base del rectangulo, es el valor de h, y la altura del rectangulo, va a ser la evaluacion de la funcion a integrar, en cada uno de los puntos sobre el eje de las X.

Ya en cuestion de programacion, necesitas tener un vector, con los intervalos en el eje de las X.

Por ejemplo, si quieres encontrar la integral de la funcion x en el intervalo [0,1] con un espaciado H = 0.1
Entonces necesitas crear un vector con los valores

[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]

Donde el primer y ultimo numero del vector, son los limites de la integral.

digamos que el vector lo llamamos A
Entonces, la integral de la funcion X, la encontrarias de la siguiente manera:

Integral += evalua(mifuncion,A[i]) * H;

donde la funcion evalua, va a evaluar, el numero en la posicion A[i] con cualquiera que sea el valor de mifuncion.

ahora, si no te quieres meter en lios de evaluacion simbolica, tu funcion tambien la puedes guardar en un vector, y utilizas asignacion dinamica de memoria, para tener una funciona polinomial de orden N

Este es un ejemplo de funcion polinomial:
10x^3 + 8x^2 - 34x + 2

Las reglas matematicas dicen que las funciones se deben escribir de mayor a menor exponente y con una constante (un numero) al final, si el numero es diferente de cero.

Entonces podemos generalizar la regla de la siguiente manera:

ax^n + ax^(n-1) + ax^(n-2) + ...+ ax^(n-k) + ax + C

donde C representa una constante.

Entonces puedes almacenar las funciones polinomiales en un vector, especificando que tienen que ser escritas correctamente.

Por ejemplo si quisieran escribir la funcion x^2 + 3x + 2

Tendrias que pedir un vector con los valores
[1 , 3 , 2] y pedir el orden la funcion, en este caso es de orden 2, y ya con eso podrias aplicar la generalizacion de la formula, y evaluar tu funcion en cualquier punto.

Si quisieras escribir la funcion x^5 + 1, entonces tu vector tiene la forma:
[1 0 0 0 0 1]
Lo que estas escribiendo son los coeficientes, la computadora te entenderia algo como:
1x^5 + 0x^4 + 0 x^3 + 0x^2 + 0x + 1

Si quisieras representar la funcion 5x3 + 40, el vector quedaria:
[5 0 0 40]

Tiene sentido?
Te quedaria algo parecido a:
Código C++:
Ver original
  1. funcion = [1, 3, 2];
  2. orden = 2;
  3. k=0;
  4. Resultado = 0;
  5. /*Evaluando un numero en el punto 0.1*/
  6. for(int i = 0; i < orden; i++)
  7. {
  8. Resultado += funcion[i]*pow(0.1,orden-k);
  9. k = (k!=orden)?k+1;
  10. }
  11. Resultado += funcion[orden];


No te fies del codigo de arriba, son las 3 AM aca y ando medio dormido :) pero mas o menos seria asi, para evaluar una funcion polinomial en un punto determinado, lo unico seria reemplazar el 0.1, por el valor del vector que te puse anteriormente con el espaciado, ya con eso tendrias una integral numerica, mas o menos correcta.

Última edición por AlanChavez; 25/11/2010 a las 13:01

Etiquetas: integración, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:24.