2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Задача Дирихле для двумерного уравнения Лапласа [Delphi]
Сообщение20.03.2016, 14:25 
Аватара пользователя


27/03/14
1091
Нужно решить граничную задачу для уравнения Лапласа, написав в Delphi соответствующую программу.
Постановка задачи:
$\frac{\partial^2u}{\partial x^2}+\frac{\partial^2u}{\partial y^2}=0$;

$u(0,y)=20y; u(x,0)=20x^2$;

$u(1,y)=20\cos(2\pi y); u(x;1)=20\cos(2\pi x)$

Предлагается решить задачу методом сеток. Сводится к решению следующей системы:

$u_{i,j}^{(k)}=\frac{1}{4}(u_{i+1,j}^{(k-1)}+u_{i,j+1}^{(k-1)}+u_{i-1,j}^{(k-1)}+u_{i,j-1}^{(k-1)}), i,j=\overline{1,n-1}$, $k$- номер итерации

$u_{0,j}=20y_j; u_{i,0}=20x_i^2; u_{50,j}=20\cos{2\pi y_j}; u_{i,50}=20\cos{2\pi x_i}; i,j=\overline{0,50}$

Область- квадрат, сетка равномерная. Условие выхода из цикла $\max|u_{ij}^{(k)}-u_{ij}^{(k-1)}|<\varepsilon$ Вот вариант моей программы в Delphi:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
Var h,e,max:real; a:TextFile;
    N,i,j,k:integer;
    u,u0,mas:array [0..50,0..50] of real;
    x,y:array [0..50] of real;
    s:string;
    t:byte;
begin
e:=StrToFloat(Edit2.Text);
h:=1/150;
memo1.Lines.Clear;
///////////////сетка////////////////////
x[0]:=0; y[0]:=0;
for i:=0 to 49 do
  begin
    x[i+1]:=x[i]+i*h;
    y[i+1]:=y[i]+i*h;
  end;
///////////////////////////////////////
//////////граничные условия/////////////
  for i:=0 to 50 do begin u0[0,i]:=20*y[i]; mas[0,i]:=0; end;
  for i:=0 to 50 do begin u0[i,0]:=20*sqr(x[i]); mas[i,0]:=0; end;
  for i:=0 to 50 do begin u0[50,i]:=20*Cos(2*pi*y[i]); mas[50,i]:=0; end;
  for i:=0 to 50 do begin u0[i,50]:=20*Cos(2*pi*x[i]); mas[i,50]:=0; end;
///////////////////////////////////////
/////////////Начальные приближения//////////
for i:=1 to 49 do
  begin
    for j:=1 to 49 do u0[i,j]:=0;
  end;
////////////////////////////////////////////
////////////Итерации///////////////////////
 repeat
 //---------------------Одна итерация---------------//
    for i:=1 to 49 do
      begin
        for j:=1 to 49 do
          begin
            u[i,j]:=1/4*(u0[i+1,j]+u0[i-1,j]+u0[i,j+1]+u0[i,j-1]);
            mas[i,j]:=ABS(u[i,j]-u0[i,j]); //Массив из которого будем выбирать максимум разности u-u0
            u0[i,j]:=u[i,j];
          end;
      end;
  //-----------------------------------------------//
  //--------------Выбор максимального элемента----------//
 max:=mas[0,0];
  for i:=1 to 50 do
    begin
      for j:=1 to 50 do
        begin
          if  mas[i,j]>=max then max:=mas[i,j];
        end;
    end;
  /////////////////////////////////////////////////////
  until max<e;


-- 20.03.2016, 13:26 --

Результат удалось вывести только в виде таблицы $(x_i,y_i,u_{ij})$, чиселки там сомнительные получились. Среди них есть числа порядка $o(10^{100})$ Может, есть ошибка в решении системы?

 Профиль  
                  
 
 Re: Задача Дирихле для двумерного уравнения Лапласа
Сообщение22.03.2016, 07:38 


27/08/14
207
Первое, что заметил - Вы вычисляете u[i,j], а затем сразу присваиваете его в u0. Таким образом при вычислении следующего элемента используется только что вычисленное значение предыдущего элемента, а не значение, которое было после предыдущего шага. Нужно сделать присвоение u0[i,j]:=u[i,j] в отдельном цикле. Проверьте ещё, что Вы правильно заполнили массивы x и y, возможно в них не то, что было задумано. Для нахождения максимального элемента не обязательно заводить отдельный массив, можно его определять в основном цикле.

 Профиль  
                  
 
 Re: Задача Дирихле для двумерного уравнения Лапласа
Сообщение22.03.2016, 23:16 
Аватара пользователя


27/03/14
1091
Progger, спасибо, уже все исправил, работает! :-)

-- 22.03.2016, 22:45 --

Кому интересно, вот решение, я набор точек "руками" экспортировал в mathematica:
Изображение

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group