Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

9. Циклы while и repeat

Предыдущий раздел:

Следующий раздел:

9.5. Вычисления с заданной точностью

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

Например, синус можно разложить в так называемый ряд Тейлора:

  \sin(x)=x-\frac{\displaystyle x^3}{\displaystyle 3!}+\frac{\displaystyle x^5}{\displaystyle 5!}-\frac{\displaystyle x^7}{\displaystyle 7!}+\ldots

Чем большее количество членов ряда будет просуммировано, тем точнее будет вычислен синус. Пусть требуется вычислить до 5-го знака после запятой. То есть приемлемая погрешность \varepsilon =10^{-5}. Для этого достаточно суммировать члены ряда до тех пор, пока очередной член ряда не окажется меньше 10-5.

  eps:=1e-5;
  readln(x);
  p:=x;
  s:=x;
  n:=2;
  while abs(p)>eps do {Условие выхода: очередной член ряда по модулю меньше eps}
  begin
    p:=-p*x*x/(n*(n+1)); {Вычисление очередного члена ряда}
    s:=s+p;
    n:=n+2;
  end;
  writeln('sin(x) = ', s);

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

|x_{n+1}-x_n|<\varepsilon.[/latex]

Также условие можно наложить на относительное изменение:

\left |\frac{\displaystyle x_{n+1}-x_n}{\displaystyle x_n}\right |<\varepsilon.[/latex]

Следующий раздел:

Предыдущий раздел:

9 комментариев

  1. Анна

    Тарас Викторович, в строке «while p<=eps do {Условие выхода: очередной член ряда меньше eps}" ошибка, цикл ни разу не выполнится, там другой знак нужен.

  2. Taras

    Спасибо, исправил.

  3. Илья

    Эту ошибку забыли исправить в книге. Кстати, и на сайте тоже не до конца верный вариант: нужно модуль поставить.

    Кстати, книжку напечатали. Ждём, пока сброшюруют. Обложка будет жёлтого цвета.

  4. Taras

    Снова исправил. Еще одно спасибо :)

    Книжку ждем.

  5. Начинающий паскалист

    Извините, а о какой книге идет речь??

  6. Taras

    Для студентов нашего факультета этот курс издали небольшим тиражом в бумажном виде. Об этом и речь.

  7. Ольга

    прошу заранее извинить за примитивщину, но никак понять не могу: в первом примере в знаменателе факториал, а в алгоритме вычисляется только произведение 2 последних множителей факториала.ошибка? или, простите, туплю?

  8. Taras

    >> …, а в алгоритме вычисляется только произведение 2 последних множителей факториала

    Отнюдь. В знаменателе n*(n+1), причем n на каждом шаге цикла разное (n := n +2;).

  9. Ruslan

    Все таки Ольга права. «…в алгоритме вычисляется только произведение 2 последних множителей факториала».

Добавить комментарий