Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 9th, 2012  |  syntax: C++  |  size: 1.29 KB  |  hits: 24  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include<iostream>
  2. #include<cmath>
  3. #define n 9
  4. #define M 2000
  5. #define PI 3.14
  6. /*
  7. Rozwiązać równanie przewodnictwa cieplnego
  8. Uxx=Ut, U(x,0) = sin(pi x), U(0,t)=u(1,t)=0 dla x nalezy do <0,1>, t nalezy do <0,2>
  9. Uzyc metody jawnej opartej o metode roznic skonczonych
  10. */
  11.  
  12. double g(double);
  13. double dokladne(double,double);
  14.  
  15.  
  16. int main(){
  17.  
  18.     int a=0; // poczatkowy
  19.     int b=0; // poczatkowy
  20.  
  21.     double h=0.1;
  22.     double k=0.001;
  23.     double t,s;
  24.     s=k/h*h;
  25.  
  26.  
  27.     double W[n+2]={0};
  28.     double U[n+2]={0};
  29.     double rozwiazanie[n+2]={0};
  30.  
  31.     for(int i=0;i<=n+1;i++)
  32.     W[i]=g(i*h);
  33.     t=0;
  34.    
  35.     for(int j=1;j<=M;j++){
  36.     t=j*k;
  37.     // wyznaczanie punktów brzegowych
  38.  
  39.     U[0]=a;
  40.     U[n+1]=b;
  41.    
  42.     for(int i=1;i<=n;i++)
  43.         U[i]=s*W[i-1]+(1-2*s)*W[i]+s*W[i+1];
  44.  
  45.     for(int i=0;i<=n+1;i++)
  46.         W[i]=U[i];
  47.  
  48.    
  49.     }
  50.     t=2.;
  51.     for(int i=0;i<=n+1;i++)
  52.         rozwiazanie[i]=dokladne(i*h,t);
  53.  
  54.     for(int pom=0;pom<n+2;pom++)
  55.         printf("U[%d]=%f a powinno byc %e\n",pom,U[pom],rozwiazanie[pom]);
  56.  
  57.  
  58.  
  59.     system("pause");
  60. }
  61.  
  62. double g(double x){
  63.  
  64. return sin(x*PI);
  65. }
  66.  
  67. double dokladne(double x, double t){
  68.  
  69. double odp;
  70. double potega=PI*PI;
  71. potega*=-1;
  72. potega*=t;
  73.  
  74. odp=exp(potega);
  75. odp*=sin(PI*x);
  76.  
  77. return odp;
  78.  
  79. }