Programa Principal y Rutinas Auxiliares (comprimido)

Programa Principal.

/*
  Programa ejemplo del método de colocación asimétrica, para la
  construcción de un interpolante de la función de prueba u(x,y)=
  (5/4)+cos(5.4y)/6+6(3x-1)^2, utilizando una función radial
  capa delgada r^4 log(r).
  
  Para mayor referencia del algoritmo ver AlgInterpTPS.pdf. 

  Entrada: Número de puntos aleatorios.
  Salida: Valores de la interpolación en los puntos aleatorios. 

   Autor: Daniel A. Cervantes Cabrera. Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.
   Revisión: Pedro Gonzalez Casanova. Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.

*/

#include <stdlib.h>
#include <iostream>
#include "Interpolante.h"
#include "Matrix.h"
#include "GrammMatrix.h"
#include <time.h>
#include <fstream>
#include <math.h>
#include <string>


using namespace Interpolante;

float s(float x, float y)
{
  if (0 <= x &&  x <= 1 && 0 <= y && y <= 1)
    return (5.0/4.0+cos(5.4*y))    / (6 + 6* pow((3*x-1),2));  
  else
    return 0;  
}

float interpolante(float x, float y,
     std::vector<float> xv,std::vector<float> yv,
     std::vector<float> lambda,
     float(*tp)(float,float,float,float))
{
  int N = xv.size();
  float interp = 0.0; 

  for(int i=0; i<N; i++)
    interp += lambda[i]*(*tp)(x,y,xv[i],yv[i]);
    
  interp += lambda[N]*x*x+lambda[N+1]*y*y+
            lambda[N+2]*x*y+lambda[N+3]*x+
            lambda[N+4]*y+lambda[N+5];

  return interp;  
}

int main(int argc, char * argv[]){

  Matrix M;  
  Matrix P; 
  
  std::vector<float> u;
  std::vector<float> mx;
  std::vector<float> my;  
  
  
  if (argc <= 2){
    std::cout << "usar ./main na na.txt nm" << std::endl
       << "na = numero de nodos aleatorios" << std::endl
       << "na.txt = nombre del archivo de salida "<< std::endl
       << "nm = numero de elementos en la malla"// << std::endl 
       << "(por defecto nm = na) "<< std::endl;
       
      exit(1);
  }
 
  //Se lee el numero de puntos aleatorios.
  int N = atoi(argv[1]);  
  string narch = argv[2];
  int Nm; // Numero de elementos en la malla de evaluacion
 

  if(argc == 4)
    Nm = atoi(argv[3]);
  else
    Nm = N;


  //Se establece el tama~o en los vectores de nodos
  x.resize(N);
  y.resize(N);

  // Se establece el tama~o de la matrices.
  M.resize(N,N);
  P.resize(N,6); 

  //Se estable el tama~o de los vectores lambda y u.
  lambda.resize(N+6);
  u.resize(N+6);
  
  //Se generan los nodos aleatorios entre 0 y 1.  
  srand(time(0));  
  for (int i=0; i< N; i++){
    x[i] = 1- float(rand()) / RAND_MAX;
    y[i] = 1- float(rand()) / RAND_MAX;  
  }
  
  
  //Se crea la matriz M   
  for(int i=0; i<N; i++)
    for(int j=0; j<N; j++)
      M(i,j) = TPS(x[i],y[i],x[j],y[j]);
 

  //Se crea la matriz P   
  for(int i=0; i<N; i++){      
    P(i,0) = x[i]*x[i];
    P(i,1) = y[i]*y[i];
    P(i,2) = x[i]*y[i];
    P(i,3) = x[i];
    P(i,4) = y[i];
    P(i,5) = 1.0;      
  }

  //Se crea la matriz de Gramm
  GrammMatrix G(M,P);   

  //  std::cout << G ;
    
  
  //Se calcula el vector de soluciones exactas
  for (int i=0; i< N; i++)
    u[i] = s(x[i],y[i]);
  
  for(int i=0; i<6; i++)
    u[N+i] = 0.0;    
  
 

  //Solucion del sistema  
   lambda = G/u;

   
   float xmi,ymi;
   
   ofstream sal(narch.c_str());
   
   for(int i=0; i <= Nm; i++)
     for(int j=0; j <= Nm; j++){
       ymi = float(i)/Nm;
       xmi = float(j)/Nm;
       sal << xmi <<" "<< ymi <<"  "
   << interpolante(xmi,ymi,x,y,lambda,TPS) 
   << std::endl;       
     }        

   sal.close();

}

Superior

Tenemos 18 visitantes y ningun miembro en Línea