Interpolación lineal en el plano: C/C++

En el artículo anterior:

Interpolación lineal en puntos interiores a un triángulo en el espacio tridimensional: C/C++

se desarrolló una aplicación para interpolar los puntos interiores que subyacen sobre un plano delimitado por un triángulo en el espacio tridimensional. Como una simplificación de ese procedimiento, se adaptó el código para permitir la interpolación en una recta en el plano bidimensional. El objetivo de ésto es que pueda ser usado para la interpolación múltiple y móvil (para diferentes ecuaciones de rectas) en otro programa que así lo requiere (para interpolación de valores medios mensuales de precipitación y ETP a lo largo del año para diferentes años).

La adaptación resultante fue la siguiente:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

double determinante(int n, double **a);

void interpolar(int n, double **a, double A[2], double &D);

int main() {

	system ("clear");

	// Definición de variables y asignación dinámica de memoria	

	int i, j, k, n=2;

	double **a, A[2], D;

	a = new double* [n];

	for(j=0; j<n; j++){

		a[j] = new double [n];

	}	

	// Definicion de la matriz 

	a[0][0] = 1; a[0][1] = 2;
        a[1][0] = 5; a[1][1] = 10;

	interpolar(n, a, A, D);

	delete [] a;

	cout.setf(ios::fixed);

	cout.precision(2);

	cout << "Coordenadas del punto\n\n";

	double X, Y;

	cout << "X = ? ";

	cin >> X;	

	Y = (-D - A[0]*X)/A[1];

	cout << "Y = " << Y << "\n";

	return 0;

}

double determinante(int n, double **a) {

// Algoritmo para la eliminación simple de Gauss

	int i, j, k;

	double **b;

	b = new double* [n];

	for(j=0; j<n; j++){

		b[j] = new double [n];

	}	

	for(i=0; i<n; i++){

		for(j=0; j<n; j++){

			b[i][j] = a[i][j];

		}

	}

	double factor;

	for (k = 0; k < n - 1; k++) {

		for (i = k+1; i < n;  i++) {

			factor = b[i][k]/b[k][k]; 

			for (j = k+1; j < n + 1; j++) {

				b[i][j] = b[i][j] - factor * b[k][j];

			}


		}

	}

// Cálculo del determinante

	double determ = 1.;

	for (i = 0; i < n; i++) {

		determ = determ * b[i][i];

	}

	delete [] b;

	return determ;


}

void interpolar(int n, double **a, double A[2], double &D){
	
	int i, j, k;

	double **b;

	b = new double* [n];

	for(j=0; j<n; j++){

		b[j] = new double [n];

	}	

	for(i=0; i<n; i++){

		for(j=0; j<n; j++){

			b[i][j] = a[i][j];

		}



	}

	D = -determinante(n, a); 


	for (k = 0; k <n; k++){



		for(i=0; i<n; i++){



			for(j=0; j<n; j++){



				if(k == j) b[i][j] = 1;

            

			}



	

		}





		A[k] = determinante(n, b); 



		for(i=0; i<n; i++){



			for(j=0; j<n; j++){



				b[i][j] = a[i][j];

            

			}



		}





	}

	delete [] b;



}

La matriz definida corresponde a dos puntos sobre la recta y = 2x. La salida, probada para múltiples puntos, arrojó los resultados esperados.

Por otra parte, si colocamos la rutina en un programa donde nos interesa la interpolación y generación de puntos adicionales, este fue el resultado:

donde los puntos en verde son los puntos interpolados. El resultado parece satisfactorio.

About these ads
Esta entrada fue publicada en Código C++. Guarda el enlace permanente.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s