Mamrot Temat założony przez niniejszego użytkownika |
Kolejne uruchomienia - różne wyniki » 2015-11-30 23:59:05 Napisałem ongiś program liczący charakterystyki profilu. Napisany był niezgrabnie i paskudnie - ale działał dobrze. Ostatnio przepisałem go w "ładniejszej" wersji używając IDE Geany. I ku mojemu zaskoczeniu - wraz z kolejnymi uruchomieniami na tych samych danych wejściowych program daje nieomal losowo całkowicie różne wyniki. Poniżej kod programu: PLIK Z FUNKCJĄ MAIN() #include <iostream> #include <fstream> #include <iomanip> #include <string> #include"klasapanel.h" using namespace std; int main() { ifstream plik1; ofstream plik2; string odplik; string doplik; cout << "Podaj oznaczenie profilu\n"; getline( cin, odplik ); doplik = odplik + ".wir"; odplik = odplik + ".stk"; plik1.open( odplik.c_str() ); int ILE; plik1 >> ILE; float x1, x2, y1, y2; LinWir PWir[ ILE ]; for( int i = 0; i < ILE; i++ ) { plik1 >> x1 >> y1 >> x2 >> y2; PWir[ i ].PUNKTY( x1, y1, x2, y2 ); cout << fixed << "\nPanel " << i << "\tx1= " << x1 << "\ty1= " << y1 << "\tx2= " << x2 << "\ty2= " << y2 << "\tl= " << PWir[ i ].L(); } plik1.close(); float alfa; float u, ux, uy; u = 10; cout << endl << "Podaj geometryczny kąt natarcia[deg]" << endl; cin >> alfa; alfa *= pi() / 360; ux = u * cos( alfa ); uy = u * sin( alfa ); float ** A; A = new float *[ ILE + 1 ]; for( int i = 0; i < ILE + 1; i++ ) { A[ i ] = new float[ ILE + 1 ]; } for( int i = 0; i < ILE; i++ ) { for( int j = 0; j < ILE; j++ ) { A[ i ][ j ] = PWir[ j ].CALPAN( PWir[ i ].XC(), PWir[ i ].YC() ); } } for( int i = 0; i < ILE; i++ ) { A[ i ][ ILE ] = - 1; A[ ILE ][ i ] = 0; } A[ ILE ][ 0 ] = 1, A[ ILE ][ ILE - 1 ] = 1; float X[ ILE + 1 ], Y[ ILE + 1 ]; for( int i = 0; i < ILE; i++ ) { Y[ i ] = - uy * PWir[ i ].XC() + ux * PWir[ i ].YC(); } GAUSS( ILE + 1, A, X, Y ); for( int i = 0; i < ILE; i++ ) { plik2 << X[ i ] << " "; } x1 = 0; for( int i = 0; i < ILE; i++ ) { PWir[ i ].gamma( X[ i ] ); x1 = x1 + PWir[ i ].CYR(); } cout << "\nWspółczynnik siły nośnej to " << 2 * x1 /( u * PWir[ 0 ].XC() ); for( int i = 0; i < ILE + 1; i++ ) delete[] A[ i ]; { delete[] A; } return 0; }
PLIKZ KLASĄ PANEL #include"MAT" #include<iostream> using namespace std;
class LinWir { public: LinWir(); LinWir( float x1, float y1, float x2, float y2 ); LinWir( float x1, float y1, float x2, float y2, float cyr ); void PUNKTY( float x1, float y1, float x2, float y2 ); void gamma( float cyr ) { g = cyr; G = l * cyr; } float CALPAN( float xr, float yr ); float XC() { return xc; } float YC() { return yc; } float cyr() { return g; } float L() { return l; } float CYR() { return G; } private: float xp, yp, xc, yc, xk, yk; float l; float g; float G; };
LinWir::LinWir() { }
LinWir::LinWir( float x1, float y1, float x2, float y2 ) { xp = x1; xk = x2; yp = y1; yk = y2; xc = 0.5 *( xp + xk ); yc = 0.5 *( yp + yk ); l = pow( pow(( xk - xp ), 2 ) + pow(( yk - yp ), 2 ), 0.5 ); }
LinWir::LinWir( float x1, float y1, float x2, float y2, float cyr ) { xp = x1; xk = x2; yp = y1; yk = y2; xc = 0.5 *( xp + xk ); yc = 0.5 *( yp + yk ); l = pow( pow(( xk - xp ), 2 ) + pow(( yk - yp ), 2 ), 0.5 ); g = cyr; G = g * l; }
void LinWir::PUNKTY( float x1, float y1, float x2, float y2 ) { xp = x1; xk = x2; yp = y1; yk = y2; xc = 0.5 *( xp + xk ); yc = 0.5 *( yp + yk ); l = pow( pow(( xk - xp ), 2 ) + pow(( yk - yp ), 2 ), 0.5 ); }
float LinWir::CALPAN( float xr, float yr ) { int dok = 11; float xa[ dok + 1 ], ya[ dok + 1 ], F[ dok + 1 ], dx2, dy2; float sinfi =( yk - yp ) / l; float cosfi =( xk - xp ) / l; float lx[ dok + 1 ]; for( int i = 0; i < dok + 1; i++ ) { lx[ i ] = i * l /( dok ); xa[ i ] = xp + cosfi * lx[ i ]; ya[ i ] = yp + sinfi * lx[ i ]; dx2 = pow( xr - xa[ i ], 2 ); dy2 = pow( yr - ya[ i ], 2 ); F[ i ] = log( pow( dx2 + dy2, 0.5 ) ); } return - CALKA( dok + 1, lx, F ) /( 2 * pi() ); }
Występujące w tych plikach funkcje CALKA i GAUSS pochodzą z poliku MAT.h - służą odpowiednio do liczenia wartości całki ze zbioru punktów i do rozwiązywaniu układu równań liniowych metodą eliminacji Gaussa (sprawdziłem je już wielokrotnie - dają powtarzalne, prawidłowe wyniki)[/i] |