Ecuación cuadrática tipo silla de montar

Jorge Castillo Mateo

/* Este programa realiza lo siguiente:
1. Dados 3 puntos en el espacio (array xyz[]) resuelve la ecuación de una cuádrica tipo silla de montar con los ejes paralelos a los ejes cartesianos. La ecuación es la siguiente:
Z=aX+bY+cXY
y se determinan los parámetros a,b,c (almacenadas en el array a[]) por el método de eliminación de Gauss
2. Se genera una malla o grid de lado 2L y de salto stp con los valores Z(i) en cada nodo.
3. Se transforman los valores Z(i) para que queden acotados entre -9 y 9 con objeto de generar números de una cifra con signo.
4. Se imprimen los valores en filas y columna generando un pseudográfico donde se visualiza la función a modo de curvas de nivel.
ADVERTENCIA: Para la correcta visualización hay que agrandar la ventana lo suficiente para que quepa una línea del grid, si aún así sigue sin visualizarse correctamente, disminuir la dimension.
*/

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>

void gauss (double *a0, double *x, int n);

using namespace std;

main(){
int L,stp=1;

cout << ” ADVERTENCIA: Dependiendo de la capacidad de su ordenador, \n dimensiones superiores a 15 pueden dar problemas y no se \n vera bien la malla \n \n”;
cout << “Intoduzca la dimension de la malla: “;
cin >> L;
cout << endl << endl;

int n = 3;

double xyz[n+1][n+1];
double a[n+1];

/* Puesto que el programa es tan solo recreativo se han limitado las variables a una sola para reducir la introducción de datos */

int s;

cout << “Introduzca un valor del que dependera la malla: “;
cin >> s;

xyz[1][1] = s; xyz[1][2] = 1; xyz[1][0] = -1; xyz[1][3] = xyz[1][1] * xyz[1][2];
xyz[2][1] = 4; xyz[2][2] = 2; xyz[2][0] = 7; xyz[2][3] = xyz[2][1] * xyz[2][2];
xyz[3][1] = -5; xyz[3][2] = 7; xyz[3][0] = 10; xyz[3][3] = xyz[3][1] * xyz[3][2];

gauss(*xyz,a, n);

double x, y, z;

//—————————————————- Calcular max y min
double Zmax, Zmin, Zm;

for (y = -L; y <= L; y=y+stp) {
for (x = -L; x <= L; x=x+stp) {
z = a[1] * x + a[2] * y + a[3] * x * y;
if (x == -L && y == -L){Zmax = z; Zmin = z;}
if (z > Zmax){Zmax = z;}
if (z < Zmin){Zmin = z;}
}
}

if (abs(Zmax) > abs(Zmin)){
Zm = abs(Zmax);}
else {
Zm = abs(Zmin);}

//————————————————– Realizacion de la malla

for (y = -L; y <= L; y=y+stp){
for (x = -L; x <= L; x=x+stp){
z = a[1] * x + a[2] * y + a[3] * x * y;
z = int(z / Zm * 9);
if (z>=0){cout <<“+”;}
cout << z;
}
cout << “\n”;
}

return 0;
}
void gauss (double *a0, double *x, int n){
//Algoritmo de eliminación de Gauss (método exacto)
int i, j, k;
double aux;
double a[n+1][n+1];
for (i=1; i<=n; i++){
for (j=0; j<=n; j++){

k=i*(n+1)+j ;
a[i][j] = a0[k];
}
}

for (j=n; j>=2; j–){
for (k=n; k>=2+(n-j); k–){
aux = a[k][j];
for (i=n; i>=0; i–){

a[k][i] = a[k][i] – a[k – 1][i] * aux / a[k – 1][j];
}
}
}

for (i=1; i<=n; i++){
x[i] = -a[n-i+1][0];
for (j=1; j<=i-1; j++){
x[i] = x[i] – a[n-i+1][j] * x[j];
}

x[i] = x[i] / a[n – i + 1][i];
}

}

Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

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