Скачиваний:
37
Добавлен:
02.05.2014
Размер:
351.74 Кб
Скачать

Код программы

#include<iostream.h>

#include<conio.h>

#include<math.h>

#include<fstream.h>

#define N 10

#define x0 0

#define xEnd 1

#define h 0.1

double mx (int n)

{

return (double)(n*h);

}

double ma (int n)

{

return (2.+mx(n)-h/2.)/2.;

}

double mf (int k,int m)

{

double res;

res=(mx(m)-1.)*(-3.*mx(m)/2.-2.*mx(k)*mx(m))+(mx(k)-1.)*(-3.*mx(k)/2.-2.*mx(k)*mx(m))-(1.+mx(k))*(mx(m)-mx(m)*mx(m))*(mx(k)-mx(k)*mx(k));

return res;

}

double mq (int k)

{

return 1.+mx(k);

}

double Lamda (int k,int m,int nu,int k1,int k2,int m1,int m2,int n,double y[][N+1][N+1])

{

double res;

res=(ma(n+1.)*(y[nu][k+k1][m+m1]-y[nu][k][m])-ma(n)*(y[nu][k][m]-y[nu][k+k2][m+m2]))/h/h;

return res;

}

double bA(double t,int n)

{

return ma(n)*t/2./h/h;

}

double bB(double t, int n)

{

return ma(n+1.)*t/2./h/h;

}

double bC(double t,int n)

{

return (1.+bB(t,n)+bA(t,n));

}

double mb(int k,int m, int n, int nu, int k1, int m1, double t, double b[][N+1][N+1])

{

double res;

res=bB(t,n)/(bC(t,n)-bA(t,n)*b[nu][k+k1][m+m1]);

return res;

}

double bF(int k,int m, int nu, int k1, int k2, int m1, int m2, int n, double y[][N+1][N+1],double t)

{

double res;

res=t*(Lamda(k,m,nu-1,k1,k2,m1,m2,n,y)+mf(k,m)+mq(k)*y[nu-1][k][m])/2+y[nu-1][k][m];

return res;

}

double bNU(float t,int k,int m,int nu, int k1, int k2, int m1,int m2, int n1, int n2, double y[][N+1][N+1], double b[][N+1][N+1],double un[][N+1][N+1])

{

double res;

res=(bA(t,n1)*un[nu-1][k+m2][m+k2]+bF(k,m,nu,k1,k2,m1,m2,n2,y,t))/(bC(t,n1)-bA(t,n1)*b[nu-1][k+m2][m+k2]);

return res;

}

void main()

{

clrscr();

int i,j,check,nu,ch;

double e,t,b[2][N+1][N+1], un[2][N+1][N+1], y[4][N+1][N+1];

//nachalnie i kraevie uslovia

for (i=0;i<=N;i++){

for (j=0;j<=N;j++)

{

y[1][i][j]=0;

y[2][i][j]=0;

b[0][i][j]=0;

b[1][i][j]=0;

un[0][i][j]=0;

un[1][i][j]=0;

}

}

check=0;ch=0;e=0.001;t=0;

while (check==0)

{

nu=2;t=t+h/sin(M_PI*h);

for (i=0;i<=N;i++){

for (j=0;j<=N;j++)

{

y[nu-2][i][j]=y[nu][i][j];

}

}

//perviy polushag

nu=1;

//pryamoy hod progonki

for (i=1;i<N;i++){

for (j=1;j<N;j++)

{

b[nu-1][j][i]=mb(j,i,j,0,-1,0,t,b);

un[nu-1][j][i]=bNU(t,j,i,nu,0,0,1,-1,j,i,y,b,un);

}

}

//obratnii hod progonki

for (i=1;i<N;i++){

for (j=N-1;j>0;j--)

{

y[nu][j][i]=b[nu-1][j][i]*y[nu][j+1][i]+un[nu-1][j][i];

}

}

//vtoroy polushag

nu=2;

//pryamoy hod progonki

for (i=1;i<N;i++){

for (j=1;j<N;j++)

{

b[nu-1][i][j]=mb(i,j,i,1,0,-1,t,b);

un[nu-1][i][j]=bNU(t,i,j,nu,1,-1,0,0,j,i,y,b,un);

}

}

//obratnii hod progonki

for (i=1;i<N;i++){

for (j=N-1;j>0;j--)

{

y[nu][i][j]=b[nu-1][i][j]*y[nu][i][j+1]+un[nu-1][i][j];

}

}

//proverka shodimosti reshenia

check=1;

for(i=1;i<N;i++){

for(j=1;j<N;j++)

{

if(fabs(y[nu][i][j]-y[nu-2][i][j])>e){check=0;}

}

}

ch++;

cout<<ch<<" "<<check<<"\n";

}

ofstream fo;

fo.open("double2.txt", ios::out|ios::app);

for(i=0;i<N+1;i++){

for(j=0;j<4;j++)

{

fo << i << " " << j << " " << y[0][i][j] <<" " << y[2][i][j] << " " << mx(i)*(1.-mx(i))*mx(j)*(1.-mx(j)) <<" ";

}

fo<<"\n";

}

fo.close();

fo.open("double3.txt", ios::out|ios::app);

for(i=0;i<N+1;i++){

for(j=4;j<8;j++)

{

fo << i << " " << j << " " << y[0][i][j] <<" " << y[2][i][j] << " " << mx(i)*(1.-mx(i))*mx(j)*(1.-mx(j)) <<" ";

}

fo<<"\n";

}

fo.close();

fo.open("double4.txt", ios::out|ios::app);

for(i=0;i<N+1;i++){

for(j=8;j<N+1;j++)

{

fo << i << " " << j << " " << y[0][i][j] <<" " << y[2][i][j] << " " << mx(i)*(1.-mx(i))*mx(j)*(1.-mx(j)) <<" ";

}

fo<<"\n";

}

fo.close();

}

Соседние файлы в папке Курсовая работа - Задача Дирихле для эллиптического уравнения