Решение задачи Неймана для уравнения Пуассона в прямоугольной области
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
;
res_S[i][j]=0;
res_A[i][j]=0;
z[i][j]=0;
}
}
//инициализация переменных конец
//создание маски квадратной области с вырезом и условием Дирихле на границах начало
int iStep, jStep;
iStep=n/2;
jStep=n/2;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if((i>iStep) || ((ijStep)))
{
mask[i][j]=ActualPoint;
}
if (i==0) mask[i][j]=FictivePoint;//левая граница
if (i==n) mask[i][j]=FictivePoint;//правая граница
if (j==0) mask[i][j]=FictivePoint;//нижняя граница
if (j==n) mask[i][j]=FictivePoint;//верхняя граница
}
}
//создание маски квадратной области с вырезом и условием Дирихле на границах конец
//вывод маски начало
fprintf(file,"МАСКА ОБЛАСТИ!\n");
for(int j=n; j>=0; j--)
{
for(int i=0; i<=n; i++)
{
fprintf(file,"%d ",mask[i][j]);
}
fprintf(file,"\n");
}
//вывод маски конец
//вычисление u_accur, f в зависимости от маски начало
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if (mask[i][j]==ActualPoint)
{
u_accur[i][j]=sin(M_PI*i*h)*sin(M_PI*j*h);
f[i][j] = -( -2*M_PI*M_PI*sin(M_PI*i*h)*sin(M_PI*j*h) );
}
if (mask[i][j]==TopPoint)
{
u_accur[i][j] = sin(M_PI*i*h)*sin(M_PI*j*h);
f[i][j]=-(M_PI*sin(M_PI*i*h)*cos(M_PI*j*h)/h);
}
if (mask[i][j]==RightPoint)
{
u_accur[i][j] = sin(M_PI*i*h)*sin(M_PI*j*h);
f[i][j]=-(M_PI*cos(M_PI*i*h)*sin(M_PI*j*h)/h);
}
if (mask[i][j]==BottomPoint)
{
u_accur[i][j] = sin(M_PI*i*h)*sin(M_PI*j*h);
f[i][j]=(M_PI*sin(M_PI*i*h)*cos(M_PI*j*h)/h);
}
if (mask[i][j]==LeftPoint)
{
u_accur[i][j] = sin(M_PI*i*h)*sin(M_PI*j*h);
f[i][j]=(M_PI*cos(M_PI*i*h)*sin(M_PI*j*h)/h);
}
if (mask[i][j]==LeftBottomPoint)
{
u_accur[i][j] = sin(M_PI*i*h)*sin(M_PI*j*h);[i][j]=((M_PI*cos(M_PI*i*h)*sin(M_PI*j*h)/h)+(M_PI*cos(M_PI*j*h)*sin(M_PI*i*h)/h));
}
}
}
//вычисление u_accur, f в зависимости от маски конец
int matrixSize=0;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if(mask[i][j]!=FictivePoint)
{
matrixSize++;
}
}
}
z_1d=new double *[matrixSize];
for(int i=0; i<=matrixSize; i++)
{
z_1d[i]=new double[matrixSize];
}
//Проверка сопряженности - начало
int p=0,k=0;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if(i>0)
{
z[i-1][n]=0;
z[i-1][n-1]=0;
z[2][1]=0;
z[2][2]=0;
}
if(mask[i][j]!=FictivePoint)
{
z[i][j-1]=0;
z[i][j]=1;
A(n,mask,z,res_A);
for(int l=0; l<=n; l++)
{
for(int m=0; m<=n; m++)
{
if(mask[l][m]!=FictivePoint)
{
z_1d[p][k]=res_A[l][m];
p++;
}
}
}
k++;
p=0;
}
}
}
f_1d=new double [matrixSize];
p=0;
for(int l=0; l<=n; l++)
{
for(int m=0; m<=n; m++)
{
if(mask[l][m]!=FictivePoint)
{
f_1d[p]=f[l][m];
p++;
}
}
}
print(matrixSize,z_1d,f_1d);
//Проверка сопряженности - конец
//Проверка семетричночти и положительноопределенности оператора начало
Simetric(matrixSize,z_1d);
More_then_0(matrixSize,z_1d);
//Проверка семетричночти и положительноопределенности оператора конец
//приведение к треуг виду с правой частью начало
double d=0;
for(int k=0;k<n-1;k++)
{
for(int i=k+1;i<n;i++)
{
if(z_1d[k][k]==0)
{
SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , 4 ) ;
printf("Произошло деление на 0!\nДля выхода нажмите любую клавишу...\n");
_getch();
exit(0);
}
else
{
d = z_1d[i][k]/z_1d[k][k];
for(int j=0;j<n;j++)
{
z_1d[i][j]=z_1d[i][j]-z_1d[k][j]*d;
}
f_1d[i]=f_1d[i]-f_1d[k]*d;
}
}
}
print(matrixSize,z_1d,f_1d);
//приведение к треуг виду с правой частью конец
do
{
A(n,mask,u,res_A);
Substruction(n,mask,res_A,f,res_S);
A(n,mask,res_S,res_A);
tau=Scalar(n,mask,res_A,res_S)/Scalar(n,mask,res_A,res_A);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(mask[i][j]!=0)
{
u[i][j]=u[i][j]-tau*res_S[i][j];
}
}
}
norm_r=Norm(n,mask,res_S);
count_it++;
}
while(norm_r > eps);
fprintf(file,"Норма = %.40lf \n",norm_r);
fprintf(file,"\n\n");
fprintf(file,"Количество итераций: %d\n",count_it);
//проверка линейности оператора начало
A(n,mask,u,res_A);
copy(n,res_A,A_u);
//print(n,A_u);
A(n,mask,u_accur,res_A);
copy(n,res_A,A_u_accur);
//print(n,A_u_accur);
Substruction(n,mask,A_u,A_u_accur,res_S);
copy(n,res_S,r);
//print(n,res_S);
Substruction(n,mask,u,u_accur,res_S);
A(n,mask,res_S,res_A);
copy(n,res_A,A_u_u_accur);
//print(n,A_u_u_accur);
Substruction(n,mask,A_u_u_accur,r,res_S);
double maxDiff = 0;
for (int i=0;i<=n;i++)
{
for (int j=0;j<=n;j++)
{
if (abs(res_S[i][j])>maxDiff)
{
maxDiff = abs(res_S[i][j]);
}
}
}
fprintf(file,"max(Lin) = %.25f\n",maxDiff);
//проверка линейности оператора конец
fclose(file);
system("pause");
return 0;
}
4. Результаты работы программы
При n=6:
)Внешний текстовый файл out.txt:
МАСКА ОБЛАСТИ!
0 0 0 0 0
1 1 1 1 0
1 1 1 1 0
0 0 1 1 0
0 0 1 1 0
0 0 0 0 0
100 -25 -25 -0 -0 -0 -0 -0 -0 -0 -0 -0 | 11
-25 100 -0 -25 -0 -0 -0 -0 -0 -0 -0 -0 | 7
-25 -0 100 -25 -0 -0 -25 -0 -0 -0 -0 -0 | 18
-0 -25 -25 100 -0 -0 -0 -25 -0 -0 -0 -0 | 11
-0 -0 -0 -0 100 -25 -0 -0 -25 -0 -0 -0 | 11
-0 -0 -0 -0 -25 100 -25 -0 -0 -25 -0 -0 | 18
-0 -0 -25 -0 -0 -25 100 -25 -0 -0 -25 -0 | 18
-0 -0 -0 -25 -0 -0 -25 100 -0 -0 -0 -25 | 11
-0 -0 -0 -0 -25 -0 -0 -0 100 -25 -0 -0 | 7
-0 -0 -0 -0 -0 -25 -0 -0 -25 100 -25 -0 | 11
-0 -0 -0 -0 -0 -0 -25 -0 -0 -25 100 -25 | 11
-0 -0 -0 -0 -0 -0 -0 -25 -0 -0 -25 100 | 7
100 -25 -25 -0 -0 -0 -0 -0 -0 -0 -0 -0 | 11
0 94 -6 -25 0 -0 -0 -0 -0 -0 -0 -0 | 7
0 0 93 -27 0 -0 -25 -0 -0 -0 -0 -0 | 18
0 0 0 86 0 -0 -7 -25 -0 -0 -0 -0 | 11
0 0 0 0 100 -25 -0 -0 -25 -0 -0 -0 | 11
0 0 0 0 0 94 -25 -0 -6 -25 -0 -0 | 18
0 0 -0 0 0 0 86 -27 -2 -7 -25 -0 | 18
0 0 -0 0 0 0 -0 84 -1 -2 -8 -25 | 11
0 0 -0 0 0 0 -0 0 93 -27 -1 -0 | 7
0 0 -0 0 0 0 -0 0 0 85 -27 -1 | 11
0 0 -0 0 0 0 -0 0 0 -0 83 -28 | 11
0 0 -0 0 0 0 -0 0 0 -0 0 83 | 7
Норма = 0.0000000081934754114870509000000000000000
Количество итераций: 65
max(Lin) = 0.0000000000000071054273576
2)Консоль
Литература
1.Демидович Б.П., Марон И.А., Шувалова Э.З. Численные методы анализа. Приближение функций, дифференциальные и интегральные уравнения, М.: Наука, 1967. - 368 с.
.Вержбицкий В.М. Численные методы. Математический анализ и обыкновенные дифференциальные уравнения , М.: Высшая школа, 2001. - 384 с.
3.Бундаев В.В., Дамбаев Ж.Г. Методические указания и контрольные задания по численным методам, Улан-Удэ: РИО ВСГТУ, 2003. - 16 с.