#include<iostream> #include<math.h> #include <fstream> #include "calerf.h" double D = 1; //wspolczynnik ciepla double t_max = 2; // max t (na osi y) double x_max = 6*sqrt(D*t_max); // max na osi x double lambda = 0.4; //lambda dla metody bezposredniej using namespace std; class metoda { public: double **bezpo, **analit, **blad, *blad_max; metoda (); int ile_x; double h; double dt; int ile_t; void rozw_analityczne (); void klas_met_bezp (); void f_blad (); void zapis_do_pliku_m (char* nazwa, double** macierz); void zapis_do_pliku_w (char* nazwa, double* wektor); }; metoda::metoda () //konstruktor wylicza przedzialy i alokuje pamiec na macierze rozwiazan { ile_x = 40; h = x_max / ile_x; dt = h*h*lambda / D; ile_t = static_cast<int> ( (t_max/dt) + 1 ); bezpo = new double*[ile_t]; for (int i=0;i<ile_t;i++) bezpo[i] = new double[ile_x]; analit = new double*[ile_t]; for (int i=0;i<ile_t;i++) analit[i] = new double[ile_x]; blad = new double*[ile_t]; for (int i=0;i<ile_t;i++) blad[i] = new double[ile_x]; blad_max = new double[ile_t]; } void metoda::rozw_analityczne () { double t = 0,x = 0; for (int j = 0; j < ile_t; j++) { for (int i = 0; i < ile_x ; i++) { analit[j][i] = erfc (x / (2*sqrt(D*t))); //rozwiazanie analityczne x = x+h; } x = 0; t = t+dt; } zapis_do_pliku_m ("rozw_analityczne.txt", analit); } void metoda::klas_met_bezp () { double t = 0,x = 0; for(int j = 0; j<ile_x; j++) //warunek poczatkowy { bezpo[0][j]=0; } for( int i = 0; i < ile_t; i++ ) //warunek brzegowy dla x0 { bezpo[i][0] = 1; } for( int i = 0; i < ile_t; i++ ) //warunek brzegowy dla x ostatniego { bezpo[i][ile_x-1] = 0; } for(int i=1; i<ile_t; i++) { for (int j=1; j<ile_x; j++) { bezpo[i][j] =bezpo[i-1][j] + lambda*(bezpo[i-1][j-1] -2* bezpo[i-1][j] + bezpo[i-1][j+1]); } } zapis_do_pliku_m ("rozw_klasyczna_met_bezposrednia.txt", bezpo); } void metoda::f_blad () { double x = 0,t = 0; for (int j = 0; j < ile_t; j++) { for (int i = 0; i < ile_x ; i++) { blad[j][i]=fabs(analit[j][i] - bezpo[j][i]); if (blad[j][i]>blad_max[j]) blad_max[j] = blad[j][i]; //blad bezwzgledny x=x+h; } t=t+dt; x=0; } zapis_do_pliku_m ("blad_bezwzgledny_dla_KMB.txt", blad); zapis_do_pliku_w ("blad_max_dla_KMB.txt", blad_max); } void metoda::zapis_do_pliku_m (char* nazwa, double** macierz) { ofstream file( nazwa ); double x = 0, t = 0; file<<nazwa<<", h = "<<h<<", dt = "<<dt<<endl<<endl; for (int j = 0; j < ile_t; j++) { file<<"Dla poziomu czasowego = "<<t<<endl<<endl; for (int i = 0; i < ile_x ; i++) { file<<"wartosc przestrzenna: "<<x<<",\t U(x,t) = "<<macierz[j][i]<<endl; x=x+h; } file<<"\n"<<endl; t = t+dt; x = 0; } file.close(); } void metoda::zapis_do_pliku_w (char* nazwa, double* wektor) { ofstream file( nazwa ); double t = 0; file<<nazwa<<", dt = "<<dt<<endl<<endl; for (int j = 0; j < ile_t; j++) { file<<"Dla poziomu czasowego = "<<t<<"\t blad_max = "<<wektor[j]<<endl; t = t+dt; } file.close(); } int main () { metoda nowa; nowa.rozw_analityczne (); nowa.klas_met_bezp (); nowa.f_blad (); cout<<"Program rozwiazuje rownanie rozniczkowe czastkowe opisujace trasport ciepla"<<endl; cout<<"KLASYCZNA METODA BEZPOSREDNIA"<<endl<<endl; cout<<"Wzor rownania: dU(x,t) / dt = D d^2U(x,t) / dx^2"<<endl<<endl; cout<<"Wspolrzedna przestrzenna okreslona na zbiorze: [0; +nieskonczonosci)"<<endl; cout<<"Wspolrzedna czasowa okreslona na zbiorze: [0; t_max]"<<endl; cout<<"Warunek poczatkowy: U(x,0) = 0"<<endl; cout<<"Warunki brzegowe U(0,t) = 1, U(+nieskonczonosci,t) = 0"<<endl<<endl;; cout<<"t_max = 2, D = 1, lambda = 0.4 \nprzedzial nieskonczonosc zastapiony przedzialem >= od 6*sqrt(D*t_max)"<<endl; cout<<"Przedzial ten wynosi: "<<x_max<<endl<<endl; cout<<"Ilosc podzialow na osi x opisujacej przestrzej wybrano: "<<nowa.ile_x<<endl; cout<<"Wyliczony krok na osi przestrzennej h = "<<nowa.h<<endl; cout<<"Krok na osi czasowej wyliczono ze wzoru: lambda = D*dt/h^2 i wyniosl dt = "<<nowa.dt<<endl; cout<<"Ilosc podzialow na osi t opisujacej czas: "<<nowa.ile_t<<endl; cout<<"\n\n\nPoszczegolne wyniki dla kolejnych poziomow czasowych zapisano w plikach oraz blad bezwzgledy"; cout<<" w porownaniu do rozwiazania analitycznego"<<endl; system ("pause"); }