Лекция 3 - msu.ruofvp.phys.msu.ru/upload/iblock/ec1/lecture3_2019.pdf · Машинная...
TRANSCRIPT
Лекция 3
Вычислительная физика
Машинная арифметика и язык Си
Вычислительная физика
Линейная аппроксимация данных
измерений
Численное дифференцирование
Численное решение уравнений вида
f(x)=0
14.11.2019
План лекции
14.11.2019 3
Машинная арифметика
Память ЭВМ - последовательность ячеек, в которых
могут находиться нули или единицы (биты):
01011101 10100010 01011101 10100010
байт - на многих машинах это
минимальная единица информации,
которая может быть адресована
Максимальное целое число, представимое одним
байтом?
Двоичная система 010111012= 1·20 +0·21 +
1·22 +1·23 +1·24 + 0·25 + 1·26 + 0·27 = 9310
Максимальное число, представимое одним байтом =
11111111 = 28-1 = 25510.
Диапазон неотрицательных чисел 0 ÷ 255.
Целое со знаком. Знак кодируется старшим битом.
Отрицательное число хранится в двоично-дополнительном виде: пример -2:
210 = 0000 00102 -> инвертируем: 1111 1101 -> +1 : 1111 1110.
Диапазон целых чисел: -128 ÷ 127.
Нумерация разрядов
01011101
76543210
14.11.2019 4
Целочисленные типы данных в Си
В одном и том же байте может содержаться разная информация в
зависимости от способа представления данных (целые, целые без знака).
char - целое, 1 байт (-128, 127)
void main()
{
char c;
c = 130;
printf ("\n%d", c);
}
unsigned char – целое без знака, 1
байт (0 , 255)
void main()
{
unsigned char c;
c = 130;
printf ("\n%d", c);
}
130-126
14.11.2019 5
Целочисленные типы данных в Си
char unsigned char
int unsigned int, unsigned
short int unsigned short int
long int unsigned long int
sizeof (short) <= sizeof (int) <= sizeof (long)
Visual C++short – 2 байта (диапазон -215 ÷ 215-1) unsigned short (диапазон 0 ÷ 216-1 ≡ 65 53510 )
int – 4 байта (диапазон -231 ÷ 231-1) unsigned int (диапазон 0 ÷ 232-1 ≡ 4 294 967 29510 )
long – 4 байта≡ 6553510
14.11.2019 Компьютерная физика: Лекция 3 6
Целочисленные типы данных в Си
unsigned int - целое, 4 байта (0, 4 294 967 295)
void main()
{
unsigned uc = 4294967294;
printf ("\n %u", ++uc);
printf ("\n %u", ++uc);
}
4 294 967 295
0
Вещественные числа
Эффективное распределение разрядов при хранении чисел с
плавающей точкой: больше динамический диапазон
Для хранения больших (1 000 000.0) и маленьких (0.000001)
чисел в формате с фиксированной точкой потребуется 13
разрядов: 0 000 000 . 000 000
С плавающей точкой: 1.E+6 1.E-6 нужно меньше разрядов.
Наряду с целыми числами необходимо хранить и вещественные числа,
которые имеют дробную часть: 0. 0103 или 1.0310 -2 или 10.310 -3
14.11.2019 Компьютерная физика: Лекция 3 8
Вещественные числа
Cтандарт IEEE 754 для представления чисел с одинарной точностью (float) и с двойной точностью (double).
S – знак, Е – смещенный порядок, m – нормализованная мантисса (1 <= m < 2).
Смещение = 127 (float) и 1023 (double)
float – 4 байта
double
– 8 байт
Формат с плавающей точкой: F = m ·10E , 1 <= m < 10;
m – мантисса, E – порядок 0 <= m < 1
14.11.2019 9
Формула вычисления десятичных чисел из
чисел представленных в стандарте IEEE754
float
MES
MES
double
14.11.2019 10
Пример: 155.625
155.625 = 128 + 0 + 0 + 16 + 8 + 0 + 2 + 1 + 0.5 + 0 + 0.125
155.625 = 127 +0 26+0 25+1 24+1 23+0 2 2+ 1 21+1 20+1 2-1+0 2-2+1 2-3
155.62510 = 10011011.1012 – число с фиксированной точкой
1.55625e+2 = 1.0011011101e+111- число с плавающей точкой в нормализованном виде
В результате в двоичном коде: M=1.0011011101 (мантисса)
E = +1112 или +710
Преобразование десятичного числа
в двоичное с плавающей точкой
0 10000110 0011011 10100000 00000000
+ 13410 мантисса (без единицы)
float:
(7 + 127)
14.11.201911
Ненормализованные числа
MES
Наименьшее нормализованное число (E=0, M=0): 2-127 = 5,9*10-39
Ограничение нормализованных чисел (E=1, M=0): 2-126 = 1,17*10-38
Если E=0 – денормализованное число
Формула для
денормализованных чиселF=(-1)S 2(E-126) M/223
Наименьшее денормализованное число > 0 (E=0, M=1):
2-(126+23) = 2-(149) = 1,4*10-45
14.11.2019 12
Минимальное денормализованное число (абсолютное)
00 00 00 0116 = 2-126 2-23= 2-149 = 1,40129846e-45
80 00 00 0116 = - 2-126 2-23 = 2-149 = - 1,40129846e-45
Это число граничит с нулем.
Максимальное нормализированное число (абсолютное)
7F 7F FF FF16 = 2127(2-2-23) = 3,40282347e+38
FF 7F FF FF16 = -2127 (2-2-23)= - 3,40282347e+38
Границы диапазонов чисел float
14.11.2019 13
Интерпретация целых чисел длиной
32 бит (4 байта) по стандарту IEEE754
F16 F16
1111 1111
14.11.2019 14
Объединения (union) в Си
void main()
{
union {unsigned a; float b;} un;
un.a =0x00000001;
printf("\n %u %e", un.a, un.b);
}
1 1.401298e-045
unsigned a;
float b;
00000000 00000000 00000000 00000000
00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000
14.11.2019 15
Машинное эпсилон
void main(){
double eps = 1.0;
while (1. + eps != 1.) eps /= 10. ;
printf ("\n %e", eps);
}
1.000000e-016
Наименьшее положительное число ε:
1 + ε ≠ 1
while (условие) оператор;
eps /= 10.; ↔ eps = eps/10.;
eps += 10.; ↔ eps = eps + 10.;Си
≠ !=
= ==eps = eps/10.;
14.11.2019 16
Машинное эпсилон (относительная точность)
void main(){
double eps = 1.0;
while (0.001 + eps != 0.001) eps /= 10. ;
printf ("\n %e", eps);
}
1.000000e-019
Абсолютная точность увеличилась
14.11.2019 17
Суммирование неоднородных слагаемых
void main()
{
double a1 = 1.0;
double a2 = 1.e-16, a3 = 1.e-16;
double sum;
sum = a1 + a2;
sum += a3;
printf ("\n %20.16f", sum);
}
1.0000000000000000
void main()
{
double a1 = 1.0;
double a2 = 1.e-16, a3 = 1.e-16;
double sum;
sum = a2 + a3;
sum += a1;
printf ("\n %20.16f", sum);
}
1.0000000000000002
14.11.2019 18
Опасность одинарной точности
void main()
{
float c = 1.e-45;
printf ("\n%e", c);
}
void main()
{
double c = 1.e-45;
printf ("\n%e", c);
}
1.000000e-451.401298e-45
min = ± 4,94065646e-324 min = ±1,40129846e-45
max = ± 3,40282347e+38 max = ± 1,79769313e+308
14.11.2019 19
Опасность одинарной точности
void main()
{
float c = 1.e-45;
c = c / 1.e-45;
printf ("\n%e", c);
}
void main()
{
double c = 1.e-45;
c = c / 1.e-45;
printf ("\n%e", c);
}
1.000000e+0001.401299e+000
“…с тех пор, как я подробнее узнал о принятых способах выполнения
машинных вычислений, очень опасаюсь ходить по мостам и оказываться
внутри других сложных инженерных сооружений".
проф. П. Скалички
14.11.2019 20
Линейная аппроксимацияданных измерений
1.5 1.0 0.5 0.5 1.0 1.5x
1.0
0.5
0.5
1.0
y
xi
yi
y = a*x +b
εi
Отклонение εi = a*xi + b - yi
14.11.2019 21
Метод наименьших квадратов
Отклонение εi = a*xi + b - yi
N
i
i min2
N
i
ii ybaxbaf min)(),( 2
N
i
iib
f
N
i
iiia
f
ybax
xybax
0)(2
0)(2
14.11.2019 22
Коэффициенты линейной регрессии
N
i
N
i
ii
N
i
i
N
i
i
N
i
ii
yNbxa
yxxbxa
0
02
N
i
ii
N
i
i
N
i
i
N
i
i
СyxBy
AxAx
1
2
2
1
Введем обозначения
14.11.2019 23
Система двух алгебраических уравнений относительно коэффициентов a и b
11
12
BNbaA
CbAaA
2
12
112
2
12
11
ANA
CABAb
ANA
BACNa
Ее решение
11
12
B
C
b
a
NA
AA
14.11.2019 24
Линейная аппроксимацияданных измерений
1.5 1.0 0.5 0.5 1.0 1.5x
1.0
0.5
0.5
1.0
y
y = a*x +b
-1.5 -1.0 -0.5
14.11.2019 25
Численное дифференцирование
f(x)Определения
xxn xn+1xn-1
xn – узел, n=0,1,2 … N-1
{xn} – расчетная сетка
∆xn = xn+1-xn - шаг сетки
f(xn)fn – сеточная функция
x
ff
x
ff
xdx
df nnnn
n
11
Первая производная
x
xfxxf
xdx
df nn
xn
)()(lim
0
Центральная разность
x
ff
xdx
df nn
n
2
11
Центральная разностьЛевая разность
14.11.2019 26
Численная схема для первой производной
x
ff
xdx
df nn
n
1
x
ff
xdx
df nn
n
2
11
Пусть f(х) = ex тогда f’(x)= ex
Пусть x = x0 = 1 тогда f(1)=f’(1)= e1 = 2.718281828
0.2 0.4 0.6 0.8 1.0 1.2 1.4
1.5
2.0
2.5
3.0
3.5
4.0
4.5
14.11.2019 27
Источники погрешности
• Погрешность математической модели
• Погрешность в исходных данных
• Погрешность численного метода
• Погрешность округления
Абсолютная погрешность приближенного значения α:
D(α) = │α - α * │
Относительная погрешность
δ(α) = │α - α * │/ │α * │
Виды погрешности
14.11.2019 28
Погрешность метода и ошибка округления
Левая разность
x
ff
xdx
df nn
n
1
Точное значение: f(1)=f’(1)= e1 = 2.718281828459045…
x0 =1.;
teor = exp(x0);
dx = 0.01;
printf ("\n Teor= %g", teor);
for (i = 1; i < 10; i++)
{
dx /= 10.;
dif = (exp(x0)-exp(x0-dx) )/dx;
Err = fabs((dif-teor)/teor);
printf ("\n dx = %.0e, Err= %.1e", dx, Err);
}
заголовок тело
for (начало; условие;конец) оператор;
Teor= 2.71828
dx = 1e-003, Err= 5.0e-004
dx = 1e-004, Err= 5.0e-005
dx = 1e-005, Err= 5.0e-006
dx = 1e-006, Err= 5.0e-007
dx = 1e-007, Err= 5.1e-008
dx = 1e-008, Err= 2.4e-009
dx = 1e-009, Err= 8.4e-008
dx = 1e-010, Err= 1.1e-006
dx = 1e-011, Err= 4.3e-006
14.11.2019 29
Первая производная:левая и центральная разности
x0 =1.;
teor = exp(x0);
dx = 0.01;
printf ("\n Teor= %g", teor);
for (i = 1; i < 10; i++)
{
dx /= 10.;
dif = (exp(x0)-exp(x0-dx) )/dx;
difс = (exp(x0+dx)-exp(x0-dx) )/(2.*dx);
Err = fabs((dif-teor)/teor);
Errс= fabs((difс-teor)/teor);
printf ("\n dx = %.0e, Err= %.1e, Errс=
%.1e ", dx, Err, Errc);
}
Левая разность
x
ff
xdx
df nn
n
1
Центральная разность
x
ff
xdx
df nn
n
2
11
14.11.2019 30
Погрешность метода и ошибка округления: левая и центральная разности
for (i = 1; i < 10; i++)
{
dx /= 10.;
dif = (exp(x0)-exp(x0-dx) )/dx;
difс = (exp(x0+dx)-exp(x0-dx) )/(2.*dx);
Err = fabs((dif-teor)/teor);
Errс= fabs((difс-teor)/teor);
printf ("\n dx = %.0e, Err= %.1e, Errс=%.1e ", dx, Err, Errc);
}dx = 1e-003, Err= 5.0e-004, ErrC= 1.7e-007
dx = 1e-004, Err= 5.0e-005, ErrC= 1.7e-009
dx = 1e-005, Err= 5.0e-006, ErrC= 2.2e-011
dx = 1e-006, Err= 5.0e-007, ErrC= 2.2e-011
dx = 1e-007, Err= 5.1e-008, ErrC= 8.0e-010
dx = 1e-008, Err= 2.4e-009, ErrC= 2.4e-009
dx = 1e-009, Err= 8.4e-008, ErrC= 2.4e-009
dx = 1e-010, Err= 1.1e-006, ErrC= 2.5e-007
dx = 1e-011, Err= 4.3e-006, ErrC= 4.3e-006
14.11.2019 31
Численное дифференцирование: вторая производная
x
ff
xdx
df nn
n
1
Первая производная
(левая разность)
x
xfxxf
xdx
df
dx
d
xdx
fd nn
xnn
)()(lim
02
2
Симметричная схема
x
ff
xdx
fd nn
n
1
Производная производной
(правая разность)
x
ffразностьлеваяf
x
ffразностьлеваяf
nnn
nnn
1
11
)(
)(
14.11.2019 32
Вторая производная: центральная разность
x
ff
xdx
fd
xdx
fd nn
nn
1
2
2
2
11
11
2
x
fff
x
x
ff
x
ff
nnn
nnnn
14.11.2019 33
Численное решение уравнений вида f(x)=0(поиск корней нелинейных уравнений)
a
acbbx
сbxax
2
4
0
2
2,1
2
0)(2
2
2
2
x
x
exxf
ex
2xy
2xey
)(xf
14.11.2019 34
Метод деления отрезка пополам
1. XL, XR: f(XL)*f(XR) < 0
Пусть f(XL) < 0
)(xf
XR
XL
2. XC =(XL+XR)/2;
XC
if ( f(XC) < 0 )
XL = XC;
else
XR = XC;
if (условие) оператор;
else оператор;
если |XR - XL| < ε - завершить
)()()(
XLfXRf
XLXRXRfXRXN
14.11.2019 35
Метод секущих
1. XL, XR: f(XL)*f(XR) < 0
Пусть f(XL) < 0)(xf
XR
XL
if ( f(XN) < 0 )
XL = XN;
else
XR = XN;
если |XNn – XNn-1| < ε
или | f(XN) | < ε
XN
XN = XR - ∆X
∆X = f(XR)/tgα
α
XLXR
XLfXRftg
)()(
стоп
14.11.2019 36
Метод касательных (Ньютона)
1. f(xj) ≠ 0
)(xf
xj
xxx jj 1
)( jxftg
α
xj+1
tgxfx j /)(
)(
)(1
j
j
jjxf
xfxx
+ быстрая сходимость
- если производная не существует или
трудно вычислить
- если несколько корней, может не
сойтись
- если производная = 0
14.11.2019 37
Метод касательных
-неудачное начальное приближение
комбинация методов
- несколько корней
предварительный анализ положения
корней
14.11.2019 38
Литература по лекционному материалу
1. Д. Кент. С++. Основы программирования. – М.: NT Press, 2010, 366 c.
2. Дж. Форсайт, М. Малькольм, К. Моулер. Машинные методы математических вычислений. – М.: Мир, 1980, 280 с.
3. Что нужно знать про арифметику с плавающей запятой. -http://habrahabr.ru/blogs/cpp/112953/.