отчет6 - line.tom.ru

advertisement
Министерство образования и науки
Государственное образовательное учреждение высшего
профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ
ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики
Кафедра информатики и проектирования систем
Отчет по лабораторной работе №6 по дисциплине
«Методы оптимизации»
Вариант№4
Задача Дирихле
Студент гр 8ВМ14
_____________ Кокойко К.С.
(подпись)
_____________
(дата)
Руководитель
____________ Рейзлин В.И.
(подпись)
_____________
(дата)
Томск – 2011
Цель работы:
Используя метод сеток, составить приближенное решение задачи Дирихле для уравнения
Лапласа
𝜕2 𝑈
𝜕𝑥 2
𝜕2 𝑈
+ 𝜕𝑦 2 = 0 в квадрате ABCD с вершинами A(0;0), B(0;1), C(1;1), D(1;0); шаг
h=0,1.
Решение представить в виде числовой таблицы и графически в виде
поверхности u = U(x,y).
U|AB = 20y,
U|BC = 20,
U|CD = 20y2,
U|AD = 50x(1 - x).
Листинг программы:
#include
#include
#include
#include
<fstream.h>
<iostream.h>
<math.h>
<conio.h>
double Uab(double x, double y)
{
return 20.0 * y;
}
double Ubc(double x, double y)
{
return 20.0;
}
double Ucd(double x, double y)
{
return 20.0 * y * y;
}
double Uad(double x, double y)
{
return 50.0 * x * (1.0 - x);
}
const double h = 0.1;
double U_copy[1 << 10][1 << 10];
double U[1 << 10][1 << 10];
double X[1 << 10], Y[1 << 10];
int n, m;
int main(int argc, char* argv[])
{
n = m = 0;
for (double x = 0.0; x - 1e-7 < 1.0; x += h)
X[n++] = x;
for (double y = 0.0; y - 1e-7 < 1.0; y += h)
Y[m++] = y;
for (int j = 0; j < m; ++j)
U[0][j] = Uab(X[0], Y[j]);
2
for (int i = 0; i < n; ++i)
U[i][m - 1] = Ubc(X[i], Y[m - 1]);
for (int j = 0; j < m; ++j)
U[n - 1][j] = Ucd(X[n - 1], Y[j]);
for (int i = 0; i < n; ++i)
U[i][0] = Uad(X[i], Y[0]);
double l = h;
for (int step = 1; ; ++step)
{
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
U_copy[i][j] = U[i][j];
double Alpha = h * h / l * l;
double mult = 1.0 / (2.0 * (1.0 + Alpha));
for (int i = 1; i + 1 < n; ++i)
for (int j = 1; j + 1 < m; ++j)
{
U[i][j] = mult * (U[i - 1][j] + U[i + 1][j] + Alpha *
(U[i][j - 1] + U[i][j + 1]) - h * h * U_copy[i][j]);
}
double maxVal = -1e+300;
for (int i = 1; i < n; ++i)
for (int j = 1; j < m; ++j)
maxVal = max(maxVal, fabs(U[i][j] - U_copy[i][j]));
if (maxVal < 0.00001)
{
cerr << "Number of steps: ";
cerr << step << endl;
break;
}
}
freopen("output.txt", "w", stdout);
cout.precision(3);
for (int j = 0; j < m; ++j)
{
cout.width(12);
cout << fixed << Y[j];
}
cout << endl;
for (int i = 0; i < n; ++i)
{
cout.width(12);
cout << fixed << X[i] << endl;
for (int j = 0; j < m; ++j)
{
cout.width(12);
cout << fixed << U[i][j] ;
}
cout << endl;
}
_getch();
return 0;
}
//---------------------------------------------------------------------------
3
Результаты работы программы:
X/Y
0.000
0.100
0.200
0.300
0.400
0.500
0.600
0.700
0.800
0.900
1.000
0.000
0.000
2.000
4.000
6.000
8.000
10.000
12.000
14.000
16.000
18.000
20.000
0.100
4.500
2.088
3.592
5.402
7.266
9.167
11.101
13.070
15.077
17.167
20.000
0.200
8.000
2.157
3.217
4.857
6.605
8.424
10.313
12.270
14.304
16.498
20.000
0.300
10.500
2.179
2.869
4.359
6.009
7.766
9.627
11.593
13.672
15.980
20.000
0.400
12.000
2.132
2.541
3.904
5.471
7.184
9.036
11.030
13.175
15.606
20.000
0.500
12.500
2.004
2.229
3.486
4.988
6.672
8.535
10.576
12.806
15.368
20.000
0.600
12.000
1.789
1.929
3.100
4.552
6.226
8.117
10.225
12.562
15.263
20.000
0.700
10.500
1.488
1.637
2.742
4.159
5.839
7.778
9.975
12.441
15.290
20.000
0.800
8.000
1.111
1.353
2.408
3.806
5.508
7.514
9.822
12.440
15.452
20.000
0.900
4.500
0.673
1.074
2.096
3.487
5.230
7.322
9.764
12.559
15.752
20.000
1.000
0.000
0.200
0.800
1.800
3.200
5.000
7.200
9.800
12.800
16.200
20.000
Выводы:
В ходе проделанной работы был реализован метод сеток для решения задачи Дирихле.
Метод был реализован для шага h = 0.1. Для достижения точности 𝟏𝟎−𝟓 было выполнено
109 итераций алгоритма.
4
Download