Решение задачи Неймана для уравнения Пуассона в прямоугольной области

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

p>#define FictivePoint 0//не расчетная точка

#define ActualPoint 1//расчетная точка

#define TopPoint 2//точка на верхней границе

#define RightPoint 3//точка на правой границе

#define BottomPoint 4//точка на нижней границе

#define LeftPoint 5//точка на левой границе

#define LeftBottomPoint 6//точка на выпуклом угле

//объявление типов точек области конец*file;

//проверка на симетричность началоSimetric(int n,double **M)

{

int k=0;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

if(M[i][j]==M[j][i])

{

k++;

}

}

}

if(k==n*n)

{

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

if(M[i][j]==M[j][i])

{

if(i!=j)

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 2 ) ;

}

if(i==j)

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

cout<<M[i][j]<<" ";

}

}

cout<<endl;

}

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 2 ) ;

cout<<"Матрица симетрична!"<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

 

if(k!=n*n)

{

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

if(M[i][j]==M[j][i])

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

cout<<M[i][j]<<" ";

}

if(M[i][j]!=M[j][i])

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 4 ) ;

cout<<M[i][j]<<" ";

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

}

cout<<endl;

}

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 4 ) ;

cout<<"Матрица не симетрична!"<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

return 0;

}

//проверка на симетричность конец

 

//проверка на знакоопределенность началоMore_then_0(int n,double **M)

{

double d;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 9 ) ;

cout<<"Приводим матрицу к треугольному виду..."<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

for(int k=0;k<n-1;k++)

{

for(int i=k+1;i<n;i++)

{

if(M[k][k]==0)

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 4 ) ;

printf("Произошло деление на 0!\nДля выхода нажмите любую клавишу...\n");

_getch();

exit(0);

}

else

{

d = M[i][k]/M[k][k];

for(int j=0;j<n;j++)

{

M[i][j]=M[i][j]-M[k][j]*d;

}

}

}

}

int z=0,p=0;

double DetM=1;

double *detM;

detM=new double[n];

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 9 ) ;

cout<<"Находим главные миноры..."<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

for(int i=0;i<n;i++)

{

DetM*=M[i][i];

detM[i]=DetM;

printf("минор[%d] = %lf\n",i+1,detM[i]);

}

for(int i=0;i<n;i++)

{

if(detM[i]>0)

{

z++;

}

}

if(z==n)

{

cout<<"Так как все главные миноры имеют положительный знак то: "<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 2 ) ;

cout<<"Матрица положительно определена!"<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

else

{

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 4 ) ;

cout<<"Матрица не знакоопределена!"<<endl;

SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 7 ) ;

}

return 0;

}

//проверка на знакоопределенность конец

//оператор Пуассона началоA(int n,int **mask, double **u, double **res_A)

{

double h=1./n;

for(int i=0; i<=n; i++)

{

for(int j=0; j<=n; j++)

{

if(mask[i][j]==ActualPoint)

{

res_A[i][j]= - ( (u[i+1][j]-2*u[i][j]+u[i-1][j]+u[i][j+1]-2*u[i][j]+u[i][j-1])/(h*h) );

}

 

if(mask[i][j]==RightPoint)

{

res_A[i][j]= (u[i][j]-u[i-1][j])/(h*h);

}

if(mask[i][j]==TopPoint)

{

res_A[i][j]= (u[i][j]-u[i][j-1])/(h*h);

}

 

if(mask[i][j]==BottomPoint)

{

res_A[i][j]= (u[i][j]-u[i][j+1])/(h*h);

}

if(mask[i][j]==LeftPoint)

{

res_A[i][j]= (u[i][j]-u[i+1][j])/(h*h);

}

 

if(mask[i][j]==LeftBottomPoint)

{

res_A[i][j]=-(u[i+1][j]-4*u[i][j]+u[i][j+1])/(h*h);}

}

}

//оператор Пуассона конец

 

//разность векторов началоSubstruction(int n,int **mask,double **a,double **b,double **res_S)

{

for(int i=0; i<=n; i++)

{

for(int j=0; j<=n; j++)

{

if( mask[i][j]!=FictivePoint )

{

res_S[i][j]=a[i][j]-b[i][j];

}

}

}

}

//разность векторов конец

//умножение вектора на скаляр началоScalar(int n, int **mask,double **a, double **b)

{

double tmp=0;

for(int i=0;i<=n;i++)

{

for(int j=0;j<=n;j++)

{

if( mask[i][j]!=FictivePoint )

{

tmp=tmp+a[i][j]*b[i][j];

}

}

}

return tmp;

}

//умножение вектора на скаляр конец

 

//вычисление нормы вектора началоNorm(int n, int **mask, double **a)

{

double tmp=0;

for(int i=0;i<=n;i++)

{

for(int j=0;j<=n;j++)

{

if( mask[i][j]!=FictivePoint )

{

tmp=tmp+a[i][j]*a[i][j];

}

}

}

tmp=sqrt(tmp);

return tmp;

}

//вычисление нормы вектора конец

 

 

//вывод началоprint(int n,double **a, double *f)

{

fprintf(file,"\n");

for(int i=0; i<=n-1; i++)

{

for(int j=0; j<=n-1; j++)

{

fprintf(file,"%5.0lf ",a[i][j]);

}

fprintf(file,"| %5.0lf\n",f[i]);

}

fprintf(file,"\n");

}

//вывод конец

 

 

//копирование вектора в вектор началоcopy(int n, double **a, double **b)

{

for (int i=0;i<=n;i++)

{

for (int j=0;j<=n;j++)

{

b[i][j]=a[i][j];

}

}

return 0;

}

//копирование вектора в вектор конец

main()

{

int n=0,**mask,count_it=0;

double **u,**u_accur,**f,

**res_S,**res_A,

norm_r=0,h,tau,

eps=0.00000001,

**A_u,**A_u_accur,

**A_u_u_accur,**r,

**z,**z_1d,*f_1d;

char fname[]="out.txt";//имя выходного файла

setlocale(LC_CTYPE,"Russian");//ставим русский язык консоли

printf("Введите количество узлов сетки: ");//

scanf_s("%d",&n);//

n--;//

h=1./n;//вычисляем шаг сетки

printf("Вывод данных в файл %s...\n",fname);

file = fopen(fname, "w");

 

//инициализация переменных начало

mask=new int *[n+1];

u=new double *[n+1];

u_accur=new double *[n+1];

f=new double *[n+1];

res_S=new double *[n+1];

res_A=new double *[n+1];

A_u=new double *[n+1];

A_u_accur=new double *[n+1];

A_u_u_accur=new double *[n+1];

r=new double *[n+1];

z=new double *[n+1];

for(int i=0; i<=n; i++)

{

mask[i]=new int [n+1];

u[i]=new double [n+1];

u_accur[i]=new double [n+1];

f[i]=new double [n+1];

res_S[i]=new double [n+1];

res_A[i]=new double [n+1];

A_u[i]=new double [n+1];

A_u_accur[i]=new double [n+1];

A_u_u_accur[i]=new double [n+1];

r[i]=new double [n+1];

z[i]=new double [n+1];

}

for(int i=0; i<=n; i++)

{

for(int j=0; j<=n; j++)

{

mask[i][j]=0;

u[i][j]=0;

u_accur[i][j]=0;

f[i][j]=0