Kashub's Code Barn - "aaa"

podświetlone jako cpp (dodał(a) aaa @ 2009-01-27 13:10:44)

Twoja wyszukiwarka
Podświetl ten kod w:
Ostatnio dodane:
Losowe wpisy:
#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");
}
 
 
| Wózki dla dzieci | | Sklep z oponami | | Opony specjalne | | karma dla psa - sklep | | Programista Trójmiasto | | Skracacz linków | | Blogi za darmo | | Gdzie przenieść blog za darmo? | | Wklejacz kodów |