Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Za duża macierz ?

Ostatnio zmodyfikowano 2015-04-28 20:59
Autor Wiadomość
blazej6
Temat założony przez niniejszego użytkownika
Za duża macierz ?
» 2015-04-27 22:58:12
Witam, uzywam kompilatora Visual studio 2010

C/C++
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
    //**** Stale ****
    double lambda = 0.75;
    double c = 3000000;
    double cb = 3996200;
    double Gb = 0.00125;
    double Tb = 37;
    double k = 4995.25;
    double Qmet = 245;
    double L = 0.035;
    const int n = 100;
    const int m = 750;
    double Qw;
    double WS;
    double a, h;
    double tw, tz;
    double qw, qz;
    Qw = k * Tb + Qmet;
    a = lambda / c;
    h = L / n;
    //**** Obliczenie delta t z warunku stabilnosci ****
    long double delT_ = 0.01;
    long double delT;
    delT =( h * h ) /( 2 * a ); // przyjeta wartosc musi byc mniejsza od tej wartosci; jest zdeklarowana powyzej
    cout << "Obliczona delta t wynosi: " << delT << endl;
    if( delT_ <= delT )
    {
        cout << "Warunek stabilnosci zostal spelniony dla " << n << " wezlow " << endl;
        cout << endl;
        cout << endl;
        cout << "Podaj temperature wewnetrzna Tw " << endl;
        cin >> tw;
        cout << "Podaj temperature zewnetrzna Tz " << endl;
        cin >> tz;
        //**** Gestosc zrodla ciepla ****
        long double Q[ n ][ m ];
        int i, f;
        Q[ 0 ][ 0 ] = 0; // ciepło wewnętrz
        Q[ n - 1 ][ 0 ] =( 500 * h ) / lambda; // ciepło zewnętrzne
       
        for( i = 0; i <= n - 2; i++ ) // dla zerowej chwili w kazdym wezle Q=0
             Q[ i ][ 0 ] = 0;
       
        for( f = 1; f <= m - 1; f++ )
        {
            Q[ 0 ][ f ] = 0; // temperatura wewnętrz
            Q[ n - 1 ][ f ] =( Qw * delT ) / c;
            for( i = 1; i <= n - 1; i++ )
            {
                Q[ 0 ][ f ] = 0;
                Q[ n - 1 ][ f ] =( 500 * h ) / lambda;
                Q[ i ][ f ] =( Qw * delT ) / c;
            }
        }
        //**** Rozkład temperatur ****
        long double const1 = 1 -(( 2 * a * delT ) /( h * h ) ) -(( k * delT ) / c );
        long double const2 =( a * delT ) /( h * h );
        long double T[ n ][ m ];
        int I, F; // z capslockiem zeby sie odroznialy od licznikow dla ciepla
       
        T[ 0 ][ 0 ] = tw; // temperatura wewnętrz
        T[ n - 1 ][ 0 ] = tz; // temperatura zewnętrzna + ciepło Q
        for( I = 0; I < n - 1; I++ ) // warunek poczatkowy - w kazdym wezle poza brzegowymi (I) dla zerowej chwili czasu (F=0) -> T=36,6
        {
            T[ I ][ 0 ] = 36.6; //temp wewnątrz tkanki
        }
        for( F = 1; F <= m - 1; F++ )
        {
            T[ 0 ][ F ] = tw;
            T[ I ][ 0 ] = 36.6;
            T[ n - 1 ][ F ] = tz + Q[ n - 1 ][ 0 ];
            for( I = 1; I <= n - 2; I++ )
            {
               
                T[ I ][ F ] =( T[ I ][ F - 1 ] * const1 ) +( T[ I - 1 ][ F - 1 ] * const2 ) +( T[ I + 1 ][ F - 1 ] * const2 ) + Q[ I ][ F - 1 ];
               
            }
           
        }
       
        //for( F = 0; F <= m-1; F++ )
        //{
        //cout<<"Rozklad temperatur w "<<F<<""" chwili czasu "<<endl;
        // for(I=0; I<=n-1; I++)
        // {
        // cout<<T[I][F]<<endl;
        // }
       
        //}
       
        //**** Zapisywanie temperatury wg Fouriera do pliku ****
        fstream plik1;
        plik1.setf( ios::fixed, ios::floatfield ); // ustawienie liczby miejsc po przecinku
        plik1.precision( 3 );
        plik1.open( "temperatura.txt", ios::trunc | ios::out );
        if( plik1.good() == true )
        {
            cout << "Uzyskano dostep do pliku 'Temperatura'." << endl;
            plik1 << "Temperatura w danym wezle i danej chwili czasu w [C]:" << endl << endl;
            for( F = 0; F <= m - 1; F++ )
            // wyswietlanie temperatury dla Fouriera w postaci quasi-tabelarycznej // dla ..... wezlow
            {
                plik1 << "F=" << F << endl;
                for( I = 0; I <= n - 1; I++ )
                {
                    // plik1 << "[" << I << "][" << F << "] = ";
                    plik1 << T[ I ][ F ] << endl;
                }
                plik1 << endl;
            }
        }
        else cout << "Dostep do pliku zostal zabroniony!" << endl;
       
    }
    else
         cout << "Warunek stabilnosci nie jest spelniony\n";
   
    system( "pause" );
    return 0;
}

i przy wpisaniu np m=750 program sie sypie. Co może być powodem, jak sobie poradzić ?
P-131528
Quirinnos
» 2015-04-28 00:15:55
Stos się przeładował. Alokuj tę pamięć dynamicznie.
P-131530
DejaVu
» 2015-04-28 01:05:06
Stos się przeładował.
Uściślając terminologię: nastąpiło przepełnienie stosu (a nie jego przeładowanie). No ale przyczyna została właściwie wskazana jak i sposób rozwiązania problemu ;)
P-131534
blazej6
Temat założony przez niniejszego użytkownika
» 2015-04-28 08:40:38
a macie jakiś szybki sposób na to ? z dynamicznymi nigdy mi nie szło ;/
P-131537
maly
» 2015-04-28 08:58:23
C/C++
//long double Q[ n ][ m ];
std::vector < std::vector < long double > > Q( n, m );
P-131538
blazej6
Temat założony przez niniejszego użytkownika
» 2015-04-28 09:07:03
wrzuciłem to zamiast tego co zahashowałes ale nie hula to ;/
P-131539
maly
» 2015-04-28 09:16:03
ale nie hula to ;/
Bo to nie hulahop żeby hulało:)

Więc jaki konkretnie problem?
P-131540
blazej6
Temat założony przez niniejszego użytkownika
» 2015-04-28 09:20:09
rozumiem zę to  ->long double Q[ n ][ m ]; mam zamienić na to->   std::vector < std::vector < long double > > Q( n, m );   i tylko tyle ? Jeśli tak vector jest niezdefiniowany i "is not a member std"
P-131543
« 1 » 2
  Strona 1 z 2 Następna strona