Министерство образования и науки Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт кибернетики Кафедра информатики и проектирования систем Отчет по лабораторной работе №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