Решение задачи Неймана для уравнения Пуассона в прямоугольной области
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
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