
Untitled
By: a guest on
Jun 9th, 2012 | syntax:
C++ | size: 1.29 KB | hits: 24 | expires: Never
#include<iostream>
#include<cmath>
#define n 9
#define M 2000
#define PI 3.14
/*
Rozwiązać równanie przewodnictwa cieplnego
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>
Uzyc metody jawnej opartej o metode roznic skonczonych
*/
double g(double);
double dokladne(double,double);
int main(){
int a=0; // poczatkowy
int b=0; // poczatkowy
double h=0.1;
double k=0.001;
double t,s;
s=k/h*h;
double W[n+2]={0};
double U[n+2]={0};
double rozwiazanie[n+2]={0};
for(int i=0;i<=n+1;i++)
W[i]=g(i*h);
t=0;
for(int j=1;j<=M;j++){
t=j*k;
// wyznaczanie punktów brzegowych
U[0]=a;
U[n+1]=b;
for(int i=1;i<=n;i++)
U[i]=s*W[i-1]+(1-2*s)*W[i]+s*W[i+1];
for(int i=0;i<=n+1;i++)
W[i]=U[i];
}
t=2.;
for(int i=0;i<=n+1;i++)
rozwiazanie[i]=dokladne(i*h,t);
for(int pom=0;pom<n+2;pom++)
printf("U[%d]=%f a powinno byc %e\n",pom,U[pom],rozwiazanie[pom]);
system("pause");
}
double g(double x){
return sin(x*PI);
}
double dokladne(double x, double t){
double odp;
double potega=PI*PI;
potega*=-1;
potega*=t;
odp=exp(potega);
odp*=sin(PI*x);
return odp;
}