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

Mathcad - ЛР1

.pdf
Скачиваний:
170
Добавлен:
24.02.2016
Размер:
259.18 Кб
Скачать

Введем в коэффициент b погрешность 0.1:

k2 := korni_uravnenia(1,-39.6 + Db1,-716.85)

æ-13.5020272697128

ö

k2 = ç

53.0920272697128

÷

 

è

ø

Практические вычисленные погрешности: Теоретически вычисленные погрешности:

D(k1,k21) = 2.02726971282985 ´ 10− 3

 

f_b_x1(1, -716.85,-39.6)

 

×Db1 = 2.02702702702703 ´ 10− 3

 

 

 

 

D(k2,k22) = 7.97273028717171 ´ 10− 3

 

f_b_x2(1, -716.85,-39.6)

 

×Db1 = 7.97297297297297 ´ 10− 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d(k2

1

, D(k , k2

)) = 1.50145579795808 ´ 10− 4

 

 

 

f_b_x1(1, -716.85,-39.6)

 

×Db1

 

= 1.50127605768799 ´ 10− 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

k21

 

 

 

 

 

 

 

 

 

 

 

d(k2

2

, D(k , k2

)) = 1.50168126876554 ´ 10− 4

 

 

 

f_b_x2(1, -716.85,-39.6)

 

×Db1

 

= 1.50172697916948 ´ 10− 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

2

 

 

 

k22

 

 

 

 

 

 

 

 

 

 

 

Введем в коэффициент b погрешность 0.2:

 

k2 := korni_uravnenia(1,-39.6 + Db2,-716.85)

æ-13.5040550248839

ö

 

 

 

k2 = ç

÷

 

 

 

 

è 53.0840550248839

ø

Практические вычисленные погрешности: Теоретически вычисленные погрешности:

D(k1,k21) = 4.05502488394305 ´ 10− 3

 

f_b_x1(1, -716.85,-39.6)

 

×Db2 = 4.05405405405406 ´ 10− 3

 

 

 

 

D(k2,k22) = 0.015944975116064

 

f_b_x2(1, -716.85,-39.6)

 

×Db2 = 0.015945945945946

 

 

 

 

 

 

 

d(k2

1

, D(k , k2

)) = 3.00282017251177 ´ 10− 4

 

 

 

f_b_x1(1, -716.85,-39.6)

 

×Db2

 

 

 

 

 

 

= 3.00210125520345 ´ 10− 4

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

k21

 

 

 

 

 

 

 

 

 

 

 

 

 

d(k2

 

, D(k , k2

)) = 3.00372213625903 ´ 10− 4

 

 

 

f_b_x2(1, -716.85,-39.6)

 

×Db2

 

 

− 4

 

 

 

 

 

 

 

 

2

2

2

 

 

 

 

 

 

 

 

 

= 3.00390502166254

´ 10

 

 

 

 

k22

 

 

 

 

 

 

 

 

 

 

Введем в коэффициент b погрешность 0.3:

 

 

 

k2 := korni_uravnenia(1,-39.6 + Db3,-716.85)

 

 

 

k2 = æ-13.5060832656434 ö

 

 

 

 

 

è 53.0760832656434 ø

 

Практические вычисленные погрешности: Теоретически вычисленные погрешности:

D(k1

,k21) = 6.08326564336892 ´ 103

 

f_b_x1(1, -716.85,-39.6)

 

×Db3 = 6.08108108108108 ´ 103

 

 

 

 

D(k2

,k22) = 0.023916734356632

 

f_b_x2(1, -716.85,-39.6)

 

×Db3 = 0.023918918918919

 

 

 

 

d(k21

, D(k1, k21)) = 4.50409309917662 ´ 104

 

 

 

f_b_x1(1, -716.85,-39.6)

 

×Db

3

 

 

= 4.50247563373911 ´ 104

 

 

 

 

 

 

 

 

 

k21

 

 

 

d(k22

, D(k2, k22)) = 4.50612269879261 ´ 104

 

 

 

f_b_x2(1, -716.85,-39.6)

 

×Db3

 

= 4.50653428950396 ´ 104

 

 

 

 

 

 

 

 

 

 

 

 

 

k22

 

 

 

 

 

 

 

 

 

 

 

 

 

Введем в коэффициент b погрешность 0.4:

 

 

 

 

k2 := korni_uravnenia(1,-39.6 + Db4,-716.85)

æ-13.5081119921212

ö

 

 

 

k2 = ç

 

 

÷

 

 

 

è 53.0681119921212

 

ø

Практические вычисленные погрешности: Теоретически вычисленные погрешности:

D(k1

,k21) = 8.11199212114744 ´ 103

 

f_b_x1(1, -716.85,-39.6)

 

×Db4 = 8.10810810810811 ´ 103

 

 

 

 

D(k2

,k22) = 0.031888007878855

 

f_b_x2(1, -716.85,-39.6)

 

×Db4 = 0.031891891891892

 

 

 

 

d(k21

, D(k1, k21)) = 6.0052745534527 ´ 104

 

 

 

f_b_x1(1, -716.85,-39.6)

 

×Db4

 

= 6.00239923450243 ´ 104

 

 

 

 

 

 

 

 

k21

 

 

 

 

 

 

 

 

 

 

 

 

 

d(k22

, D(k2, k22)) = 6.00888305270584 ´ 104

 

 

 

f_b_x2(1, -716.85,-39.6)

 

×Db4

 

= 6.0096149447764 ´ 104

 

 

 

 

 

 

 

 

 

 

 

 

k22

 

 

 

 

 

 

 

 

 

 

 

 

Вывод: Влияние погрешности, внесенной в сложное математическое выражение, может быть учтено теоретически. Для определения абсолютной погрешности в данном вычислительном эксперименте применялась формула Лагранжа.

Задача 1.6. Для пакета MATHCAD найти значения машинного нуля, машинной бесконечности,

машинного эпсилон

Теоретический материал.

В ЭВМ для вещественных чисел используется двоичная система счисления и принята форма представления чисел с плавающей точкой x = μ ×2p ,

μ = ±(γ1 × 21 + γ 2 × 22 + ... + γ t × 2t ) . Здесь μ - мантисса ; γ1,γ 2,..γt - двоичные цифры, причем всегда γ1=1, p-целое число называемое двоичным порядком.

Количество t цифр, которое отводится для записи мантиссы, называется разрядностью мантиссы. Диапазон представления чисел в ЭВМ ограничен конечной разрядностью мантиссы и значением числа p. Все представимые числа на ЭВМ

удовлетворяют неравенствам: 0 < X0

 

x

 

< X, где X

0 = 2

( pmax +1)

,

 

 

X= 2pmax . Все числа, по модулю большие X, не представимы на ЭВМ и

рассматриваются как машинная бесконечность. Все числа,

по модулю меньшие X0 ,

для ЭВМ не отличаются от нуля и рассматриваются как машинный нуль.

 

Машинным эпсилон εM называется относительная точность ЭВМ, то есть граница относительной погрешности представления чисел в ЭВМ. Покажем, что

εM » 2t . Пусть x* = μ × 2p , тогда граница абсолютной погрешности представления этого числа равна D(x*) » 2t1 × 2p . Поскольку 12 £ μ <1, то величина относительной погрешности представления оценивается так:

 

 

(x*) »

 

(x*)

 

2t1 × 2p

 

2t1

£

2t1

 

 

 

D

»

=

= 2t .

δ

 

 

x*

 

μ × 2p

μ

21

 

 

 

 

 

 

 

 

 

Машинное эпсилон определяется разрядностью мантиссы и способом округления чисел, реализованным на конкретной ЭВМ.

Примем следующие способы определения приближенных значений параметров, требуемых в задаче:

1.Положим X= 2n , где n - первое натуральное число, при котором происходит переполнение.

2.Положим X0 = 2m , где m первое натуральное число , при котором 2m совпадает с нулем.

Решение задачи:

МАШИННАЯ БЕСКОНЕЧНОСТЬ

inf(n) := 10n

МАШИННЫЙ НУЛЬ

zero(k) := 2k

МАШИННОЕ ЭПСИЛОН

eps(k) := 2k

Находим машинную бесконечность:

inf(307) = 1 × 10307

inf(308) =

Находим машинный нуль для MathCAD:

get_zero := a ¬ 1 k ¬ 0

while a > 0

a ¬ a2

k ¬ k - 1

k

get_zero = -1.019 ´ 103

zero(get_zero) = 0

Степень двойки, при которой число представляется в

MathCAD как нуль.

Находим относительную точность в MathCAD:

get_eps1 :=

 

k ¬ 0

get_eps2 :=

 

 

 

k ¬ 0

 

 

 

 

 

while 1 + eps(k) > 1

 

 

 

 

while 1 - eps(k) ¹ 1

 

 

k ¬ k - 1

 

 

 

 

k ¬ k - 1

 

 

k

 

 

 

 

k

get_eps1 = -40

get_eps2 = -40

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

eps(-40) = 9.09494701772928 ´ 1013

Вывод: В ходе вычислительного эксперимента были получены результаты, порядки

которых сопоставимы с порядками теоретически определенных величин для современных ЭВМ вообще, что подтверждает корректную постановку эксперимента.

Задача 1.7. Вычислить значения машинного нуля, машинной бесконечности, машинного эпсилон

в режимах одинарной , двойной и расширенной точности на двух алгоритмических языках. Сравнить результаты.

Результаты вычислительного эксперимента:

Вычисление на компиляторе C++ (Intel):

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

#include "stdafx.h" #include "iostream.h" #include <conio.h>

int main()

{

float a; double b; long double c; int k;

a = 1; k = 0;

while (a != 0)

{

a = a / 2; k = k - 1;

}

cout << "Machine zero for float in (single precision) is 2 in "<< k

<< " degree" << endl;

b = 1; k = 0;

while (b != 0)

{

b = b / 2; k = k - 1;

}

cout << "Machine zero for float (double precision) is 2 in " << k << " degree" << endl;

c = 1; k = 0;

while (c != 0)

{

c = c / 2; k = k - 1;

}

cout << "Machine zero for float (quad precision) is 2 in " << k << " degree" << endl;

cout << "===================================================" << endl << endl;

cout << "===================================================" <<

endl;

a = 1; k = 0;

float fepsilon = 1;

while (a + fepsilon != a)

{

fepsilon = fepsilon / 2; k = k - 1;

}

cout << "Machine fepsilon for float (single precision) is 2 in " << k << " degree" << endl;

b = 1; k = 0;

double depsilon = 1;

while (b + depsilon != b)

{

depsilon = depsilon / 2; k = k - 1;

}

cout << "Machine fepsilon for float (double precision) is 2 in " << k << " degree" << endl;

c = 1; k = 0;

long double ldepsilon = 1;

while( c + ldepsilon != c)

{

ldepsilon = ldepsilon / 2; k = k - 1;

}

cout << "Machine fepsilon for float (quad precision) is 2 in " << k

<< " degree" << endl;

cout << "===================================================" << en dl << endl;

cout << "==========================================================

======" << endl;

cout << "Machine continium for float (single precision):" << endl; a = 1;

k = 2;

for (k = 1; k < 126; k++)

{

a = a * 2;

}

for (k = 127; k < 130; k++)

{

a = a * 2;

cout << " 2 in " << k << " degree = " << a << endl;

}

cout << "==========================================================

======" << endl;

cout << "Machine continium for float (double precision):" << endl;

b = 1; k = 2;

for (k = 1; k < 1022; k++)

{

b = b * 2;

}

for (k = 1023; k < 1026; k++)

{

b = b * 2;

cout << "2 in "<<k<<" degree = "<<b<<endl;

}

cout << "==========================================================

======" << endl;

cout << "Machine continum for float (quad precision):" << endl;

c = 1; k = 2;

for (k = 1; k < 1023; k++)

{

c = c * 2;

}

for (k = 1024; k < 1026; k++)

{

c = c * 2;

cout << "2 in " << k << " degree = " << c << endl;

}

cout << "================================================================" << endl;

getch(); return 0;

}

Вычисление на компиляторе Pascal:

1.Machine continuum in single: 6.80564733841877E+38

2.Machine continuum in double: 3.595386972463181E+308

3.Machine continuum in quad: 2.3794629907144635301E+4932

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

program Null_Delphi; {$APPTYPE CONSOLE}

uses SysUtils;

Var

a, sepsilon : single;

 

b, depsilon : double;

 

c, eepsilon : extended;

k, choice : integer;

Begin Writeln('===================================================');

a := 1; k := 0;

while a <> 0 do begin

a := a / 2; k := k - 1;

end;

Writeln('Machine zero in single mode is 2 in ',k,' degree');

b := 1; k := 0;

while b <> 0 do begin

b := b / 2; k := k - 1;

end;

Writeln('Machine zero in double mode is 2 in ',k,' degree');

c := 1; k := 0;

while c <> 0 do begin

c := c / 2; k : = k - 1;

end;

Writeln('Machine zero in extend mode is 2 in ',k,' degree');

Writeln('===================================================');

Writeln;

Writeln('===================================================');

a := 1; k := 0;

sepsilon := 1;

while a + sepsilon <> a do begin

sepsilon := sepsilon / 2; k := k - 1;

end;

Writeln('Machine epsilone in single mode is 2 in ',k,' degree'); b := 1;

k := 0; Depsilon := 1;

while b + depsilon <> b do begin

depsilon := depsilon / 2; k := k - 1;

end;

Writeln('Machine epsilone in double mode is 2 in ',k,' degree');

c := 1; k := 0;

eepsilon: = 1;

while c + eepsilon <> c do begin

eepsilon := eepsilon / 2; k := k - 1;

end;

Writeln('Machine epsilone in extend mode is 2 in ',k,' degree');

Writeln('===================================================');

Writeln;

Writeln('===================================================');

Writeln('1: Machine continum in single');

Writeln('2: Machine continum in double');

Writeln('3: Machine continum in extend');

Readln(choice);

if choice = 1 then begin

a := 1; k := 2;

while ioresult = 0 do

begin

a := a * 2; k := k + 1;

Write(chr(13));

Write('Machine continum in single mode is 2 in ',k,'

degree');

end;

end;

if choice = 2 then begin

b := 1; k := 2;

while ioresult = 0 do begin

b := b * 2; k := k + 1;

Write(chr(13));

Write('Machine continum in double mode is 2 in ',k,'

degree');

end;

end;

if choice = 3 then begin

c := 1; k := 2;

while ioresult = 0 do begin

c := c * 2; k := k + 1;

Write(chr(13));

Write('Machine continum in extend mode is 2 in ',k,'

degree');

end;

end;

readln;

End.

Вывод: Полученные результаты соответствуют по своим порядкам теоретически возможным значениям.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]