przewodzenie ciepła w płyctce 2d
Ostatnio zmodyfikowano 2016-07-28 20:58
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. #include <iostream> #include<string> #include<vector> #include<ctime> #include<cstdlib> #include<fstream> using namespace std;
const int wymiar = 560; const int ileRazy = 50;
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; double suma; double ** tab2 = new double *[ wymiar ]; for( int i = 0; i < wymiar; ++i ) { tab2[ i ] = new double[ wymiar ]; for( int j = 0; j < wymiar; ++j ) { tab2[ i ][ j ] = 0; } } for( int i = 0; i < wymiar; ++i, cout << endl ) { tab2[ i ][ wymiar - 1 ] = 100; } double ** ntab = new double *[ wymiar ]; for( int i = 0; i < wymiar; ++i ) { ntab[ i ] = new double[ wymiar ]; for( int j = 0; j < wymiar; ++j ) ntab[ i ][ j ] = 0; } double aaa = ileRazy; double srednia; for( int q = 1; q < wymiar - 1; q++ ) { for( int c = 1; c < wymiar - 1; c++ ) { for( int i = ileRazy; i > 0; i-- ) { punkt2D punkt( c, q ); 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 ]; } ntab[ c ][ q ] =( suma / aaa ); suma = 0; cout << "czas wykonania: " << clock() - start << " msek" << endl; } } cout << "czas wykonania: " << clock() - start << " msek"; fstream zapis; zapis.open( "wynik_montecarlo1.txt", ios::out ); zapis << " czas obliczen: " <<( clock() - start ) / 60000 << endl; zapis.close(); for( int i( 0 ); i < wymiar; ++i ) delete[] tab2[ i ]; delete[] tab2; tab2 = NULL; for( int i( 0 ); i < wymiar; ++i ) delete[] ntab[ i ]; delete[] ntab; tab2 = NULL; return 0; } / cpp ]
|
|
Monika90 |
» 2016-07-28 18:48:30 Prawdopodobnie punkt nigdy nie dojdzie do krawędzi płytki, bo się kreci w kółko. to z losowością nie ma nic wspólnego... |
|
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ć :/ |
|
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. |
|
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. |
|
« 1 » |