2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Странное поведение неявных разностных схем
Сообщение27.12.2019, 15:47 


06/08/13
151
Здравствуйте, уважаемые участики форума!
В рамках предмета уравнения математической физики разбираю численную реализацию решения базовых УРЧП (волновое и теплопередачи). Рассматриваю явные и неяные разностные схемы. С явными схемами проблем нет в том смысле, что практическая их реализация (кодирование), расчёты, поведение решения согласуется с теорией.
А вот с неявными схемами что-то не ладится. Для уравнения теплопередачи я рассматриваю схему Крэнка-Николсон, а для волнового уравнения трёхслойную схему с весами (вес беру равным 0,5, что приводит к схеме похожей на схему Крэнка-Николсон - см. Калиткин Н.Н.). Краевые условия самые простые: $u(0,t) = \mu_1(t), u(1,t) = \mu_2(t), u(x,0) = \mu_3(x) , \frac {\partial u (x, 0)} {\partial t} = \mu_4(x) $ Я приведу волновое уравнение, разностную схему и код на Scilab. Я не могу понять, где я ошибаюсь? При реализации появляются жуткие осцилляции, которых вроде бы не должно быть.

$ \frac {\partial^2 u } {\partial t^2} =a^2 \frac {\partial^2 u} {\partial x^2} + f(t,x) $ - уравнение.
$\frac {u_j^{i-1} -2u_j^i +u_j^{i+1}}{h_t^2} = \frac{a^2}{2h_x^2} \left(  {u_{j-1}^{i-1} -2u_j^{i-1} +u_{j+1}^{i-1}} +{u_{j-1}^{i+1} -2u_j^{i+1} +u_{j+1}^{i+1}} \right) +f_j^i$ - разностная схема
ДОБАВЛЕНИЕ. $a = 0.5, h_x = 0.01, h_t = 0.02, X = 1.0, T = 2.0, f(t, x) =0 $
$ \gamma u_{j-1}^{i+1} - (1 + 2 \gamma)u_j^{i+1} +\gamma u_{j+1}^{i+1} = u_j^{i-1} -2 u_j^i - \gamma \left(u_{j-1}^{i-1} -2u_j^{i-1} +u_{j+1}^{i-1} \right) - h_t^2 f_j^i   $ - разностная схема приведена к виду системы уравнений из nx-1 уравнения, при условии, что пространственная сетка состоит из nx+1 узла. Система решается стандартной прогонкой.
Код в синтаксисе scilab
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
function [x,t,u] = WOLNA (T, ht, X, hx, a)
    nt = round(T./ht); nx = round(X./hx);
    u = zeros(nt+1,nx+1); gam = zeros(nx+1);
   
           gam = 0.5.*(ht.*a./hx).^2.0;

        x = zeros(nx+1); u = zeros (nt+1, nx +1); t = zeros(nt+1);

    for j = 1 : 1: nx+1
        x(j) =  (j - 1).*hx;
        u(1,j) = mu3(x(j));
    end
   
    t(1) = 0.0;
    for i = 2 : 1 : nt+1
        t(i) = (i - 1).*ht;
        u(i,1) = mu1(t(i));
        u(i, nx+1) = mu2(t(i));
    end  
   
    for j = 2 : 1 : nx
      u(2,j) = u(1, j) + 0.5.*gam.*(u(1,j-1) - 2.0.*u(1,j) + u(1,j+1)) + 0.5.*ht.^2.0.*func(t(1), x(j))+ ht.*mu4(x(j));
    end
   
    for i = 2 : 1 : nt
        A = zeros(nx-1); B = zeros(nx-1); C = zeros(nx-1); F = zeros(nx-1); xm = zeros(nx-1);
        F(1) = u(i - 1, 2) - 2.0.*u(i, 2) - ht.*ht.*func(t(i), x(2)) - ...
        gam.*(u(i+1, 1) + u(i-1, 1) -2.0.*u(i-1,2) + u(i-1, 3));
        A(1) = 0.0; C(1) = -(1.0 + 2.0.*gam); B(1) = gam;
       
        F(nx - 1) = u(i - 1, nx) - 2.0.*u(i, nx) - ht.*ht.*func(t(i), x(nx)) -...
        gam.*(u(i + 1, nx + 1) + u(i-1, nx-1) -2.0.*u(i-1,nx) + u(i-1, nx+1));
       
        A(nx - 1) = gam; C(nx-1) = -(1.0 + 2.0.*gam); B(nx-1) = 0.0;
       
        for j = 2 : 1 : nx-2
            F(j) = (1.0 +2.0.*gam).*u(i - 1, j) - 2.0.*u(i, j) - ht.*ht.*func(t(i), x(j))- ...
            gam.*(u(i - 1, j - 1) + u(i - 1, j + 1));
            A(j) = gam; C(j) = -(1.0 +2.0.*gam); B(j) = gam;
        end
       
        xm = progonka(A,B,C,F,nx-1);
        for j = 2 : 1 : nx
            u(i+1, j) = xm(j-1);
        end
    end;  
endfunction

function z = func (t,x)
  z = 0.0;
endfunction

function [ym] = mu1(t)
    ym = 0.0;    
endfunction

function [ym] = mu2(t)
    ym = 0.0;    
endfunction

function [ym] = mu3(x)
if (x <=1/3) then
    ym = 0.03.*x;
else
    ym = 0.015.*(1.0 - x);    
end
endfunction

function [ym] = mu4(x)
     ym = 0.0;
endfunction


function [xm] = progonka(A,B,C,F,n)
    for  i = 2: 1: n
        m = A(i)./C(i-1);
        C(i) = C(i) - m.*B(i-1);
        F(i) = F(i) - m.*F(i-1);
    end
    x(n) = F(n-1)./C(n-1);
    for i = n-1 :-1 : 1
        x(i) = (F(i) -B(i)*x(i+1))./C(i);
    end
    xm = x;
endfunction

 

ДОБАВЛЕНИЕ 2. Если имеется в виду вызов функции, то вот он
Используется синтаксис Matlab M
[x,t,u] = WOLNA (2.0, 0.02, 1.0, 0.01, 0.5);
. Если что-то другое, то поясните пожалуйста, что именно имеется в виду.

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение27.12.2019, 16:01 
Заслуженный участник


09/05/12
25179
Чему у вас равна скорость волны $a$ и шаги по координате и времени $h_x$ и $h_t$? Остальное (вид источникового члена и краевые условия) можно выцедить из кода, хотя и их было бы не лишним написать непосредственно.

 Профиль  
                  
 
 Posted automatically
Сообщение27.12.2019, 16:02 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Помогите решить / разобраться (М)» в форум «Карантин»
по следующим причинам:

- см.выше;
- стоит дополнить код так, чтобы его можно было запустить.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение28.12.2019, 13:24 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Помогите решить / разобраться (М)»

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение28.12.2019, 14:04 


06/08/13
151
Спасибо за возвращение из карантина!
В общем, главный косяк я нашёл (пришлось уравнения ситемы полностью расписать и выявить зависимость между всеми индексами).
Изменения произошли во внутреннем цикле.
Используется синтаксис Matlab M
  for j = 2 : 1 : nx-2
            F(j) = (1.0 +2.0.*gam).*u(i - 1, j+1) - 2.0.*u(i, j+1) - ht.*ht.*func(t(i), x(j+1))- ...
            gam.*(u(i - 1, j ) + u(i - 1, j + 2));
            A(j) = gam; C(j) = -(1.0 +2.0.*gam); B(j) = gam;
        end
 


Но всё равно. Поведение решения, полученного с помощью неявной схемы отличается от аналогичного решения, полученного с помощью явной схемы (все параметры естесственно одинаковые). Чем больше временной интервал, тем сильнее проявляется волнообразность...

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение28.12.2019, 14:11 
Заслуженный участник


09/05/12
25179
Я не уверен, что помню синтаксис правильно, но вроде во всех MatLAB'оподобных штуках функция zeros(n) возвращает нулевую матрицу размером $n\times n$. У вас же везде предполагается, что получится вектор. Как это повлияет на работоспособность кода - сходу сказать трудно, я не очень привык пользоваться этими инструментами, но, наверное, лучше бы поправить на всякий случай.

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение28.12.2019, 15:54 


06/08/13
151
Спасибо, исправил. В данном случае это никак не повлияет на результат, но для исключения возможных неожиданностей надо писать как-то так
Используется синтаксис Matlab M
zeros(1, nx+1)

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение28.12.2019, 16:07 
Заслуженный участник


09/05/12
25179
robot80 в сообщении #1432404 писал(а):
Чем больше временной интервал, тем сильнее проявляется волнообразность...
Еще бы понять, как именно узреть эту волнообразность...

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение28.12.2019, 18:01 


06/08/13
151
Вот картинка для явной схемы "крест": Изображение
А вот картинка неявной схемы Изображение
На первой картинке видно, что поверхность гладкая и в конечный момент времени чётко отзеркаливает начальное состояние.
На второй картике видна рябь на поверхности и в конечный момент времени поверхность изогнутая получается.
Видно конечно не слишком хорошо. Но если изменить парметры вызова расчётной фуцнкции, то разница будет заметнее.

 Профиль  
                  
 
 Re: Странное поведение неявных разностных схем
Сообщение29.12.2019, 07:27 


06/08/13
151
Собственно, вопрос и проблема здесь скорее библиографическая. Может быть кто-то встречал книги или статьи, где детально исследовалось бы поведение решений, полученных явной или неявной схемами. То, что нашёл я, ограничевается стандартной устойчивостью и точностью. Может быть есть ещё какие-то условия для неявной схемы, которая бы улучшила её поведение?

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

Модераторы: Модераторы Математики, Супермодераторы



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

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


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

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