Уравнения гиперболического типа
Запись от IrineK размещена 06.07.2014 в 09:22
Показов 5450
Комментарии 1
Метки math, крест, математика, неявная схема
|
Используя явную схему крест и неявную схему, решить начально-краевую задачу для дифференциального уравнения гиперболического типа. Аппроксимацию второго начального условия произвести с первым и со вторым порядком. Осуществить реализацию трех вариантов аппроксимации граничных условий, содержащих производные: двухточечная аппроксимация с первым порядком, трехточечная аппроксимация со вторым порядком, двухточечная аппроксимация со вторым порядком. В различные моменты времени вычислить погрешность численного решения путем сравнения результатов с приведенным в задании аналитическим решением |
Метки math, крест, математика, неявная схема
Размещено в Разностные схемы
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
-
Уравнение 1
Аналитическое решение
======================================== ======================================== ============
1) Схема "крест" (рис.1)
Разностные аналоги имеют следующий вид
где- значение функции u(x,t) в момент времени
в точке пространства
Разностная схема для данного уравнения
Искомой величиной является значение функциив момент времени
в точке пространства
.
Введём число Курантаи выразим явно
Видим, что для нахождения значения функции в узле i на k + 1-ом временном слое, необходимо знать значения функции в трех узлах (i – 1, i, i + 1) на k-ом временном слое и одно значение в узле i на k – 1-ом временном слое.
Начальные условия
Первого порядка точности
или
Второго порядка точности
Выразим в явном виде
Граничные условия
первого рода - производных не содержат. Поэтому просто
======================================== ======================================== ============
2) Неявная схема (рис.2)
По неявной схеме получаем систему уравнений
Откуда на k-ом временном слое
Присхема безусловно устойчива.
Граничные и начальные условия уже нами определены.
======================================== ======================================== ============
Реализация
Реализация построенных схем выглядит следующим образом
"Крест"
Неявная схема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); }
GUI можно прикрутить по вкусу.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); }
Представленные выше - графики получены в консоли средствами WinAPI
Количество точек на стержне задаёт пользователь (от 10 до 1000). Графики - для 1000 точек.Запись от IrineK размещена 06.07.2014 в 09:29


