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

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

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

;

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 с.