IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Вычисление относительной погрешности для функции.
Krjuger
сообщение 12.04.2011 17:19
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


В общем это некое продолжение моей прошлой темы,только обрастающее новыми подробностями.
У меня дана функция x(expx-1).Я эту функцию раскладываю я ряд Тейлора и получаю сумма от 1 до N от xn+1/n!.
Чтобы найти относительную погрешность мне надо а -n ый член разделить на сумму ряда,все это по модулю.Ну в общем то ,я думаю, вы и так понимаете как это делать.Суть заключается в том,у меня опять есть ограниченная разрядность мантисы и мне надо посмотреть как она будет влиять на результат.И как будет меняться N при которых мы будем выходить за граници возможностей нашей машины.

Я немного абстрагировался от этой задачи.что я сделал, при помощи маткада я посчитал,при каком N будет достигаться относительная погрешность на грани машинного эпсилон 10-16,это N =24.Да забыл сказать,что точка в которой мы раскладываем ряд у меня дана.Это -2.3.Затем я высчитал значение этой погрешности она составила 8.602898672363349*10^-16.Дальше я посомтрел как оно себя будет вести при разрядах мантисы от 10 до 25,при фиксированных исходных данных.Для рязрядности с 10 до 16 я получил ожидаемый результат,но дальше начало твориться что то вообще непонятное.Ну или точнее я не могу понять, как это интерпретировать.
ИзображениеФайл с самой программой тоже прикрепляю.


Прикрепленные файлы
Прикрепленный файл  ChMet_Laba_1.cpp ( 1.24 килобайт ) Кол-во скачиваний: 250
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 15.04.2011 12:11
Сообщение #2


Гость






Что-то тема заскучала... Давай сделаем вброс небольшой.

1)
Цитата
что я сделал, при помощи маткада я посчитал,при каком N будет достигаться относительная погрешность на грани машинного эпсилон 10-16,это N =24.
Неверно. Надо проверять не на грани машинного эпсилон, а на грани эпсилон для твоего типа, мантисса которого содержит ограниченное число разрядов. Для m = 5 и m = 11 это будут разные значения, и нет смысла вычислять с точностью 10-16, если m = 5. Максимальная точность - только для максимальных длин мантиссы, и то не в типе float, а в long double. Соответственно, вычислять надо не N первых членов ряда, а пока очередной член не будет меньше Epsilon для типа.

2)
Цитата
Дальше я посомтрел как оно себя будет вести при разрядах мантисы от 10 до 25,при фиксированных исходных данных.
На всех значениях от 10 до 25 посмотреть не могу, а вот для M = 5, M = 8 и M = 11 - проверил. Извиняй, в Сях нет соответствующих средств, поэтому проверил там, где есть:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is

generic
type Float_Type is digits <>;
procedure Check(X : Float_Type);

procedure Check(X : Float_Type) is
s, nom, nxt, last : Float_Type;
n, denom : Long_Long_Integer := 1;
begin
Ada.Text_IO.Put_Line ("Mantissa : " & Integer'Image (Float_Type'Mantissa));
Ada.Text_IO.Put_Line ("Epsilon : " & Float'Image (Float_Type'Epsilon));

s := 0.0;
nom := X * X;
loop
nxt := nom / Float_Type (denom);
Ada.Text_IO.Put_Line ("nxt = " & Float_Type'Image(nxt) &
" n! = " & Long_Long_Integer'Image(denom));
exit when abs(nxt) < Float_Type'Epsilon;
s := s + nxt;
nom := nom * X;
n := n + 1;
denom := denom * n;
last := nxt;
end loop;
Ada.Text_IO.Put_Line ("Last item : " & Float_Type'Image(last));
Ada.Text_IO.Put_Line ("S : " & Float_Type'Image(s));
Ada.Text_IO.Put_Line ("N : " & Long_Long_Integer'Image(n));

Ada.Text_IO.Put_Line ("Relative error : " &
Float'Image( abs(Float(last) / Float(s)) ));
Ada.Text_IO.New_Line;
end Check;

type MyFloat_05 is new Float digits 1;
procedure Check_05 is new Check(MyFloat_05);

type MyFloat_08 is new Float digits 2;
procedure Check_08 is new Check(MyFloat_08);

type MyFloat_11 is new Float digits 3;
procedure Check_11 is new Check(MyFloat_11);


begin
Check_05 (X => -2.3);
Check_08 (X => -2.3);
Check_11 (X => -2.3);
end Main;
Результат:
Mantissa :  5
Epsilon : 6.25000E-02
nxt = 5.3E+00 n! = 1
nxt = -6.1E+00 n! = 2
nxt = 4.7E+00 n! = 6
nxt = -2.7E+00 n! = 24
nxt = 1.2E+00 n! = 120
nxt = -4.7E-01 n! = 720
nxt = 1.6E-01 n! = 5040
nxt = -4.5E-02 n! = 40320
Last item : 1.6E-01
S : 2.1E+00
N : 8
Relative error : 7.38203E-02

Mantissa : 8
Epsilon : 7.81250E-03
nxt = 5.3E+00 n! = 1
nxt = -6.1E+00 n! = 2
nxt = 4.7E+00 n! = 6
nxt = -2.7E+00 n! = 24
nxt = 1.2E+00 n! = 120
nxt = -4.7E-01 n! = 720
nxt = 1.6E-01 n! = 5040
nxt = -4.5E-02 n! = 40320
nxt = 1.1E-02 n! = 362880
nxt = -2.6E-03 n! = 3628800
Last item : 1.1E-02
S : 2.1E+00
N : 10
Relative error : 5.51081E-03

Mantissa : 11
Epsilon : 9.76563E-04
nxt = 5.29E+00 n! = 1
nxt = -6.08E+00 n! = 2
nxt = 4.66E+00 n! = 6
nxt = -2.68E+00 n! = 24
nxt = 1.23E+00 n! = 120
nxt = -4.73E-01 n! = 720
nxt = 1.55E-01 n! = 5040
nxt = -4.47E-02 n! = 40320
nxt = 1.14E-02 n! = 362880
nxt = -2.63E-03 n! = 3628800
nxt = 5.49E-04 n! = 39916800
Last item : -2.63E-03
S : 2.07E+00
N : 11
Relative error : 1.26910E-03

[2011-04-15 12:00:33] process terminated successfully (elapsed time: 00.23s)

Могу проверить еще и для остальных (M = 15, 18, 21, ...), если надо.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.07.2025 14:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"