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

przewodzenie ciepła w płyctce 2d

Ostatnio zmodyfikowano 2016-07-28 20:58
Autor Wiadomość
pawellgawell
Temat założony przez niniejszego użytkownika
przewodzenie ciepła w płyctce 2d
» 2016-07-28 18:07:10
Witam, mam pewnien problem. otóż stworzyłem program, który liczy rozkład ciepła w płytce 2d metodą monte carlo. prgram działa poprawnie zwracjąc prawidłowe rezultaty, lecz po przekroczeniu wielkości macierz ponad 560x560 elementów zawiesza się. czy problem może być związany z błędnym alokowaniem tablicy? bo nie potrafię dojść w czym tkwi problem. z góry dziękuję za rady i wskazówki.

C/C++
#include <iostream>
#include<string>
#include<vector>
#include<ctime>
#include<cstdlib>
#include<fstream>
using namespace std;

const int wymiar = 560; // rozmiar tablicy
const int ileRazy = 50; // ilość iteracji

struct punkt2D {
    int x;
    int y;
    punkt2D( int _x, int _y )
        : x( _x )
         , y( _y )
    { }
};

int main() {
    clock_t start = clock();
    srand( time( NULL ) );
    int kier; // kierunek poruszania się
    double suma; //suma do średniej
    ////////////////////////////
    //inicjalizacja  i wypełnienie
    double ** tab2 = new double *[ wymiar ]; //alokacja pamieci
    for( int i = 0; i < wymiar; ++i ) {
        tab2[ i ] = new double[ wymiar ]; //alokacja pamieci
        for( int j = 0; j < wymiar; ++j ) { //wpisanie wartosci do tablicy
            tab2[ i ][ j ] = 0;
        }
    }
    for( int i = 0; i < wymiar; ++i, cout << endl ) {
        tab2[ i ][ wymiar - 1 ] = 100;
    }
   
   
    ////////////////////////////
    // tablica do zapisu wyników
    double ** ntab = new double *[ wymiar ]; //alokacja pamieci
    for( int i = 0; i < wymiar; ++i ) {
        ntab[ i ] = new double[ wymiar ]; //alokacja pamieci
        for( int j = 0; j < wymiar; ++j ) //wpisanie wartosci do tablicy
             ntab[ i ][ j ] = 0;
       
    }
    ///////////////////////////
    //liczenie metodą montecarlo
    double aaa = ileRazy;
    double srednia;
   
    for( int q = 1; q < wymiar - 1; q++ ) { //pętla po wierszach
        for( int c = 1; c < wymiar - 1; c++ ) { //pętla po kolumnach
            for( int i = ileRazy; i > 0; i-- ) { //ilość proóbek
                punkt2D punkt( c, q ); // punkt startowy
                //pętla losująca drogę
                while(( punkt.x > 0 ) &&( punkt.x < wymiar - 1 ) &&( punkt.y > 0 ) &&( punkt.y < wymiar - 1 ) )
                {
                   
                    kier =( rand() % 4 ) + 1;
                    if( kier == 1 ) {
                        punkt.y++;
                    }
                    else if( kier == 2 ) {
                        punkt.y--;
                    }
                    else if( kier == 3 ) {
                        punkt.x++;
                    }
                    else if( kier == 4 ) {
                       
                        punkt.x--;
                    }
                }
                suma += tab2[ punkt.y ][ punkt.x ]; //suma próbek
            }
            ntab[ c ][ q ] =( suma / aaa ); //zapis średniej do talicy
            suma = 0;
            cout << "czas wykonania: " << clock() - start << " msek" << endl; //czyszczenie zmiennej
        }
    }
    /*for(int i=0;i<wymiar;i++){
    for(int j=0;j<wymiar;j++){
    cout <<ntab[i][j]<<" ";
    }
    cout<< endl;
    }*/
    cout << "czas wykonania: " << clock() - start << " msek";
    ///////////////////////////////
    //zapis do pliku
    fstream zapis;
    zapis.open( "wynik_montecarlo1.txt", ios::out );
    /*for(int i=0;i<wymiar;i++){
    for(int j=0;j<wymiar;j++){
    zapis <<ntab[i][j]<<", ";
    }
    zapis << endl;
    }*/
    zapis << " czas obliczen: " <<( clock() - start ) / 60000 << endl;
    zapis.close();
   
    //czyszczenie pamięci
    for( int i( 0 ); i < wymiar; ++i )
         delete[] tab2[ i ]; //uwolnienie pamieci
   
    delete[] tab2; //uwolnienie pamieci
    tab2 = NULL;
   
    for( int i( 0 ); i < wymiar; ++i )
         delete[] ntab[ i ]; //uwolnienie pamieci
   
    delete[] ntab; //uwolnienie pamieci
    tab2 = NULL;
   
   
    return 0;
}
/ cpp ]
P-150339
Monika90
» 2016-07-28 18:48:30
Prawdopodobnie punkt nigdy nie dojdzie do krawędzi płytki, bo się kreci w kółko.

rand() % 4
to z losowością nie ma nic wspólnego...
P-150340
pawellgawell
Temat założony przez niniejszego użytkownika
» 2016-07-28 19:32:06
chciałem funcją rand kreować losowo drogę do brzegu płytki, a jako że jestem laikiem to nie za bardzo wiem jak to zastąpić :/
P-150341
Monika90
» 2016-07-28 20:10:13
Dodaj

#include <random>


Na początku main

    std::mt19937 urbg;
    std::uniform_int_distribution<> distribution(0, 3);


a losowanie w pętli zrób tak

    kier = distribution(urbg) + 1;




Zmienną suma należy wyzerować przed pierwszym użyciem.
P-150343
pawellgawell
Temat założony przez niniejszego użytkownika
» 2016-07-28 20:58:26
dziękuję serdecznie za pomoc. teraz program działa bez zarzutu.
P-150345
« 1 »
  Strona 1 z 1