Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа_Уравнения_переноса ХД РА.docx
Скачиваний:
151
Добавлен:
28.03.2015
Размер:
2.43 Mб
Скачать

Теоретическая часть, требуемая непосредственно для реализации

Линейное уравнение переноса. Уравнения первого порядка называются также уравнениями переноса. Это объясняется тем, что такие уравнения описывают процессы переноса частиц в средах, распространения возмущений и т. п.

Будем считать, что искомая функция зависит от времении одной пространственной переменной. Тогда линейное уравнение переноса может быть записано в виде

(1)

Здесь - скорость переноса, которую будем считать постоянной и положительной.

Это соответствует переносу (распространению возмущений) слева направо в положительном направлении оси . Правая частьхарактеризует наличие поглощения(или, наоборот, источников) энергии, частиц и т.д. в зависимости от того, какой физический процесс описывается уравнением переноса.

Характеристики уравнения (1) определяются соотношениями . При постоянномони являются прямыми линиями, которые в данном случае () наклонены вправо (рис 8.).

Рис.8.

Расчётная область решения уравнения (1) может быть бесконечной. так и ограниченной. В первом случае, задавая начальное условие при :

(2)

Получаем задачу Коши для полуплоскости . На практике обычно приходиться решать уравнения переноса в некоторой ограниченной области (например, в прямоугольнике). Начальное условие в этом случае задаётся на отрезке; граничное условие нужно задать прит.е. на отрезке, поскольку приa>0 возмущения распространяются вправо. Это условие запишем в виде

(3)

Таким образом, задача состоит в решении уравнения с начальным и граничным условиям и в ограниченной области G: .

Рассмотрим разностные схемы для решения задачи (1)-(3). Построим в области G равномерную прямоугольную сетку с помощью прямых иВместо функцийбудем рассматривать сеточные функции значения которых в узлахcсоответственно равны . Для построения разностной схемы необходимо выбрать шаблон. Примем его в виде правого нижнего уголка (рис 9).

Рис.9.

При этом входящие в уравнение производные аппроксимируются конечно-разностными соотношениями с использованием односторонних связей:

(4)

Решая это разностное уравнение относительно единственного неизвестного значениянаслое,получаем следующую разностную схему:

, ,(5)

Полученная схема явная, поскольку значения сеточной функции в каждом узле верхнего слоя выражается выражаются явно с помощью соотношений (5) через ранее найденные ее значения на предыдущем слое.

Для начала счета по схеме (5), т.е. для вычисления сеточной функции на первом слое, необходимы её значения на слое Они определяются начальным условием (2), которое записываем для сеточной функции:

(6)

Граничное условие так же записывается в сеточном виде:

, (7)

Таким образом, решение исходной дифференциальной задачи (1) - (3) сводится к решению разностной задачи (5)-(7). Найденные значения сеточной функции принимаются в качестве значений искомой функции и в узлах сетки.

Укажем теперь некоторые свойства данной разностной схемы. Она аппроксимирует

исходную задачу с первым порядком, т. e. невязка имеет порядок.

Схема условно устойчива; условие устойчивости имеет вид ()

Эти свойства схемы установлены в предположении, что решение U(x, t), начальное и

граничное значения Ф(x) и дважды непрерывно дифференцируемы, а правая частьF(x, t) имеет непрерывные первые производные.

Поскольку схема устойчива и аппроксимирует исходную задачу,сеточное решение сходится к точному с первым порядком при . Отметим, что при а < 0 условие не выполняется, и не сходится[1].

Таблица идентификаторов

Тип переменной

Имя переменной

Хранимое значение

int

I

Кол-во шагов по x

int

J

Кол-во шагов по t

double

a

Скорость потока

double

lmd

Лямбда

double

tau

Шаг сетки поt

double

h

Шаг сетки по x

double

x[]

Значения x

double

t[]

Значения t

double

u[ ][ ]

Значения в узлах

Реализация на языке программирования С++

#include <iostream>

#include <math.h>

#include <locale>

#include <iomanip>

using namespace std;

double fi(double x)

{

return x+3;

}

double psi(double t)

{

return t+1;

}

double func(double x, double t)

{

return x+t+1;

}

int main()

{

setlocale(LC_ALL, "rus");

double a; // скорость потока

double x[12]; // Значения x

double t[7]; // Значения y

double u[8][11]; // таблица узлов

int J=5;

int I=10;

double h; // шаг сетки по h

double tau; // шаг сетки по t

double lmd;

cout<<"Решение уравнения переноса:"<<endl;

cout<<" dU/dt + a*(dU/dx) = F(x,t) "<<endl;

cout<<"F(x,t): F(x,t)=x+t+1 "<<endl;

cout<<"Начальное условие: U(x,0)=fi(x)=x+3 "<<endl;

cout<<"Граничное условие: U(0,t)=psi(t)=t+1 "<<endl;

cout<<"Ограниченная область G: 0<=x<=1 и 0<=t<=0.5 "<<endl;

cout<<"Введите а - скорость переноса, a > 0: "; cin>>a;

h=1.0/I;

tau=0.5/J;

lmd=(a*tau)/h; // из формулы (5)

x[0]=0;

t[0]=0;

//формулы (6)

for(int i=0;i<=I;i++)

{

x[i+1]=x[i]+h;

u[0][i]=fi(x[i]);

// cout<<x[i]<<endl;

// cout<<u[0][i]<<endl;

}

// формулы (7, 5)

for(int j=0;j<=J;j++)

{

t[j+1]=t[j]+tau;

u[j+1][0]=psi(t[j+1]);

// cout<<t[j]<<endl;

// cout<<u[j+1][0]<<endl;

for(int i=1;i<=I;i++)

{

u[j+1][i]=lmd*u[j][i-1] + (1 - lmd)*u[j][i] + tau*func(x[i],t[j]) ;

}

}

// вывод таблицы узлов

for(int i=0;i<=J;i++)

{

for(int j=0;j<=I;j++)

{

cout<<setw(10)<<u[i][j]<<setw(10);

}

cout<<endl<<endl;

}

system("pause");

return 0;

}