Métodos o Análisis Numérico.

Método numérico: Integral definida. Regla de Simpson 1/3. Newton – Cotes:
C++
//==============================================================
//Método numérico para calcular la integral definida de f(x) dx
//por medio de la regla Simpson 1/3.
//==============================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

double f(double x); //Esta subrutina definirá a la función.

int main(void)
{
 // Se despliega por pantalla la identificación del método:
 cout<<"Se ha omitido intencionalmente la acentuación gramatical."<<endl<<endl;
 cout<<"Metodo numerico para resolver integrales definidas"<<endl;
 cout<<"por la regla trapezoidal."<<endl;
 cout<<"=================================================="<<endl;
 cout<<"Se resuelve Integral de: exp(x)dx en el intervalo:"<<endl;
 

 //Se definen el contador de iteraciones y el número de iteraciones
 // n siempre deberá ser número par.
 int i,n=122;
 
 //Se definen los límites del intervalo:
 double a=0,b=1;

 cout<<"a = "<< a <<", b ="<< b <<", considerando "<< n << " iteraciones."<<endl;
 cout<<"=================================================="<<endl;

 cout<<"Resultado:"<<endl<<endl;

 // Se definen variables requeridas para el cálculo:
 double x,xant,factor,suma=0,h;
 
 h=(b-a)/double(n);

 xant=a;

 for (i=1;i<=n+1;i++)
 { 
  if(i%2==0)
   factor=double(4);
  else
   factor=double(2);

  if(i==1 || i==n+1)
   factor=double(1);

  x = h/double(3) * factor * f(xant);
  suma = suma + x;
  xant+=h;
 }

 //Se produce la salida del resultado por pantalla:
 cout << "Aproximadamente: " << suma << endl<<endl;

 cout<<"Introduzca 0 y Enter para terminar.";
 cin>>i;
 return 0;
}

//------------------------------------------------------
//Se define la función a integrar:
double f(double x)
{
 double fxr=exp(x);
 return(fxr);
}

Método numérico: Integral definida. Regla Trapezoidal. Newton – Cotes:
C++ 
//==============================================================
//Método numérico para calcular la integra definida de f(x) dx
//por medio de la regla trapezoidal.
//==============================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

double f(double x); //Esta subrutina definirá a la función.

int main(void)
{
 // Se despliega por pantalla la identificación del método:
 cout<<"Se ha omitido intencionalmente la acentuación gramatical."<<endl<<endl;
 cout<<"Metodo numerico para resolver integrales definidas"<<endl;
 cout<<"por la regla trapezoidal."<<endl;
 cout<<"=================================================="<<endl;
 cout<<"Se resuelve Integral de: exp(x)dx en el intervalo:"<<endl;
 

 //Se definen el contador de iteraciones y el número de iteraciones:
 double i,n=100;
 int j=0;
 //Se definen los límites del intervalo:
 double a=1.8,b=3.4;

 cout<<"a = "<< a <<", b ="<< b <<", considerando "<< n << " iteraciones."<<endl;
 cout<<"=================================================="<<endl;

 cout<<"Resultado:"<<endl<<endl;

 // Se definen variables requeridas para el cálculo:
 double x,suma=0,h;
 
 h=(b-a)/double(n);

 for (i=1;i<=n;i++)
 {
  x = h/double(2) * ( f(a+(i-double(1))*h) + f(a + double(i)*h));
  suma = suma + x;
 }

 //Se produce la salida del resultado por pantalla:
 cout << "Aproximadamente: " << suma << endl<<endl;

 cout<<"Introduzca 0 y Enter para terminar.";
 cin>>i;
 return 0;
}

//------------------------------------------------------
//Se define la función a integrar:
double f(double x)
{
 double fxr=exp(x);
 return(fxr);
}


Método numérico: Ecuaciones no lineales. Bisecciones consecutivas. Intervalo medio.
C++

//==============================================================
//Método numérico para calcular raíces de ecuaciones no lineales.
//Bisecciones consecutivas. Intervalo medio.
//==============================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>

using namespace std; //Para hacer uso de las funciones estándar del C.

double f(double x); //Esta subrutina definirá a la función.

int main(void)
{
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones no lineales."<<endl;
   cout<<"Bisecciones consecutivas. Intervalo medio."<<endl;
   cout<<"=================================================="<<endl;
   cout<<"Se resuelve f(x)= x3 + x2 - 3x - 3 =0"<<endl;

   //Se definen los valores iniciales:
   double x1=1,x2=2,tol=.005;

   cout<<"Raices x1 = "<< x1 <<", x2 ="<< x2 <<", Tolerancia = "<< tol <<endl;
   cout<<"=================================================="<<endl;

   cout<<"Resultado:"<<endl<<endl;
   //Se definen variables requeridas para el proceso de cálculo:
   double xm, fx1, fxm;
   if(f(x1)*f(x2)>=0)
   {
      cout<<"Los valores de x1="<<x1<<", x2="<<x2<<" no generan";
      cout<<"valores de signo contrario entre f(x1) y f(x2)."; 
   }
   else
   {
      while(abs(x1-x2)>tol)
      {
         xm=(x1+x2)/double(2); //Se obtiene el valor medio.
         if(f(xm)*f(x1)<0) //Comprobar si son de signo contrario.
            x2=xm;        //Se intercambian valores.
         else
            x1=xm;
      }
      //Se produce la salida del resultado por pantalla:
      printf("Raiz aproximada:%10.4f\n\n",xm);
   }
   cout<<"Introduzca 0 y Enter para terminar.";
   cin>>x1;
   return 0;
}

//------------------------------------------------------
//Se define la función a resolver:
double f(double x)
{
   double fxr=pow(x,3)+pow(x,2)-3*x-3;
   return(fxr);
}


Método numérico: Raíces de Ecuaciones no Lineales. Bisecciones consecutivas. Interpolación Lineal Inversa (secante).
C++

//=================================================================
//Método numérico para calcular raíces de ecuaciones no lineales.
//Bisecciones consecutivas. Interpolacíón Lineal Inversa (secante).
//=================================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.
double f(double x); //Esta subrutina definirá a la función.

int main(void)
{
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones no lineales."<<endl;
   cout<<"Bisecciones consecutivas. Interpolacion Lineal (Secante)."<<endl;
   cout<<"=================================================="<<endl;
   cout<<"Se resuelve f(x)= x3 + x2 - 3x - 3 =0"<<endl;
   //Se definen los valores iniciales:
   double x1=1,x2=2, x3, tol=.001, tol2=.001;

   cout<<"Raices x1 = "<< x1 <<", x2 ="<< x2 <<endl;
   cout<<"Tolerancia 1 = "<< tol<<" Tolerancia 2 = "<<tol2<<endl; 
   cout<<"=================================================="<<endl;

   cout<<"Resultado:"<<endl<<endl;
   //Se definen variables requeridas para el proceso de cálculo:
   double divisor,j=0;
   if(f(x1)*f(x2)>=0)
   {
      cout<<"Los valores de x1="<<x1<<", x2="<<x2<<" no generan";
      cout<<"valores de signo contrario entre f(x1) y f(x2)."; 
   }
   else
   {
      divisor=f(x2)-f(x1);
      if(divisor!=0){
         x3=x2-(x2-x1)*f(x2)/divisor;
         while(abs(x3-x1)>tol||abs(f(x3)>tol2))
         {
            divisor=f(x2)-f(x1);
            if(divisor==0)
            {
               x3=0;x1=0;//Para abandonar las repeticiones.
            }
            else
            {
               j++;
               x3=x2-(x2-x1)*f(x2)/divisor;
               x1=x2;
               x2=x3;        //Se intercambian valores.*/
            }
         }
      }
      if(divisor!=0){
         //Se produce la salida del resultado por pantalla:
         printf("Raiz aproximada:%10.5f\n\n",x3);
         printf("Iteraciones:%f\n",j);
      }
      else
         cout<<"Se produjo división por cero."<<endl;
   }
   cout<<"Introduzca 0 y Enter para terminar.";
   cin>>x1;
   return 0;
}

//------------------------------------------------------
//Se define la función a resolver:
double f(double x)
{
   double fxr=pow(x,3)+pow(x,2)-3*x-3;
   return(fxr);
}


Método numérico: Raíces de Ecuaciones no lineales. Bisecciones consecutivas. Newton Raphson (tangente).
C++

//=================================================================
//Método numérico para calcular raíces de ecuaciones no lineales.
//Bisecciones consecutivas. Newton Raphson (tangente).
//=================================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

double f(double x); //Esta subrutina definirá a la función.
double fp(double x);//Esta subrutina definirá su primera derivada 

int main(void)
{
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones no lineales."<<endl;
   cout<<"Aproximaciones sucesivas. Newton Raphson (Tangente)."<<endl;
   cout<<"=================================================="<<endl;
   cout<<"Se resuelve f(x)= x3 + x2 - 3x - 3"<<endl;
   //Se definen los valores iniciales:
   double x1=1,tol=.001, tol2=.001;

   cout<<"Raiz x1 = "<< x1 <<endl;
   cout<<"Tolerancia 1 = "<< tol<<" Tolerancia 2 = "<<tol2<<endl; 
   cout<<"=================================================="<<endl;

   cout<<"Resultado:"<<endl<<endl;
   //Se definen variables requeridas para el proceso de cálculo:
   double j=0,x2=0,x3=0;
   while(abs(x3-x1)>=tol||abs(f(x2)>=tol2))
   {
      j++;
      x2=x1-f(x1)/fp(x1);
      x3=x1;
      x1=x2;
   }
      
   //Se produce la salida del resultado por pantalla:
   printf("Raiz aproximada:%10.5f\n",x1);
   printf("Iteraciones:%f\n\n",j);
      
   cout<<"Introduzca 0 y Enter para terminar.";
   cin>>x1;
   return 0;
}

//------------------------------------------------------
//Se define la función a integrar:
double f(double x)
{
   double fxr=pow(x,3)+ pow(x,2) - 3* x - 3;
   return(fxr);
}
//Primera derivada a la función a integrar:
double fp(double x)
{
   double fxr=3 *pow(x,2) + 2*x - 3;
   return(fxr);
}


Método numérico: Raíces de Ecuaciones Lineales. Eliminación Gaussiana (Método de Gauss).
C++

//=================================================================
//Método numérico para calcular raíces de ecuaciones lineales.
//Eliminacion Gaussiana.
//=================================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

int main(void)
{
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones lineales."<<endl;
   cout<<"Eliminacion Gaussiana."<<endl<<endl;
   cout<<"===============   Se resuelve:    ========================"<<endl;
   cout<<"        2x + 3y - 7z = -1"<<endl;
   cout<<"        3x + 4y - 6z =  5"<<endl;
   cout<<"        5x - 2y + 4z = -7"<<endl;
   //Se definen una variable temporal y una de sumatoria:
   double temp,sum;
   //Se definen los contadores requeridos para las iteraciones:
   int i,j,k,l,m,n;
   //Se indica el número de renglones que tiene la matriz:
   n=3;  //También puede indicarse desde teclado: 
   //Se define el arreglo que contendrá los resultados.
   double result[3];
   int divPorCero=0; //Bandera utilizada para detectar división por cero.
   //Se define la matriz a resolver. También podría leerse desde teclado.
   double x[3][4]={{2,3,-7,-1},
               {3,4,-6,5},
               {5,-2,4,-7}};
   //___________________________________________
   //Inicia el proceso de solución al sistema:
   n=n-1;
   m=n+1;
   for (l = 0; l <= n - 1; l++)
   {
      j = l;
      for (k = l + 1; k <= n; k++)
      {
         if (!(abs(x[j][l]) >= abs(x[k][l]))) j = k;
      }
      if (!(j == l))
      {
         for (i = 0; i <= m; i++)
         {
            temp= x[l][i];
            x[l][i] = x[j][i];
            x[j][i] = temp;
         }
      }
      for (j = l + 1; j <= n; j++)
      {
         temp= (x[j][l] / x[l][l]);
         for (i = 0; i <= m; i++) 
            x[j][i] -= temp* x[l][i];
      }
   }
   result[n] = x[n][m] / x[n][n];
   for (i = 0; i <= n - 1; i++)
   {
      j = n - i - 1;
      sum = 0;
      for (l = 0; l <= i; l++)
      {
         k = j + l + 1;
         sum += x[j][k] * result[k];
      }
      result[j] = ((x[j][m] - sum) / x[j][j]);
   }

   //_________________________________________________
   //Se produce la salida del resultado por pantalla:
   cout<<"\nResultados: ";
   printf("(");
   for(i=0;i<m;i++)
   {
         printf("%+6.2f",result[i]);
         if(i!=m-1) printf(",");             
   }
   printf(")\n");

   cout<<"\nIntroduzca 0 y Enter para terminar.";
   cin>>i;

   return 0;
}


Método numérico: Raíces de Ecuaciones Lineales. Método Numérico de Jacobi.
C++

//======================================================================
//Método numérico de JACOBI para calcular raíces de ecuaciones lineales.
//======================================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

int main()
{ 
   system("cls");
   float ar[10][10], b[10], x[10], temp, xmax, tol=float(0.0005), suma=0;
   int i,j,n,aceptada=1,nItera=10,convergen=0;  //convergen es utiliza como bandera.
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones lineales."<<endl;
   cout<<"Método de Jacobi."<<endl<<endl;
   cout<<"========================================================="<<endl;
   printf("No. de ecuaciones a resolver:");
   scanf("%d",&n);
   printf("\nNo. de iteraciones propuestas:");
   scanf("%d",&nItera);

   printf("\nIntroducir los valores de la matriz:");
     
   for(i=0;i<n;i++)
   {
      for(j=0;j<n+1;j++)
      {
         printf("\nEscriba el elemento (%d,%d):",i,j);
         scanf("%f",&ar[i][j]);
      }
   }

   for(i=0;i<n;i++)
   {
      for(j=0;j<n;j++)
         if(i!=j) suma+=abs(ar[i][j]);
      if(abs(ar[i][i])<suma) aceptada=0;
      suma=0;
   }

   if(aceptada!=1)
   {
      printf("\n\nEl sistema de ecuaciones introducido no puede resolverse ");
      printf("\npor el metodo de Jacobi al carecer de diagonal dominante\n");
   }
   
   if(aceptada==1)
   {
      //Asignar los valores de igualdad al vector b
      for(i=0;i<n;i++) b[i]=ar[i][n];

      for(i=0;i<n;i++) x[i]=0; //Inicializar los valores de xi en cero.

      //Se realizan las iteraciones en busca de la solución:
      for(int iter=1;iter<=nItera;iter++)
      {
         xmax=0;  temp=0;
         for(i=0;i<n;i++)
         {
            suma=0;
            xmax+=x[i];//Valores actuales de x[i]
            for(j=0;j<n;j++)
            {
               if(j!=i) suma+=(ar[i][j]/ar[i][i])*x[j];
            }
            x[i]=b[i]/ar[i][i]-suma;
            temp+=x[i];
         }
         //Resultados de la iteración
         printf("\nIteracion No.:%d",iter);
         for(i=0;i<n;i++)
            printf("\nx[%d] = %9.6f",i,x[i]);
         if(abs(xmax-temp)<=tol) 
            printf("\nConvergencia exitosa tol.: %6.4f\n",tol);
         else
            printf("\n");
      }
   }
   cout<<endl;
   system("pause");
   return 0;
}


Método numérico: Raíces de Ecuaciones Lineales. Método de Gauss - Seidel.
C++

//=================================================================
//Método numérico para calcular raíces de ecuaciones lineales.
//Gauss - Seidel.
//=================================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.

int main()
{ 
   system("cls");
   float ar[10][10], b[10], s=float(0.0), x[10], temp, tol=float(0.0005), xmax;
   int i,j,n,aceptada=1,nItera=10,convergen=0;  //convergen es utiliza como bandera.
   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver ecuaciones lineales."<<endl;
   cout<<"Gauss - Seidel."<<endl<<endl;
   cout<<"========================================================="<<endl;
   printf("No. de ecuaciones a resolver:");
   scanf("%d",&n);
   printf("\nNo. de iteraciones propuestas:");
   scanf("%d",&nItera);

   printf("\nIntroducir los valores de la matriz:");
     
   for(i=0;i<n;i++)
   {
      for(j=0;j<n+1;j++)
      {
         printf("\nEscriba el elemento (%d,%d):",i,j);
         scanf("%f",&ar[i][j]);
      }
   }

   for(i=0;i<n;i++)
   {
      for(j=0;j<n;j++)
      {
         if(i!=j) s+=abs(ar[i][j]);
      }
      if(abs(ar[i][i])<s) aceptada=0;
      s=0;
   }

   if(aceptada!=1)
   {
      printf("\n\nEl sistema de ecuaciones introducido no puede resolverse ");
      printf("\npor el metodo de Gauss Seidel al carecer de diagonal dominante\n");
   }
   
   if(aceptada==1)
   {
      //Asignar los valores de igualdad al vector b
      for(i=0;i<n;i++) b[i]=ar[i][n];

      for(i=0;i<n;i++) x[i]=0; //Inicializar los valores de xi en cero.

      //Hacer que los elementos de la diagonal sean la unidad:
      for(i=0;i<=n-1;i++)
      {
         temp=ar[i][i];
         b[i]=b[i]/temp;
         for(j=0;j<=n-1;j++)
            ar[i][j]=ar[i][j]/temp;
      }
      
      //Se realizan las iteraciones en busca de la solución:
      for(int iter=1;iter<=nItera;iter++)
      {
         xmax=0;
         for(i=0;i<n;i++)
         {
            temp=x[i];
            x[i]=b[i];
            for(j=0;j<n;j++)
            {
               if(j!=i) x[i]=x[i]-ar[i][j]*x[j];
            }
            if(abs(x[i]-temp>xmax)) xmax=abs(x[i]-temp);
         }

         if(xmax<=tol) convergen=1;
         //Resultados de la iteración
         printf("\nIteracion No.:%d",iter);
         for(i=0;i<n;i++)
            printf("\nx[%d] = %f",i,x[i]);
         if(convergen==1) 
            printf("\nConvergencia exitosa con tolerancia de %6.4f",tol);
      }
   }
   cout<<endl;
   system("pause");
   return 0;
}


Método numérico: Solución de Polinomios Interpolantes. Aproximación Polinomial Simple.
C++

//===================================================
//Método numérico de Interpolación Polinomial Simple.
//Polinomial Simple.
//===================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.
void eliGauss(float ar[][10],float result[],int n);
void gotoxy ( int x , int y );

int main()
{ 
   system("cls");

   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver interpolaciones."<<endl;
   cout<<"Polinomial Simple."<<endl<<endl;
   cout<<"========================================================="<<endl;
   float x[10],y[10],b[10][10],a[10];
   int i,j,n,ren,col,valida=0;
   do{
      if(valida!=0)
      {
         gotoxy(1,8);
         printf("Se permite especificar un grado maximo de 8.");
      }
      gotoxy(1,7);printf("Grado del polinomio:          ");
      gotoxy(22,7);scanf("%d",&n);
      valida=1;
   }while(n>8);

   gotoxy(1,8);
   printf("Introduzca los valores para cada punto :        ");
   ren=8;col=1;
   for(i=0;i<=n;i++)
   {
      gotoxy(col,++ren);printf("x(%2d)",i+1);
      gotoxy(col+6,ren);scanf("%f",&x[i]);

      gotoxy(col+16,ren);printf("f(x(%2d))",i+1);
      gotoxy(col+24,ren);scanf("%f",&y[i]);
   }
   // Se obtiene el sistema de ecuaciones lineales:
   for(i=0;i<=n;i++)
   {
      b[i][0]=1;
      for(j=1;j<=n;j++)
      {
         b[i][j]=b[i][j-1]*x[i];
      }
      b[i][n+1]=y[i];
   }
   
   //El conjunto de ecuaciones lineales resultantes es:
   printf("\nEcuaciones lineales resultantes:\n");
   for(i=0;i<=n;i++){
      for(j=0;j<=n+1;j++)
         printf("%6.2f ",b[i][j]);
      printf("\n");
   }
   //Hallar las soluciones para las ecuaciones lineales
   //mediante el método de eliminación de Gauss:
   eliGauss(b,a,n);

   //Generar la salida de los coeficientes del polinomio:
   printf("\nPolinomio de %do. grado generado:\n",n);
   for(i=0;i<=n;i++)
   {
      printf("%+5.2f x%d ",a[i],i);
   }
   printf("\n--------------------------------------------------");
   cout<<endl;

   // Pedir un valor a calcular de f(x)
   float xi,yi=0;
   printf("\nAnote un valor para x que requiera interpolar:");
   scanf("%f",&xi);
   for(i=0;i<=n;i++)
   {
      yi+=a[i]*pow(xi,i);//Evaluando el polinomio.
   }
   printf("\nResultado: f(%6.3f)= %+6.4f",xi,yi);
   printf("\n--------------------------------------------------");

   cout<<endl;
   system("pause");
   return 0;
}

// Esta función se utiliza para colocar el cursor en una posición específica
// sobre la pantalla de la consola de Windows.
void gotoxy ( int x , int y ) 
{ 
   HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 
   COORD coordenadas = { x , y }; 
   SetConsoleCursorPosition(handle, coordenadas); 
}
//Esta función calcula las raíces del sistema de ecuaciones mediante 
//el método de Gauss. 
void eliGauss(float ar[][10],float result[],int n)
{
   int i,j,k,l,m;
   float temp=0, sum=0;

   //n=n-1;
   m=n+1;
   for (l = 0; l <= n - 1; l++)
   {
      j = l;
      for (k = l + 1; k <= n; k++)
      {
         if (!(abs(ar[j][l]) >= abs(ar[k][l]))) j = k;
      }
      if (!(j == l))
      {
         for (i = 0; i <= m; i++)
         {
            temp= ar[l][i];
            ar[l][i] = ar[j][i];
            ar[j][i] = temp;
         }
      }
      for (j = l + 1; j <= n; j++)
      {
         temp= (ar[j][l] / ar[l][l]);
         for (i = 0; i <= m; i++) 
            ar[j][i] -= temp* ar[l][i];
      }
   }
   result[n] = ar[n][m] / ar[n][n];
   for (i = 0; i <= n - 1; i++)
   {
      j = n - i - 1;
      sum = 0;
      for (l = 0; l <= i; l++)
      {
         k = j + l + 1;
         sum += ar[j][k] * result[k];
      }
      result[j] = ((ar[j][m] - sum) / ar[j][j]);
   }
}


Método numérico: Solución de Polinomios Interpolantes. Aproximación Polinomial de Lagrange.
C++

//===================================================
//Método numérico de Interpolación Polinomial.
//Interpolación de Lagrange.
//===================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.
float Lagrange(float x[], float y[], int N, float xint);
void gotoxy ( int x , int y );

int main()
{ 
   system("cls");

   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver interpolaciones."<<endl;
   cout<<"Interpolación de Lagrange."<<endl<<endl;
   cout<<"========================================================="<<endl;
   float x[10],y[10];
   int i,n,valida=0,ren,col;
   do{
      if(valida!=0)
      {
         gotoxy(1,8);
         printf("Se permite especificar un grado maximo de 10.");
      }
      gotoxy(1,7);printf("Numero de puntos:          ");
      gotoxy(22,7);scanf("%d",&n);
      valida=1;
   }while(n>8);

   gotoxy(1,8);
   printf("Introduzca los valores para cada punto :        ");
   ren=8;col=1;
   for(i=0;i<n;i++)
   {
      gotoxy(col,++ren);printf("x(%2d)",i+1);
      gotoxy(col+6,ren);scanf("%f",&x[i]);

      gotoxy(col+16,ren);printf("f(x(%2d))",i+1);
      gotoxy(col+25,ren);scanf("%f",&y[i]);
   }

   // Pedir un valor a calcular de f(x)
   float xi,yi=0;
   printf("\nAnote un valor para x que requiera interpolar:");
   scanf("%f",&xi);
   //Calcular la interpolación:
   yi=Lagrange(x,y,n,xi);

   printf("\nResultado: f(%6.3f)= %+6.4f",xi,yi);
   printf("\n--------------------------------------------------");

   cout<<endl;
   system("pause");
   return 0;
}




void gotoxy ( int x , int y ) 
{ 
   HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 
   COORD coordenadas = { x , y }; 
   SetConsoleCursorPosition(handle, coordenadas); 
}

float Lagrange(float x[], float y[], int N, float xint)
{
   float yout=0,term;
   for(int i=0;i<N;i++)
   {
      term=y[i];
      for(int j=0;j<N;j++)
      {
         if(i!=j) term=term*(xint-x[j])/(x[i]-x[j]);
      }
      yout+=term;
   }
   return(yout);
}


Método numérico: Solución de Polinomios Interpolantes. Aproximación por Mínimos Cuadrados.
C++

//===================================================
//Método numérico de Interpolación .
//Mínimos cuadrados.
//===================================================

#include <iostream>
#include <cmath>
#include<windows.h>
#include <stdlib.h>
using namespace std; //Para hacer uso de las funciones estándar del C.
float MinimosCuadrados(float x[], float y[], int N, float xint);
void gotoxy ( int x , int y );

int main()
{ 
   system("cls");

   // Se despliega por pantalla la identificación del método:
   cout<<"Se han omitido intencionalmente los acentos gramaticales."<<endl<<endl;
   cout<<"Metodo numerico para resolver interpolaciones."<<endl;
   cout<<"Mínimos cuadrados."<<endl<<endl;
   cout<<"========================================================="<<endl;
   float x[10],y[10];
   int i,n,valida=0,ren,col;
   do{
      if(valida!=0)
      {
         gotoxy(1,8);
         printf("Se permite especificar un grado maximo de 10.");
      }
      gotoxy(1,7);printf("Numero de puntos:          ");
      gotoxy(22,7);scanf("%d",&n);
      valida=1;
   }while(n>8);

   gotoxy(1,8);
   printf("Introduzca los valores para cada punto :        ");
   ren=8;col=1;
   for(i=0;i<n;i++)
   {
      gotoxy(col,++ren);printf("x(%2d)",i+1);
      gotoxy(col+6,ren);scanf_s("%f",&x[i]);

      gotoxy(col+16,ren);printf("f(x(%2d))",i+1);
      gotoxy(col+25,ren);scanf_s("%f",&y[i]);
   }

   // Pedir un valor a calcular de f(x)
   float xi,yi=0;
   printf("\nAnote un valor para x que requiera interpolar:");
   scanf_s("%f",&xi);
   //Calcular la interpolación:
   yi=MinimosCuadrados(x,y,n,xi);

   printf("\nResultado: f(%6.3f)= %+6.4f",xi,yi);
   printf("\n--------------------------------------------------");

   cout<<endl;
   system("pause");
   return 0;
}
void gotoxy ( int x , int y ) 
{ 
   HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 
   COORD coordenadas = { x , y }; 
   SetConsoleCursorPosition(handle, coordenadas); 
}

float MinimosCuadrados(float x[], float y[], int N, float xint)
{
   float yint=0,sxi=0,syi=0,sx2=0,sy2=0,sxy=0,xm,ym,a1,a0;
   int i;
   for(i=0;i<N;i++)
   {
      sxi+=x[i]; syi+=y[i];
      sx2+=pow(x[i],2);  sy2+=pow(y[i],2);
      sxy+=x[i]*y[i];
   }
   xm=sxi/N;
   ym=syi/N;
   a1=(N*sxy-sxi*syi)/(N*sx2-pow(sxi,2));
   a0=ym-a1*xm;
   yint=a0+a1*xint;
   return(yint);
}

No hay comentarios.:

Publicar un comentario