Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab2(final).doc
Скачиваний:
10
Добавлен:
12.09.2019
Размер:
1.21 Mб
Скачать

Оператор break

Оператор break используется внутри операторов цикла или выбора для перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находится оператор break.

Для примера 3 рассмотрим программу вычисления значения функции ch x (гиперболический косинус) с точностью ε = 10-6 помощью бесконечного ряда Тейлора по формуле:

Этот ряд сходится при |x| < ∞. Для достижения заданной точности требуется суммировать члены ряда, абсолютная величина которых больше ε. Для сходящегося ряда модуль члена ряда Сn при увеличении n стремится к нулю. При некотором n неравенство |Сn| > ε перестает выполняться и вычисления прекращаются.

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

До выполнения программы предсказать, сколько членов ряда потребуется просуммировать, невозможно. В цикле такого рода есть опасность, что он никогда не завершится как из-за возможных ошибок в вычислениях, так и из-за ограниченной области сходимости ряда (данный ряд сходится на всей числовой оси, но существуют ряды Тейлора, которые сходятся только для определенного интервала значений аргумента). Поэтому для надежности программы необходимо предусмотреть аварийный выход из цикла с печатью предупреждающего сообщения по достижении некоторого максимально допустимого количества итераций. Для выхода из цикла применяется оператор break. Прямое вычисление члена ряда по приведенной общей формуле, когда x возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным. Первый недостаток – большая погрешность вычислений. При возведении в степень и вычислении факториала можно получить очень большие числа, при делении которых друг на друга произойдет потеря точности, поскольку количество значащих цифр, хранимых в ячейке памяти, ограничено. Второй недостаток связан с эффективностью вычислений: как легко заметить, при вычислении очередного члена ряда нам уже известен предыдущий, поэтому вычислять каждый член ряда «от печки» нерационально. Для уменьшения количества выполняемых действий следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий:

где T— некоторый множитель. Подставив в эту формулу Сn и Сn+1, получим выражение для вычисления T:

Листинг 2.4 – Вычисление суммы бесконечного ряда

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace lab2

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Пример 3. Вычисление суммы бесконечного ряда");

double e = 1e-6;

const int MaxIter = 500; // ограничитель кол-ва итераций

Console.WriteLine("Введите аргумент:");

string buf = Console.ReadLine();

double x = Convert.ToDouble(buf);

bool done = true; // признак достижения точности

double ch = 1.0, y = ch;

for (int n = 0; Math.Abs(ch) > e; n++)

{

ch *= (x * x / (2 * n + 1) / (2 * n + 2));

y += ch; // добавление члена ряда к сумме

if (n > MaxIter)

{

done = false;

break;

}

}

if (done)

Console.WriteLine("Сумма ряда - " + y);

else

Console.WriteLine("Ряд расходится");

}

}

}

Рисунок 2.4 – Результат выполнения примера 3

Получение суммы бесконечного ряда – пример вычислений, которые принципиально невозможно выполнить точно. В данном случае мы задавали желаемую погрешность вычислений с помощью значения ε. Это значение не может быть меньше, чем самое малое число, представимое с помощью переменной типа double, но при задании такого значения точность результата фактически будет гораздо ниже из-за погрешностей, возникающих при вычислениях. Они связаны с конечностью разрядной сетки.

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

  • погрешность постановки задачи (возникает при упрощении задачи);

  • начальная погрешность (точность представления исходных данных);

  • погрешность метода (при использовании приближенных методов решения задачи);

  • погрешности округления и вычисления (поскольку величины хранятся в ограниченном количестве разрядов).

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

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