Форум программистов, компьютерный форум, киберфорум
IrineK
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Уравнения гиперболического типа

Запись от IrineK размещена 06.07.2014 в 09:22
Показов 5450 Комментарии 1

Используя явную схему крест и неявную схему, решить начально-краевую задачу для дифференциального уравнения гиперболического типа. Аппроксимацию второго начального условия произвести с первым и со вторым порядком. Осуществить реализацию трех вариантов аппроксимации граничных условий, содержащих производные: двухточечная аппроксимация с первым порядком, трехточечная аппроксимация со вторым порядком, двухточечная аппроксимация со вторым порядком. В различные моменты времени вычислить погрешность численного решения путем сравнения результатов с приведенным в задании аналитическим решением https://www.cyberforum.ru/cgi-bin/latex.cgi?U(x,t). Исследовать зависимость погрешности от сеточных параметров https://www.cyberforum.ru/cgi-bin/latex.cgi?\tau, h
Миниатюры
Нажмите на изображение для увеличения
Название: fig1.png
Просмотров: 275
Размер:	58.9 Кб
ID:	2555   Нажмите на изображение для увеличения
Название: fig2.png
Просмотров: 239
Размер:	75.1 Кб
ID:	2556   Нажмите на изображение для увеличения
Название: fig3.png
Просмотров: 221
Размер:	86.4 Кб
ID:	2557  

Нажмите на изображение для увеличения
Название: fig4.png
Просмотров: 221
Размер:	78.0 Кб
ID:	2558  
Изображения
  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для IrineK

    Уравнение 1

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\frac{\partial^2 u}{\partial t^2} + 2\frac{\partial u}{\partial t} = \frac{\partial^2 u}{\partial x^2} + 2\frac{\partial u}{\partial x} - 3u<br />
\\u(0,t) = e^{-t}cos(2t)<br />
\\u(\frac{\pi }{2}, t) = 0<br />
\\u(x,0) = e^{-x}cos(x)<br />
\\u_{t}(x,0) = -e^{-x}cos(x)<br />

    Аналитическое решение https://www.cyberforum.ru/cgi-bin/latex.cgi?U(x,t) = e^{-t-x}cos(x)cos(2t)

    ======================================== ======================================== ============
    1) Схема "крест" (рис.1)

    Разностные аналоги имеют следующий вид
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{tt} \approx \frac{u_{i}^{k+1} - 2u_{i}^{k} + u_{i}^{k-1}}{\tau ^2}<br />
\\u_{t} \approx \frac{u_{i}^{k+1} - u_{i}^{k}}{\tau}<br />
\\u_{xx} \approx \frac{u_{i+1}^{k} - 2u_{i}^{k} + u_{i-1}^{k}}{h^2}<br />
\\u_{x} \approx \frac{u_{i+1}^{k} - u_{i}^{k}}{h}<br />

    где https://www.cyberforum.ru/cgi-bin/latex.cgi?u_{i}^{k} - значение функции u(x,t) в момент времени https://www.cyberforum.ru/cgi-bin/latex.cgi?t_{k} в точке пространства https://www.cyberforum.ru/cgi-bin/latex.cgi?x_{i}


    Разностная схема для данного уравнения

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\frac{u_{i}^{k+1} - 2u_{i}^{k} + u_{i}^{k-1}}{\tau ^2} + 2\frac{u_{i}^{k+1} - u_{i}^{k}}{\tau} = \frac{u_{i+1}^{k} - 2u_{i}^{k} + u_{i-1}^{k}}{h^2} + 2\frac{u_{i+1}^{k} - u_{i}^{k}}{h} - 3u_{i}^{k}<br />

    Искомой величиной является значение функции https://www.cyberforum.ru/cgi-bin/latex.cgi?u_{i}^{k+1} в момент времени https://www.cyberforum.ru/cgi-bin/latex.cgi?t_{k+1} в точке пространства https://www.cyberforum.ru/cgi-bin/latex.cgi?x_{i}.

    Введём число Куранта https://www.cyberforum.ru/cgi-bin/latex.cgi?C = \frac{\tau}{h} и выразим явно https://www.cyberforum.ru/cgi-bin/latex.cgi?u_{i}^{k+1}

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{i}^{k+1} = \frac{1}{1 + 2\tau}\left ( -u_{i}^{k-1} + C^2u_{i-1}^{k} + 2\left( \left( 1+\tau-\frac{3}{2}\tau ^2 \right ) - C^2 (1+h)\right )u_{i}^{k} + C^2 (1+2h)u_{i+1}^{k})\right )<br />

    Видим, что для нахождения значения функции в узле i на k + 1-ом временном слое, необходимо знать значения функции в трех узлах (i – 1, i, i + 1) на k-ом временном слое и одно значение в узле i на k – 1-ом временном слое.

    Начальные условия

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u(x,0) = e^{-x}cos(x) = \phi_1(x)<br />
\\u_{t}(x,0) = -e^{-x}cos(x) = \phi_2(x)<br />

    Первого порядка точности
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{i}^{0} = \phi_1(x_i)<br />
\\\frac{u_{i}^{0}-u_{i}^{-1}}{\tau} = \phi_2(x_i)<br />
    или
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{i}^{0} = \phi_1(x_i)<br />
\\u_{i}^{-1} = \phi_1(x_i) - \tau \phi_2(x_i)<br />


    Второго порядка точности
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{i}^{0} = \phi_1(x_i)<br />
\\\frac{u_{i}^{0}-u_{i}^{-1}}{\tau} = u_t(x_i,0) + \frac{\tau}{2}u_{tt}(x_i,0) = u_t(x_i,0) + \frac{\tau}{2}\left (  u_{xx}(x_i,0) + 2u_x(x_i,0)- 2u_t(x_i,0) - 3u(x_i,0)\right )<br />
\\\frac{u_{i}^{0}-u_{i}^{-1}}{\tau} = \left ( 1-\tau \right )\phi_2(x_i) + \frac{\tau}{2}\left (\frac{u_{i+1}^{0} - 2u_{i}^{0} + u_{i-1}^{0}}{h^2}+2\frac{u_{i+1}^{0} - u_{i}^{0}}{h}-3u_{i}^{0}\right )<br />

    Выразим в явном виде https://www.cyberforum.ru/cgi-bin/latex.cgi?u_{i}^{-1}
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{i}^{-1} = \tau (\tau-1) \phi_2(x_i)-\frac{\tau ^2}{2}\left (\left (\frac{1}{h^2}+\frac{2}{h}\right )\phi_1(x_{i+1})+2\left(-\frac{1}{\tau ^2} - \frac{1}{h^2}-\frac{1}{h}- \frac{3}{2}\right )\phi_1(x_{i})+\frac{1}{h^2}\phi_1(x_{i-1})\right )<br />


    Граничные условия

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u(0,t) = e^{-t}cos(2t)= \mu(t)<br />
\\u(\frac{\pi }{2}, t) = 0<br />

    первого рода - производных не содержат. Поэтому просто
    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
u_{0}^{k+1} = \mu(t_{k+1})<br />
\\u_{N}^{k+1} = 0<br />


    ======================================== ======================================== ============

    2) Неявная схема (рис.2)

    По неявной схеме получаем систему уравнений

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\left\{\begin{matrix}<br />
u_{tt}+2u_t\approx \frac{u_{i}^{k+1} - 2u_{i}^{k} + u_{i}^{k-1}}{\tau ^2} + 2\frac{u_{i}^{k+1} - u_{i}^{k}}{\tau} = \lambda \left(\sigma u_i^{k+1} + (1-2\sigma)u_i^{k} + \sigma u_i^{k-1} \right) - 3u_i^{k}<br />
\\ u_{xx}+2u_x\approx \frac{u_{i+1}^{k} - 2u_{i}^{k} + u_{i-1}^{k}}{h^2} + 2\frac{u_{i+1}^{k} - u_{i}^{k}}{h} = \lambda u_i^{k}<br />
\end{matrix}<br />

    Откуда на k-ом временном слое

    https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\left\{\begin{matrix}<br />
\lambda = \frac{1}{h^2}\left(\frac{u_{i+1}^{k}(1+2h) + u_{i-1}^{k}}{u_{i}^{k}} - 2(1+h)\right)<br />
\\u_{i}^{k+1} = \frac{(\lambda \tau^2(1-2\sigma)+2\tau - 1)u_{i}^{k}+(\lambda \tau^2 \sigma - 1)u_{i}^{k-1}}{1+2\tau-\lambda \tau^2 \sigma}<br />
\end{matrix}<br />

    При https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{1}{4}\leq \sigma \leq \frac{1}{2} схема безусловно устойчива.
    Граничные и начальные условия уже нами определены.

    ======================================== ======================================== ============

    Реализация

    Реализация построенных схем выглядит следующим образом

    "Крест"

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    #pragma once
     
    #include <cmath>
    const double pi = 3.14159265359;
     
    double Phi1 (double x)
    {   return exp(-x)*cos(x);
    }
     
    double Phi2 (double x)
    {   return -exp(-x)*cos(x);
    }
     
    double Mu (double t)
    {   return exp(-t)*cos(2*t);
    }
     
    double u_kp1_i (double u_km1_i, double u_k_im1, double u_k_i, double u_k_ip1, double h, double C)
    {   double tau = C*h;
        return (-u_km1_i + C*C*u_k_im1 + 2*(1+tau-1.5*tau*tau - C*C*(1+h))*u_k_i + C*C*(1+2*h)*u_k_ip1) / (1+2*tau);
    }
     
    void SetEdges (double **U, int N, int S, double tau)
    {   for (int j = 0; j<S; j++)
        {   U[0][j] = Mu(j*tau);
            U[N-1][j] = 0.;
        }
    }
     
    void SetStart1 (double **U, int N, int S, double tau, double *x)
    {   for (int i = 1; i<N-1; i++)
        {   U[i][0] = Phi1(x[i]) - tau * Phi2(x[i]);    //  u(t = -1)
            U[i][1] = Phi1(x[i]);                       //  u(t = 0)
        }
    }
     
    void SetStart2 (double **U, int N, int S, double tau, double h, double *x)
    {   for (int i = 1; i<N-1; i++)
        {   U[i][0] = Phi1(x[i]) - tau * ((1-tau)*Phi2(x[i]) + 0.5*tau*((Phi1(x[i+1]) - 2*Phi1(x[i]) + Phi1(x[i-1]))/(h*h) +
                2*(Phi1(x[i+1]) - Phi1(x[i]))/h - 3*Phi1(x[i])));
            U[i][1] = Phi1(x[i]);
        }
    }
     
    void FillAll (double **U, int N, int S, double *x, double h, double C)
    {   int j = 0;
        while (++j < S-1)
            for (int i = 1; i<N-1; i++)
                U[i][j+1] = u_kp1_i (U[i][j-1], U[i-1][j], U[i][j], U[i+1][j], h, C);
    }
    Неявная схема

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    double u_kp1_i_implicit (double u_km1_i, double u_k_im1, double u_k_i, double u_k_ip1, double h, double C)
    {   double tau = C*h;
        double sigma = 0.4;
        double lambda = (1/(h*h))*((u_k_ip1*(1+2*h) + u_k_im1)/u_k_i - 2*(1+h));
        return ((lambda*tau*tau*(1-2*sigma) + 2*tau - 1)* u_k_i + (lambda * tau*tau*sigma-1)*u_km1_i)/ (1+2*tau - lambda*tau*tau*sigma);
    }
     
    void FillImplicit (double **U, int N, int S, double *x, double h, double C)
    {   int j = 0;
        while (++j < S-1)
            for (int i = 1; i<N-1; i++)
                U[i][j+1] = u_kp1_i (U[i][j-1], U[i-1][j], U[i][j], U[i+1][j], h, C);
    }
    GUI можно прикрутить по вкусу.
    Представленные выше - графики получены в консоли средствами WinAPI
    Количество точек на стержне задаёт пользователь (от 10 до 1000). Графики - для 1000 точек.
    Запись от IrineK размещена 06.07.2014 в 09:29 IrineK вне форума
 
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru