Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Математические основы моделирования сложных физических систем

.pdf
Скачиваний:
47
Добавлен:
14.03.2016
Размер:
2.94 Mб
Скачать

 

 

(x) =

1

(x x h) (x x ) (x

 

x),

 

i

 

 

 

 

 

h

i

 

i

i 1

 

 

 

 

 

 

 

 

 

 

 

 

 

(x) =

 

1

(x x h) (x x ) (x

 

x),

i

 

 

 

1

 

 

 

h

i

 

i

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(x) =

1,

x 0,

 

 

 

 

 

 

 

 

 

 

0,

x < 0.

 

 

 

В интегральное уравнение (2.3) теперь входит первая производная функции

u . Первая производная дискретной аппроксимации функции u имеет вид

du

 

dy(x)

= y1

d 1 (x)

y2

d 2 (x)

yn

d n

(x)

.

(2.5)

dx

 

dx

dx

dx

dx

 

 

 

 

 

 

Подставим эту аппроксимацию производной искомого решения в равенство (2.3) и потребуем его выполнения для каждой из n пробных функций (2.4). Тогда вместо интегрального уравнения (2.3) получим систему n алгебраических уравнений:

 

dy

 

 

1

1 d i (x) n

 

d j (x)

1

(2.6)

 

 

 

i

 

 

 

 

 

 

 

y j

 

dx q(x) i (x)dx = 0, i = 1,2, , n.

dx

 

 

 

0 dx j=1

dx

 

 

0

 

0

 

 

 

 

 

Перепишем систему уравнений (2.6) с учетом граничных условий (2.1)

 

 

 

1 d i (x)

n

d

j (x)

 

1

 

 

(2.7)

y1

yn

 

 

 

 

 

 

 

 

 

 

 

y j

 

 

 

 

 

dx = i (x)q(x)dx,

i.

 

 

 

 

 

dx

 

dx

 

 

 

 

0

 

 

 

j=1

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получим коффициенты матрицы K

 

 

 

 

 

 

 

 

y1

 

1 d 1 (x) d

j (x)

dx,

i = 1,

j;

 

 

 

 

 

0

 

 

 

dx

 

 

 

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 d i (x) d j (x)

dx,

 

 

i = 2,3, , n

1,

j;

 

fij =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2.8)

 

 

0 dx

 

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

yn

 

 

1 d n (x) d

j

(x)

dx,

i = n,

j.

 

 

 

 

 

 

0

 

dx

 

 

 

 

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

30

Матрица K имеет размерность nxn , где n - число узлов, считая

граничные. Она также оказывается трехдиагональной и включает граничные условия в первый и последний члены главной диагонали:

1 h

1

0

 

0

0

1

2

1

 

0

0

0

1

2

1

 

0

K =

1

 

 

 

 

.

(2.9)

h

 

 

 

 

 

0

0

1

2

1

 

 

 

 

 

 

0

0

0

1

1 h

 

Теперь займемся вычислением правой части системы уравнений (2.7)

при произвольной нагрузке q(x) .

 

 

 

 

 

Для первого и последнего узлов имеем

 

 

 

 

 

 

h

 

 

 

 

 

 

Q1 =

1 (x)q(x)dx,

 

(2.10)

 

 

 

0

 

 

 

 

 

 

 

xn

 

 

 

 

 

 

Qn =

 

n (x)q(x)dx.

 

(2.11)

 

 

 

xn

h

 

 

 

Вычисление правой части для внутренних узлов производится по формуле

xi

 

 

 

xi h

 

 

 

Qi =

i (xi )q(x)dx

i (xi )q(x)dx,1 < i < n.

(2.12)

xi h

 

 

 

xi

 

 

 

2.3. Контрольный пример

31

Рисунок 2.1 - Точное решение - сплошная кривая, крестики - решение методом

конечных элементов

В качестве контрольного примера решим методом конечных

элементов задачу (2.1) при q(x) =

2 , a0 = a1 =1:

 

 

d 2u

= 2,

x

[0,1],

 

d 2 x

 

 

du

 

 

 

du

(2.13)

u(0) =

(0), u(1) =

(1),

 

 

 

 

dx

 

 

dx

 

имеющую точное аналитическое решение

 

 

 

 

u(x) = x2

x

1.

 

Пусть шаг дискретизации h = 0.1, тогда n = 11. Вычисления интегралов выполним вручную, а для решения получившейся в результате вычисления системы уравнений (2.2) применим пакет SCILAB.

По формулам (2.9) - (2.12) получаем систему алгебраических уравнений

32

(2.2) в виде:

1.1

1

0

 

0

0

y1

0.01

1

2

1

 

0

0

y2

0.02

0

1

2

1

 

0

 

 

 

 

 

 

 

 

=

(2.14)

0

0

 

1

2

1

y10

0.02

0

0

 

0

1

0.9

y11

0.01

Воспользуемся математическим пакетом SCILAB, чтобы решить эту

систему уравнений.

Текст программы:

K = [

1.1 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1 0 0 0 0 0 0 0 0 0 -1 2 -1

0 0 0 0 0 0 0 0 0 -1 0.9];

q = -0.01*[1 2 2 2 2 2 2 2 2 2 1]; sol = inv(K)*q';

x = linspace(0,1,11); u = 1 + x + x*x;

scf(1), plot(x,u, x,sol,'+'), xlabel('x'), ylabel('u,y')

33

На рисунке 2.1 приведены результаты работы программы, из которых видно, что решение, найденное методом конечных элементов, на графике совпадает с точным.

2.4. Нормированные пробные функции

На сетке с равномерным шагом дискретизации на интервале x [0,1]

определим функции

 

2

(x x h),

x [x , x h],

 

 

 

 

i (x) =

h2

i

i

i

(2.15)

 

 

0,

x [xi , xi

h], xi

1,

 

2

(x x h),

x [x h, x ],

 

 

 

 

i (x) =

h2

i

i

i

(2.16)

 

 

0,

x [xi h, xi ], xi

0.

Определим пробную функцию на сетке выражением

i

(x),

i = 1;

 

i (x) = i (x)

i (x), i

1, n;

(2.17)

i

(x),

i = n.

 

Эти функции нормированы на единицу

1

1

1

 

i (x)dx =

i (x)dx =

(x)dx = 1.

(2.18)

0

0

0

 

Производная пробной функции дается выраженниями

d

 

 

2

,

x [xi

, xi

h],

 

i

=

 

h2

(2.19)

dx

 

 

 

 

 

 

0,

 

x [xi , xi

h], xi 1,

 

 

 

 

 

 

34

d

 

 

2

,

x [xi

h, xi

],

 

i

=

h2

(2.20)

dx

 

 

 

 

 

0,

 

x [xi h, xi ], xi 0.

 

 

 

 

 

 

Пусть y(xi ) - сеточная функция, аппроксимирующая значения u(x) в

узлах x = xi . В окрестности узла используем аппроксимацию:

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

u(x) y(xi )

 

(x

xi )

 

 

 

(x

 

xi ) yx (xi )

(xi

x) yx (xi )

(2.21)

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Здесь

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y

 

 

(x ) =

1

 

( y(x

) y(x ) ,

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

i

h

 

i 1

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- производная сеточной функции в узле xi , взятая в направлении назад,

 

 

 

y

 

 

(x ) =

 

1

y(x ) y(x

) ,

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

i

 

h

 

i

 

i 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- производная сеточной функции в узле xi ,

взятая в направлении вперед.

Тогда аппроксимация производной решения в окрестности узла xi

справа и

слева от него имеет вид

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

du

(x , x)

 

 

 

 

(x

 

x ) y

 

(x )

(x

 

x) y

 

(x )

(2.22)

 

 

 

 

 

 

 

x

 

x

 

dx

i

 

 

 

 

 

 

 

 

i

i

 

i

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Здесь (x) - функция Хэвисайда.

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

(2.17). Тогда вместо (2.3) получим n уравнений

 

du

 

1

1

 

 

 

 

1q(x)

 

 

 

 

 

d i

(x)

du

 

(x , x)dx =

 

(x)dx, i = 1,2, , n.

(2.23)

 

 

 

 

 

 

 

 

 

i dx

 

0

0

dx

 

dx

i

0

i

 

 

 

 

 

 

 

Здесь индекс i функции

i (x)

соответствует номеру строки матричного

35

уравнения, интегрирование ведется по окрестности узла xi с тем же номером,

что и номер строки, в интервале x

[xi 1, xi 1]

для внутренних узлов i 1, n , а

для первого и последнего узлов

- в интервалах x

[x1, x2 ] и

x [xn 1, xn ]

соответственно.

 

 

 

 

2.5. Матричные коэффициенты

 

 

 

Подставим в (2.23) выражения для i ,

d / dx

и du / dx

и вычислим

матричные коэффициенты построчно. Для упрощения дальнейших выкладок

обозначим yi

y(xi ) .

 

 

 

 

 

 

 

 

 

 

 

 

 

Для первой строки имеем

 

 

 

 

 

 

 

 

 

 

h

d

1

 

du

 

2

 

h

2 y

y

 

(0)a y

 

(x)

 

(0, x)dx =

 

a y

 

 

 

2

1

dx.

 

 

 

 

 

 

h2

 

1

0 1

dx

 

dx

 

h2 0 1

0

h

 

0

 

 

 

 

 

 

 

 

 

 

 

 

Матричные коэффициенты f1 j для первой строки не равны нулю только в первых двух столбцах:

f

=

2

a

2

, f =

2

, f

= 0, j > 2.

(2.24)

 

h2

h2

11

 

h 0

12

1 j

 

 

Для последней n -той строки имеем

 

1

d

n

 

du

 

2

 

 

1 2 y

y

 

(1)a y

 

(x)

 

(1, x)dx =

 

a y

 

 

 

 

n

n 1

dx.

 

 

 

 

 

 

 

h2

 

n

1 n

dx

dx

 

h2 1

n

1 h

h

 

1 h

 

 

 

 

 

 

 

 

 

 

 

 

 

Матричные коэффициенты fnj для последней строки не равны нулю только в двух последних столбцах:

f

 

= a

2

2

, f

 

=

2

, f

 

= 0, j < n 1.

(2.25)

 

 

 

h2

 

h2

 

 

nn

1 h

 

 

n,n 1

 

 

nj

 

 

Для строк с номерами 1 < i < n имеем

xi

d

i

(x) yx dx

xi

h d

i

(x) yx dx =

x h

dx

x

 

dx

i

 

i

 

 

 

 

 

 

 

i

 

 

 

i

 

 

 

 

36

xi

2

 

yi

yi 1

 

xi

h

2

 

yi 1

yi

 

 

 

dx

 

 

 

dx.

x h h2

h

x

 

h2

 

h

 

 

 

 

 

 

i

 

 

 

 

 

i

 

 

 

 

 

 

Матричные коэффициенты для этих строк не равны нулю в главной диагонали и еще двух столбцах - перед и после главной диагонали:

4

 

 

2

 

 

(2.26)

fii =

 

, fi,i 1

= fi,i 1

 

, fij

= 0,i 1 < j < i 1.

h2

h2

Следовательно, матрица K в данном случае имеет размерность

nxn ,

где n - число узлов, считая граничные. Она оказывается трехдиагональной и включает граничные условия в первый и последний члены диагонали:

1 a0h

1

0

 

0

0

1

2

1

 

0

0

0

1

2

1

 

0

K =

2

 

 

 

 

.

(2.27)

 

 

 

 

 

h2

 

 

 

 

0

0

1

2

1

 

 

0

0

0

1 1

a1h

 

Вычислим правую часть матричного уравнения. Согласно (2.23), вектор правой части дается выражениями

h

q1 = q(x) 1 (x)dx, i = 1;

0

 

 

 

xi

xi h

 

qi =

q(x) i (x)dx

q(x) i (x)dx,1 < i < n;

(2.28)

xi

h

xi

 

h

 

 

qn = q(x) n (x)dx, i = n.

 

1

h

 

 

Из сравнения матриц жесткости и правых частей, вычисленных с нормированными базовыми функциями (формулы (2.27) и (2.28)) и с ненормированными базовыми функциями видно (формулы (2.8) и (2.12)), что

37

в обоих случаях мы получим тоже самое матричное уравнение (2.2), к

решению которого сводится поставленная задача (2.1).

2.6. Пример вычислительной программы

В Приложении приведен текст вычислительной программы fem2.cpp,

написанной на языке С++, в котором решается задача (1.23) об однородном стержне с закрепленными концами нагруженном внешними силами,

направленными вдоль оси стержня и непрерывно меняющимися по величине.

Функцию нагрузки q(x) в правой части уравнения (1.23) можно задавать в тексте программы. Число узлов при дискретизации задачи также задается в тексте программы. На выходе получаются величины смещений узловых точек. Рекомендуется протестировать программу по какому-либо точному решению u(x) , получив для него функцию нагрузки q(x) . Примеры таких точных решений приведены в тексте программы.

Чтобы протестировать программу, решим континуальную задачу об однородном стержне с закрепленными концами (1.23):

d 2u = q(x), u(0) = u(1) = 0. d 2 x

Программа, реализующая вычислительный алгоритм для этой задачи,

приведена в Приложении и состоит из текста программы на С++ в файле fem3.cpp и хедерного файла fem3.h.

Чтобы протестировать программу, решим контрольный пример. Пусть решение имеет вид:

u(x) = x3 x.

Очевидно, что это решение удовлетворяет граничным условиям задачи.

Подставив это решение в уравнение, получим правую часть этого уравнения

38

для нашей тестовой задачи

q(x) = 6x.

В тексте программы fem3.cpp введем найденную правую часть в функцию fun_q() . В функции main() зададим число узлов knots_N . В функции output() организуем вывод приближенного решения и точного решения для соответствующих узлов в текстовый файл с именем results.dat.

3. СТАЦИОНАРНАЯ ДИФФУЗИЯ-КОНВЕКЦИЯ

3.1. Дискретизация задачи Пусть коэффициенты дифференциального уравнения зависят от

координаты x , а само уравнение имеет вид

 

d

D(x)

du

 

 

C(x)

du

A(x)u = q(x), x [0,1],

(3.1)

 

dx

dx

dx

 

 

 

 

 

 

 

с граничными условиями

 

 

 

 

 

 

 

 

au = D(x)

du

, x = 0; au = D(x)

du

, x = 1.

(3.2)

 

 

dx

dx

 

 

 

 

 

 

 

 

 

 

Такое уравнение может возникает в задачах диффузии или теплопроводности. В случае диффузии D - коэффициент диффузии, C -

коэффициент конвекции, A - коэффициент поглощения, и эти коэффициенты могут зависеть от координаты x , но не зависят от самого решения, что и делает задачу линейной.

Произведем дискретизацию так же, как и в предыдущем случае.

Согласно схеме метода конечных элементов, разобьем интервал [0,1] на элементы, соединенные в узлах xi , i =1,2, ,n (рисунок 1.4). Будем разыскивать приближенное решение задачи (3.1), (3.2) среди функций семейства с конечным числом параметров в виде (1.26).

39