Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.30 KB | None | 0 0
  1. //Hi folks! i need to know hot to declare an array
  2. //
  3. //I know how to dogie
  4.  
  5.  
  6. /*
  7.     ##############################################################################################################
  8.         FUNCIÓN PARA CALCULAR LA DERIVADA PRIMERA DE UNA FUNCIÓN USANDO LAS FÓRMULAS VISTAS EN CLASE
  9.           - LOS PUNTOS VIENEN DADOS EN EL VECTOR x.
  10.           - LA FUNCIÓN f(x) VIENE DADA POR EL VECTOR fx,
  11.           - HAY QUE TENER EN CUENTA LA GESTIÓN DE LOS BORDES, ES DECIR, DE LOS VALORES DE LOS EXTREMOS DEL VECTOR:
  12.           - BORDES: CALCULAR DERIVADA CON 2 PUNTOS. ES DECIR : f'(xi)=(fx(xj)-fx(xi))/(xj-xi)
  13.           - RESTO DE ELEMENTOS: CALCULAR DERIVADA CON 3 PUNTOS. ES DECIR:
  14.           f'(xi)=((xi-xl)(f(xr)-f(xi))/(xr-xi) + (xr-xi)(f(xi)-f(xl))/(xi-xl))  / (xr-xl)
  15.           - LA DERIVADA SE DEVUELVE EN EL VECTOR DE ENTRADA/SALIDA fd.
  16.           - LA FUNCIÓN DEVUELVE 0 SI TERMINA CORRECTAMENTE, Y -1 EN CASO DE ERROR.
  17.     ################################################################################################################
  18.   */
  19.  
  20. int mn_derivada(Array1D <real> x, Array1D <real> fx, Array1D <real> &fd) {
  21.   int Npuntos = x.dim();
  22.   //HACER ALUMNO
  23.   int Fpuntos = fx.dim();
  24.   if(Npuntos != Fpuntos) {
  25.     return -1;
  26.   } else {
  27.     for (int i = 0; i < Npuntos; i++) {
  28.       if(i == 0) {
  29.         fd[i] = (fx[i+1] - fx[i])/(x[i+1] - x[i]);
  30.       } else if(i == Npuntos-1) {
  31.         fd[i] = (fx[i-1] - fx[i])/(x[i-1] - x[i]);
  32.       } else {
  33.         fd[i]=((((x[i] - x[i-1]) * (fx[i+1] - fx[i])) / (x[i+1] - x[i])) + (((x[i+1] + x[i]) * (fx[i] - fx[i-1])) / (x[i] - x[i-1]))) / (x[i+1] - x[i-1]);
  34.       }
  35.     }
  36.   }
  37.   return 0;
  38. }
  39.  
  40.  
  41.  
  42. // #############################################################
  43. // FUNCIÓN PARA CALCULAR UNA INTEGRAL POR EL MÉTODO DEL TRAPECIO
  44. // UTILIZANDO N INTERVALOS EN UN INTERVALO [a,b]
  45. // #############################################################
  46.  
  47. real mn_trapecio(
  48.   real (*f)(const real x),  // Función que se integra
  49.   const real a,       // Extremo izquierdo del intervalo
  50.   const real b,       // Extremo derecho del intervalo
  51.   const int N)        // Número de intervalos para calcular la integral
  52. {
  53.   //HACER ALUMNO
  54.   real integral = 0;                                  // Variable donde se acumula el valor de la integral
  55.   real funcion = (*f)(a);                               // Evaluación de la función en a
  56.   real h = (b-a)/(2.*N);                                // Factor multiplicativo
  57.   for (int i = 0; i < N; i++) {                           // Bucle para acumular el valor de la integral
  58.     real ext_dch = a + (i+1) * (b-a)/N;                       // Extremo derecho subintervalo
  59.     real ev_funcion = (*f)(ext_dch);                        // Evaluación de la función en el extremo derecho
  60.     integral += h * (funcion + ev_funcion);                     // Acumulación valor integral
  61.     funcion = ev_funcion;                             // Actualización valor integral extremo izquierdo
  62.   }
  63.   return integral;      // Se devuelve el valor de la integral
  64. }
  65.  
  66. // ###########################################################################
  67. // FUNCION PARA CALCULAR UNA INTEGRAL POR ITERACIONES DEL METODO DEL TRAPECIO
  68. // SE PARTE DE N=1 INTERVALOS Y SE CALCULA LA INTEGRAL CON LA FUNCION ANTERIOR
  69. // SE ACTUALIZA N MULTIPLICANDOLO POR 2 Y SE CALCULA DE NUEVO LA INTEGRAL
  70. // SE REALIZA ESTE PROCESO HASTA QUE LA DISTANCIA RELATIVA ENTRE LOS 2
  71. // VALORES DE LA INTEGRAL ES MENOR QUE LA TOLERANCIA. EN Niter  SE DEVUELVE
  72. // EL NUMERO DE ITERACIONES QUE SE REALIZA DE ESTE PROCESO
  73. // ###########################################################################
  74. mn_trapecio(
  75.   real (*f)(const real x),  // Función que se integra
  76.   const real a,       // Extremo izquierda del intervalo
  77.   const real b,       // Extremo derecho del intervalo
  78.   int &Niter,         // Variable de salida con el número de iteraciones realizadas
  79.   const real TOL)       // Tolerancia para controlar la convergencia
  80. {
  81.   // HACER ALUMNO
  82.   int N = 1;
  83.   real integral = mn_trapecio((*f),a,b,N);
  84.   real error = TOL + 1;
  85.   Niter = 0;
  86.   while (error > TOL) {
  87.     if(N > 1e7) break;    // Fijamos "a priori" el número máximo de intervalos a 1e7
  88.     Niter++;
  89.     N *= 2;
  90.     real integral2 = mn_trapecio((*f),a,b,N);
  91.     error = mn_distancia(integral, integral2);
  92.     integral = integral2;
  93.   }
  94.   return (integral);
  95. }
  96.  
  97.  
  98.  
  99. // ###########################################################
  100. // FUNCIÓN PARA CALCULAR UNA INTEGRAL POR EL MÉTODO DE SIMPSON
  101. // ###########################################################
  102. real mn_simpson(
  103.   real (*f)(const real x),  // Función que se integral
  104.   const real a,       // Extremo izquierdo del intervalo
  105.   const real b,       // Extremo derecho del intervalo
  106.   const int N)        // Número de intervalos para calcular la integral
  107. {
  108.   //HACER ALUMNO
  109.   real integral = 0;                                  // Variable donde se acumula el valor de la integral
  110.   real funcion = (*f)(a);                               // Evaluación de la función en a
  111.   real h = (b-a)/(6.*N);                                // Factor multiplicativo
  112.   for (int i = 0; i < N; i++) {                           // Bucle para acumular el valor de la integral
  113.     real ext_izq = a + i * (b-a)/N;                         // Extremo izquierdo subintervalo
  114.     real ext_dch = a + (i+1) * (b-a)/N;                       // Extremo derecho subintervalo
  115.     real ev_funcion = (*f)(ext_dch);                        // Evaluación de la función en el extremo derecho
  116.     integral += h * (funcion + ev_funcion + 4 * (*f)((ext_izq + ext_dch)/2.));    // Acumulación valor integral
  117.     funcion = ev_funcion;                             // Actualización valor integral extremo izquierdo
  118.   }
  119.   return integral;      // Se devuelve el valor de la integral
  120. }
  121.  
  122. // ########################################################################
  123. // FUNCIÓN PARA CALCULAR UNA INTEGRAL POR ITERACIONES DEL MÉTODO DE SIMPSON
  124. // ########################################################################
  125. real mn_simpson(
  126.   real (*f)(const real x),  // Función que se integra
  127.   const real a,       // Extremo izquierda del intervalo
  128.   const real b,       // Extremo derecho del intervalo
  129.   int &Niter,         // Variable de salida con el número de iteraciones realizadas
  130.   const real TOL)       // Tolerancia para controlar la convergencia
  131. {
  132.   // HACER ALUMNO
  133.   int N = 1;
  134.   real integral = mn_simpson((*f),a,b,N);
  135.   real error = TOL + 1;
  136.   Niter = 0;
  137.   while (error > TOL) {
  138.     if(N > 1e7) break;    // Fijamos "a priori" el número máximo de intervalos a 1e7
  139.     Niter++;
  140.     N *= 2;
  141.     real integral2 = mn_simpson((*f),a,b,N);
  142.     error = mn_distancia(integral, integral2);
  143.     integral = integral2;
  144.   }
  145.   return (integral);
  146. }
  147.  
  148.  
  149.  
  150. // ###############################################################
  151. // FUNCIÓN PARA CALCULAR UNA INTEGRAL POR EL MÉTODO DEL RECTÁNGULO
  152. // ###############################################################
  153. real mn_rectangulo(
  154.   real (*f)(const real x),  // Función que se integral
  155.   const real a,       // Extremo izquierdo del intervalo
  156.   const real b,       // Extremo derecho del intervalo
  157.   const int N)        // Número de intervalos para calcular la integral
  158. {
  159.   //HACER ALUMNO
  160.   real integral = 0;                                  // Variable donde se acumula el valor de la integral
  161.   real funcion = (*f)(a);                               // Evaluación de la función en a
  162.   real h = (b-a);                                   // Factor multiplicativo
  163.   for (int i = 0; i < N; i++) {                           // Bucle para acumular el valor de la integral
  164.     real ext_izq = a + i * (b-a)/N;                         // Extremo izquierdo subintervalo
  165.     real ext_dch = a + (i+1) * (b-a)/N;                       // Extremo derecho subintervalo
  166.     real ev_funcion = (*f)(ext_dch);                        // Evaluación de la función en el extremo derecho
  167.     integral += h * ((*f)((ext_izq + ext_dch)/2.));                 // Acumulación valor integral
  168.     funcion = ev_funcion;                             // Actualización valor integral extremo izquierdo
  169.   }
  170.   return integral;      // Se devuelve el valor de la integral
  171. }
  172.  
  173.  
  174.  
  175. // ############################################################################
  176. // FUNCIÓN PARA CALCULAR UNA INTEGRAL POR ITERACIONES DEL MÉTODO DEL RECTÁNGULO
  177. // ############################################################################
  178. real mn_rectangulo(
  179.   real (*f)(const real x),  // Función que se integra
  180.   const real a,       // Extremo izquierda del intervalo
  181.   const real b,       // Extremo derecho del intervalo
  182.   int &Niter,         // Variable de salida con el número de iteraciones realizadas
  183.   const real TOL)       // Tolerancia para controlar la convergencia
  184. {
  185.   // HACER ALUMNO
  186.   int N = 1;
  187.   real integral = mn_rectangulo((*f),a,b,N);
  188.   real error = TOL + 1;
  189.   Niter = 0;
  190.   while (error > TOL) {
  191.     if(N > 1e7) break;    // Fijamos "a priori" el número máximo de intervalos a 1e7
  192.     Niter++;
  193.     N *= 2;
  194.     real integral2 = mn_rectangulo((*f),a,b,N);
  195.     error = mn_distancia(integral, integral2);
  196.     integral = integral2;
  197.   }
  198.   return (integral);
  199. }
  200.  
  201. /************************************************************
  202. FUNCION PARA CALCULAR UNA INTEGRAL POR EL METODO DE CUADRATURA DE GAUSS UTILIZANDO
  203. UN VECTOR DE PUNTOS Y PESOS PARA EL INTERVALO [-1,1]. LOS VALORES DE PUNTOS Y PESOS
  204. VIENEN EN LAS MATRICES w Y x, POR EJEMPLO PARA LA FÓRMULA DE 2 PUNTOS LOS PESOS
  205. SERÍAN w[1][0] Y w[1][1] y LOS PUNTOS SERÍAN x[1][0] Y x[1][1]
  206.  
  207. NOTA : HAY QUE TENER EN CUENTA EL CAMBIO DE VARIABLE VISTO EN CLASE PARA PASAR UNA
  208. INTEGRAL EN UN INTERVALO [a,b] AL INTERVALO [-1,1]
  209.  
  210. EN ESTE CASO LA INTEGRAL ES EN 2 DIMENSIONES Y POR TANTO LA FUNCIÓN A INTEGRAR DEPENDE
  211. DE 2 VARIABLES Y HAY QUE AJUSTAR LA INTEGRAL TAL Y COMO SE EXPLICÓ EN CLASE. EL Nº DE
  212. PUNTOS DE CUADRATURA A UTILIZAR ES EL MISMO EN LA VARIABLE x E y Y VIENE DADO EL PARÁMETRO
  213. DE ENTRADA N
  214. ************************************************************/
  215.  
  216. real mn_cuadratura(
  217. real (*f)(real x,real y) /* funcion que se integra */,
  218. real a /* extremo izquierdo del intervalo para x*/,
  219. real b /* extremo derecho del invervalo para x*/,
  220. real c /* extremo inferior del intervalo para y*/,
  221. real d /* extremo superior del invervalo para y*/,
  222. Array2D< real > &x, /* matriz con los puntos de la tabla de cuadratura para el intervalo [-1,1]*/
  223. Array2D< real > &w, /* matriz con los pesos de la tabla de cuadratura para el intervalo [-1,1] */
  224. int N) /* Nº de puntos a usar en la fórmula de cuadratura */
  225. {
  226.    // HACER ALUMNO
  227.  
  228.    real suma = 0.; // variable donde guardare el resultado
  229.    real paso = 0.; // variables auxiliares que creo para no tener una linea demasiado larga
  230.    real paso2 = 0.; // a la hora de hacer los calculos
  231.    real imagen = 0.;
  232.     for(int k = 0; k<N; k++){ // bucle de la primera integral
  233.         for(int j = 0; j<N; j++){ //bucle de la segunda integral
  234.             paso = ((b-a)*x[N-1][k]+b+a)/2.; // valor que depende del primer intervalo [a,b]
  235.             paso2 = ((d-c)*x[N-1][j]+d+c)/2.; // valor que depende del segundo intervalo [c,d]
  236.             imagen = (*f)(paso,paso2); // calculo la funcion en esos puntos
  237.             suma += w[N-1][k]*w[N-1][j]*((b-a)/2.)*((d-c)/2.)*imagen; // calculo el sumatorio
  238.         }
  239.    }
  240.    return suma;
  241. }
  242.  
  243. /************************************************************
  244. FUNCION PARA CALCULAR UNA INTEGRAL POR EL METODO DE CUADRATURA DE GAUSS UTILIZANDO
  245. UN VECTOR DE PUNTOS Y PESOS PARA EL INTERVALO [-1,1]
  246.      
  247. NOTA : HAY QUE TENER EN CUENTA EL CAMBIO DE VARIABLE VISTO EN CLASE PARA PASAR UNA
  248. INTEGRAL EN UN INTERVALO [a,b] AL INTERVALO [-1,1]
  249.  
  250. LA FUNCIÓN DEVUELVE EL VALOR DE LA INTEGRAL.
  251. ************************************************************/
  252. real mn_cuadratura(
  253. real (*f)(real x) /* funcion que se integra */,
  254. real a /* extremo izquierdo del intervalo */,
  255. real b /* extremo derecho del invervalo*/,
  256. Array1D< real > &x, /* vector con los puntos de la tabla de cuadratura para el intervalo [-1,1]*/
  257. Array1D< real > &w) /* vector con los pesos de la tabla de cuadratura para el intervalo [-1,1] */
  258.  
  259. {
  260.   //A IMPLEMENTAR POR EL ALUMNO.
  261.   real suma = 0.;
  262.   real imagen = 0.;
  263.   real paso = 0.;
  264.   int N = x.dim();
  265.    
  266.   for (int k = 0; k<N; k++) {
  267.       paso = ((b-a)*x[k]+b+a)/2.;
  268.       imagen = (*f)(paso);
  269.       suma = suma + w[k]*((b-a)/2.)*imagen;
  270.   }
  271.    
  272.   return suma;
  273. }
  274.  
  275.  
  276. //Funcion que realiza la aproximacion de una derivada con 3 ptos
  277. real mn_derivada3(real (*f)(real x),real xr, real xi){
  278.  
  279. real h = xr-xi;
  280. real derivada;
  281.  
  282. derivada =(f(xi+h)-f(xi-h))/2;
  283. return derivada;  
  284.  
  285. }
  286.  
  287. // Funcion que realiza la derivada con 2 ptos.
  288. real mn_deriva2(real (*f)(real x),real xr, real xi){    
  289.  
  290. if (xr == xi) {return -1.;}
  291. real derivada = (f(xr)-f(xi))/(xr-xi);
  292. return derivada;
  293. }
  294.  
  295. //============================================================================================
  296. // FUNCION QUE CALCULA UNA INTEGRAL POR ITERACIONES DEL METODO DE SIMPSON:
  297. //  - SE PARTE DE N=1 INTERVALOS Y SE CALCULA LA INTEGRAL CON LA FUNCION ANTERIOR (mn_simpson)
  298. //  - SE ACTUALIZA N MULTIPLICANDOLO POR 2 Y SE CALCULA DE NUEVO LA INTEGRAL
  299. //  - SE REALIZA ESTE PROCESO HASTA QUE LA DISTANCIA RELATIVA ENTRE LOS 2 VALORES DE LA INTEGRAL
  300. //    SEA MENOR QUE LA TOLERANCIA O SE ALCANCE EL NÚMERO MÁXIMO DE INTERVALOS.
  301. //  - EN Niter SE ALMACENA EL NUMERO DE ITERACIONES QUE SE REALIZAN EN ESTE PROCESO.
  302. //============================================================================================
  303. real mn_simpson(
  304. real (*f)(real x) /* funcion que se integra */,
  305. real a /* extremo izquierdo del intervalo */,
  306. real b /* extremo derecho del invervalo*/,
  307. real TOL /* tolerancia para controlar la convergencia */,
  308. real Imax /* número máximo de intervalos */,
  309. int &Niter /* variable de salida con el numero de iteraciones realizadas */
  310. )
  311. {
  312.   /* A IMPLEMENTAR POR EL ALUMNO */
  313.   //NOTA: CALCULAR EL ERROR CON mn_distancia()
  314.   real integral = 0.;
  315.   real integral1 = 0.;
  316.   Niter=0;
  317.   real x= (b-a)/Imax;
  318.   for (int j=1;j<Imax;j++){
  319.      integral= mn_simpson(f,a,b,j);
  320.      integral1= mn_simpson(f,a,b,(2*j));
  321.      Niter++;
  322.      if (mn_distancia(integral,integral1)<TOL || j==Imax-1){
  323.         break;                                          
  324.      }
  325.   }
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement