Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mikem en 19 Mayo 2015, 22:12 pm



Título: Matriz a partir de un sistema de ecuaciones.
Publicado por: mikem en 19 Mayo 2015, 22:12 pm
Hola :).
Necesito sus ayudas para poder armar una matriz a partir de un sistema de ecuaciones, cuyos parámetros son ingresados por el usuario. Sólo preciso la matriz.
El sistema de ecuaciones es el siguiente: https://imageshack.com/i/p5jShAlcj
(http://imagizer.imageshack.us/v2/479x104q90/905/jShAlc.jpg)


Los parámetros ingresados por el usuario son k y W .
Lo que me interesa es obtener ésta matriz:

k1+k2        -k2                 0
-ki             ki+ki+1        -ki+1
                 -kn                     kn


(Para enésimas k ingresadas)
Eme aquí el código construido (desastroso) hasta ahora:
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. const int nb=100;
  5.  
  6. int main()
  7. {
  8.    float D[nb][nb];
  9.    int i,j;
  10.    float m[i][j];
  11.    int nbloques;
  12.    int nresortes;
  13. float w[100];
  14. float k[100];
  15.  
  16.    cout<<"-------------------------------------------\n";
  17.    cout<<"Bienvenido al sistema vertical masa resorte.\n";
  18.    cout<<"Ingrese cantidad de bloques y resortes al sistema:\n"<<endl;
  19.    do{
  20.        cout<<"Cantidad de bloques: ";
  21.        cin>>nbloques;
  22.  
  23.        cout<<"Cantidad de resortes: ";
  24.        cin>>nresortes;
  25.        cout<<endl;
  26.        if((nbloques<nresortes)||(nbloques>nresortes))
  27.         {
  28.  
  29.        cout<<"RECUERDE: el sist. admite igual cantidad de resortes y bloques.\n";
  30.        cout<<endl;
  31.        cout<<"Vuelva a ingresar los par\xa0metros, por favor: \n"<<endl;
  32.            }else
  33.            break;
  34.        }while(1);
  35.       cout<<"Pesos (kg) de cada uno de los bloques:"<<endl;
  36.  
  37.        for(int i=0; i<nbloques; i++)
  38.        { cout<<"Bloque "<<i+1<<": ";
  39.                cin>>w[i];
  40.                cout<<endl;
  41.                }
  42.        for(int i=0; i<nresortes;i++)
  43.                {
  44.                cout<<"Ki del resorte "<<i+1<<": ";
  45.                cin>>k[i];
  46.                cout<<endl;
  47.                }
  48. cout<<"El sistema matricial a resolver:\n"<<endl;
  49.  
  50. //------AQUI COMIENZA EL HORROR
  51.             for (int i=0; i<(nbloques+1); i++)
  52.             for (int j=0; j<(nbloques+1); j++)
  53.              {
  54.             if(i==0 && j==1)
  55.             {
  56.                    m[i][j]=-k[0];
  57.             }
  58.             else if((i==0) && (j==nbloques+1))
  59.             {
  60.                  m[i][j]=0;
  61.              }
  62.              else if((j==0) && (i==nbloques+1))
  63.              {
  64.                   m[i][j]=0;
  65.                   }
  66.              else if(i==j)
  67.              {
  68.                   m[i][j]=k[j+1]+k[i];
  69.                   }
  70.              else
  71.              {
  72.                  m[i][j]=-k[(j+1)-i];
  73.                  }
  74.             }
  75.  
  76.          for (int i=0; i<(nbloques+1); i++)
  77.             for (int j=0; j<(nbloques+1); j++)
  78.             {
  79.                 cout<<m[i][j]<<endl;
  80.                 }    
  81.        system("pause");        
  82. }
  83.  
  84.  


Título: Re: Matriz a partir de un sistema de ecuaciones.
Publicado por: robertofd1995 en 19 Mayo 2015, 23:27 pm
Creo que esto mejor lo solucionabas con recursividad al menos queda mas claro , ademas no si este tipo de ejercicios (matematicos) son habituales para ti , si es asi ,te recomendaria usar matlab o phyton y no c , pero es una opinion personal , el codigo lo he hecho un poco por arriba pero creo que es lo que necesitas.


Código
  1. float m[n][n]; //n numero de elementos
  2.  
  3.  
  4. m[0][0]=k[0]+k[1];
  5. m[0][1]=-k[1];
  6.  
  7. void paso(int n){ //primera llamada con n=1
  8.  
  9. if(n=k[].lenght){ // es el ultimo
  10. m[n][n]=k[n];
  11. m[n][n-1]=-k[n];
  12. }
  13.  
  14. m[n][n-1]=k[n];
  15. m[n][n]=k[n]+k[n+1];
  16. m[n][n+1]=-k[n+1];
  17.  
  18. paso(n+1);
  19.  
  20. }

Espero que te sea de ayuda , si tienes alguna duda o ves que algo esta mal comenta , como te he dicho he hecho el codigo un poco rapido , pero a simple vista creo que es lo que pides.

Un saludo


Título: Re: Matriz a partir de un sistema de ecuaciones.
Publicado por: mikem en 22 Mayo 2015, 22:30 pm
Es aconsejable usar Matlab y listo, pero me solicitaron utilizar C++.
Este sistema de ecuaciones al ser tridiagonal y cumplir ciertas características puede resolverse aplicando el algoritmo de Thomas (como descomposición LU), utilizando vectores.
Sólo precisaba la visualización de la matriz para que el usuario se entere qué matriz ha de resolverse.
Muchas gracias por responder :)