Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Нахождение e^x с помощью суммы ряда даёт большую погрешность для отрицательных x

#c_sharp #алгоритм #ряды


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

Насколько я понимаю, последнее слагаемое ряда не должно превышать точность.

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

Для подтверждения того, о чем я говорю, приведу пару примеров. 

Вопрос: такое сильное отличие при работе с отрицательными степенями экспоненты -
это нормально или это косяк алгоритма? (Во втором примере сумма ряда вообще отрицательная,
хотя экспонента ограничена снизу нулем).

static void Main(string[] args)
{
    double eps, x, i = 1, sum = 0, addend = 1;
    Console.WriteLine("Введите x.");
    x = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("Введите eps.");
    eps = Convert.ToDouble(Console.ReadLine());

    while (Math.Abs(addend) > eps)
    {
        sum += addend;
        addend = addend * x / i;
        ++i;
    } 
    sum += addend;
    Console.WriteLine("Значение суммы ряда функции exp(x) в точке " + x + " с точностью
" + eps + " равно " + sum);
    Console.WriteLine("Точное значение равно " + Math.Exp(x));
    Console.ReadKey();
}


Пример 1 (запуск с положительным значением икса):


  Введите x.
  
  16
  
  Введите eps.
  
  0,000001
  
  Значение суммы ряда функции exp(x) в точке 16 с точностью 1E-06 равно
  8886110,52050769
  
  Точное значение равно 8886110,52050787


Пример 2 (запуск с отрицательным значением икса):


  Введите x.
  
  -13
  
  Введите eps.
  
  0,1
  
  Значение суммы ряда функции exp(x) в точке -13 с точностью 0,1 равно 
  -0,0251088977651358
  
  Точное значение равно 2,26032940698105E-06

    


Ответы

Ответ 1



Cмотрите. Вы пытаетесь вычислить значение 2.26*10^-6 с точностью 0.1. Естественно, Ваш цикл останавливается гораздо раньше, чем значение приближается к точному. Выводите значения addend и sum на каждой итерации, и Вы увидите, в чем дело. Вы можете задавать не абсолютную, a относительную точность - размер очередного члена ряда относительно текущего значения суммы.

Комментариев нет:

Отправить комментарий