ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 02.08.2019

Просмотров: 4724

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Численное решение дифференциальных уравнений

96

Коэффициенты

a

i

,

b

ij

,

σ

i

выбираются из соображений точности. Например, для то-

го, чтобы уравнение (11.10) аппроксимировало исходное уравнение (11.2), необходимо

потребовать

m

P

i=1

σ

i

= 1. Отметим, что методы Рунге–Кутта при m > 5 не используются.

Для получения очередного значения

y

k+1

в методе Рунге–Кутта тре-

буется выполнить много промежуточных вычислений. Но из-за высокого

порядка погрешности аппроксимации метода можно выбирать сетку с до-

вольно крупным шагом

h. В итоге общее число арифметических операций

уменьшается. Наиболее распространённым является метод Рунге–Кутта

четвёртого порядка:

y

k+1

= y

k

+

h

6

(p

1

+ 2p

2

+ 2p

3

+ p

4

),

p

1

= f (x

k

, y

k

),

p

2

= f (x

k

+

h

2

, y

k

+

h

2

p

1

),

p

3

= f (x

k

+

h

2

, y

k

+

h

2

p

2

),

p

4

= f (x

k

+ h, y

k

+ hp

3

).


background image

Глава 2

Практические занятия

2.1

Занятие 1

2.1.1

Ошибки в вычислениях, числа с плавающей точкой

1.1

Пусть надо решить систему двух линейных уравнений:

−10

−7

x

1

+ x

2

= 1,

x

1

+ 2x

2

= 4.

Решение. Первый метод. Исключая

x

1

из первого уравнения:

x

1

= 10

7

x

2

10

7

, и подставляя это выражение во второе уравнение, получаем

x

2

=

10

7

+4

10

2

+2

.

Проведя вычисления с семью значащими цифрами, получаем

x

2

= 1.000000,

x

1

= 0.000000, что совершенно неверно, как видно из второго уравнения.

Второй метод. Исключая

x

1

из второго уравнения:

x

1

= 4

− 2x

2

,

получаем для

x

2

формулу

x

2

=

1+4

·10

−7

1+2

·10

−7

. После вычислений получаем

x

2

= 1.000000, x

1

= 2.000000 — правильное (с точностью по шести де-

сятичных цифр) решение.

Представление чисел с плавающей точкой в Matlab По умолча-
нию переменные имеют тип «плавающая точка двойной точности». Каж-

дое число занимает 8 байт. Представление имеет следующую структуру:

8 байт

z

}|

{

b

63

|{z}

знак

s

b

62

. . . b

52

|

{z

}

порядок

e

b

51

. . . b

0

|

{z

}

мантисса

f

97


background image

Занятие 1

98

число с пл. точкой

=

(

−1)

s

(2

e

−1023

)(1.f ) нормализованное, 0 < e < 2047,

(

−1)

s

(2

e

−1022

)(0.f ) ненормализованное, e = 0, f > 0,

ошибка

иначе

.

Далеко не все действительные числа точно представимы числом с пла-

вающей точкой. Множество

F чисел с плавающей точкой имеет мощность

|F |

6

2

64

, в то время как

|

R

| = ∞. Расстояние между числом x ∈ F и бли-

жайшим к нему числом

y

∈ F (x < y) приблизительно пропорционально

|x|. Чем дальше от нуля, тем реже встречаются числа из F среди чисел
из

R

.

Функция Matlabeps(x) вычисляет расстояние до ближайшего числа

с плавающей точкой, большего x.

1.2

Зная внутренне представление чисел системы Matlab, определить,

чему равно eps(7) и eps(8). Ответы сравнить и объяснить, почему они

отличаются в два раза.

Решение. Имеем

7

10

= 111

2

= 1, 11

2

· 2

2

= (

−1)

0

(2

1025

−1023

)(1, 11). Отсю-

да

s = 0, e = 1025, f = 11 00 . . . 0

|

{z

}

50 нулей

2

. Следующее число

7

0

с плавающей

точкой, большее 7, будет иметь

s = 0, e = 1025, f = 11 00 . . . 0

|

{z

}

49 нулей

1

2

. Полу-

чаем, что

eps(7) = 7

0

− 7 = 2

−50

≈ 8.881784197001252 · 10

−16

. Аналогично

eps(8) = 8

0

− 8 = 2

−49

≈ 1.776356839400251 · 10

−15

.

Ответ eps(7) в два раза меньше eps(8). Так происходит всякий раз

когда переходим через пороговое значение вида

2

k

,

k

Z

. В нашем случае

7 < 2

3

, а

8 = 2

3

.

1.3

Объяснить, почему при вычислении в среде Matlab

100 + 2^

−50

получается ответ 100, но

1 + 2^

−50


background image

Занятие 1

99

возвращает ответ 1.000000000000001?

Решение. Найдем двоичное представление первой суммы:

100 + 2

−50

=

1100100

2

+ 0, 0 . . . 0

| {z }

49 нулей

1

2

= 1100100, 0 . . . 0

| {z }

49 нулей

1

2

. Получилось 57 бит. Ман-

тисса имеет длину 52 бита, то есть данное число необходимо округлить

(отрезать «лишние» 5 бит). После округления остаётся только первое сла-

гаемое 100.

Найдем двоичное представление второй суммы:

1+2

−50

= 1

2

+0, 0 . . . 0

| {z }

49 нулей

1

2

=

1, 0 . . . 0

| {z }

49 нулей

1

2

. Получилось 51 бит, что вполне умещается внутри мантис-

сы.

Замечание. 52 двоичных разряда соответствуют 15–16 десятичным.

2.1.2

Матричные вычисления в Matlab

Полезные функции:

• ones(m,n) и zeros(m,n) — создать матрицу размера m × n, все эле-

менты которой 1 и 0. Пример:

ones(2,2)

=

1 1

1 1

!

,

zeros(1,3)

=

0 0 0

.

• eye(n) — создать единичную матрицу размера n × n. Пример:

eye(3)

=



1 0 0

0 1 0

0 0 1



.

• diag(v,k) — расположить элементы вектора v на k-ой диагонали

квадратной матрицы соответствующего размера. Пример:

v

= [1 2]

diag(v,0)

=

1 0

0 2

!

,

diag(v,1)

=



0 1 0

0 0 2

0 0 0



,

diag(v,-1)

=



0 0 0

1 0 0

0 2 0



.


background image

Занятие 1

100

Пусть далее

A =

1 2 3

4 5 6

!

.

• flipud(A) (от англ. flip up down), fliplr(A) (от англ. flip left right),

’ (штрих) — перевернуть матрицу сверху вниз, слева направо, относи-

тельно главной диагонали. Пример:

flipud(A)

=

4 5 6

1 2 3

!

,

fliplr(A)

=

3 2 1

6 5 4

!

,

A’

=



1 4

2 5

3 6



.

• prod(A,k), sum(x) — перемножить, просуммировать элементы матри-

цы в направлении

k. Пример:

prod(A,1)

=

4 10 18

,

prod(A,2)

=

6

120

!

,

sum(A,1)

=

5 7 9

,

sum(A,2)

=

6

15

!

.

• triu(A,k) (от англ. upper triangle), tril(A,k) (от англ. lower triangle)

— вернуть верхнюю, нижнюю треугольную часть матрицы

A, начиная

с

k-ой диагонали. Пример:

triu(A,1)

=

0 2 3

0 0 6

!

,

tril(A,0)

=

1 0 0

4 5 0

!

.

• repmat(B,m,n) — продублировать матрицу B по вертикали m раз и

по горизонтали

n раз. Пример:

B =

1 4

repmat(B,2,3)

=

1 4 1 4 1 4

1 4 1 4 1 4

!

.

1.4

Пусть задан вектор x = [1,2,4,5,6,7]. Задать в Matlabматрицу

определителя Вандермонда:

∆ =





1 x

0

x

2

0

· · · x

n

0

1 x

1

x

2

1

· · · x

n

1

... ...

. . . ...

1 x

n

x

2

n

· · · x

n

n





.