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

Laba 2. 9 вар

.doc
Скачиваний:
71
Добавлен:
19.09.2017
Размер:
236.54 Кб
Скачать

7

1. Постановка задачи

1. Вычислить сумму сходящегося ряда с заданной точностью.

2. Найти корень уравнения методом секущих.

2. Решение - часть 1

2.1. Описание алгоритма

Нерационально напрямую вычислять факториал, целесообразно использовать рекуррентное соотношение: n-ый член получается из предыдущего путём смены знака и деления на n. Если требуется найти сумму с точностью eps, следует организовать цикл, на каждой итерации которого выполняются следующие действия (рис. 1):

1) получение n-го члена ряда;

2) корректировка значения суммы;

3) корректировка счётчика членов ряда (переменной n).

На основе представленных алгоритма и блок-схемы разработана программа, код которой приведён в разделе 2.2.

Рис. 1. Блок-схема алгоритма вычисления суммы ряда

2.2. Исходный код программы

using System;

namespace SeriesSum

{

class Program

{

static void Main(string[] args)

{

Console.Write("Введите точность (цифр после запятой): ");

double eps = Convert.ToDouble(Console.ReadLine());

eps = Math.Pow(10.0, -eps);

double n = 1.0, term = -1.0, sum = 0;

do

{

term = -term / n;

Console.WriteLine("{0}-й член ряда: {1}", n, term);

sum += term;

n++;

}

while (Math.Abs(term) > eps);

Console.WriteLine("Приближенное значение суммы = " + sum);

Console.WriteLine("Количество суммированных членов ряда = " + (n - 1));

Console.ReadKey();

}

}

}

2.3. Тестирование

На рис. 2-3 представлены результаты тестирования программы. В первом случае сумма ищется с точностью в 2 цифры после запятой, во втором - с точностью в 4 цифры после запятой. Убедиться, что суммирование идёт корректно, можно, сопоставив сумму с результатами системы Mathcad. Чтобы убедиться, что заданная точность достигается, обратим внимание на следующее.

1. Предпоследний член ряда всегда выше eps, а последний - ниже eps по модулю.

Рис. 2. Тестирование программы для суммирования ряда

Рис. 3. Тестирование программы для суммирования ряда

2. В данном случае можно определить точное значение S бесконечной суммы. Ряд Тейлора для экспоненты:

При x=-1:

В первом тесте две цифры после запятой такие же, как у S, во втором тесте 4 цифры после запятой совпали с S.

3. Решение - часть 2

3.1. Описание алгоритма

Пусть дано уравнение f(x)=0, и требуется найти один из его корней.

Для использования метода секущих требуется задать две начальных точки . Они выступают в роли первых двух приближений в последовательности приближений. Каждое последующее приближение вычисляется через два предыдущих.

Существуют различные варианты выбора условия окончания цикла. Выберем наиболее распространённое: , где eps - требуемая точность.

3.2. Исходный код программы

using System;

namespace Equations

{

class Program

{

static void Main(string[] args)

{

double x0, x1, x2, fx0, fx1, eps, dx;

Console.Write("Введите первую начальную точку (x0): ");

x0 = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите вторую начальную точку (x1): ");

x1 = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите точность (цифр после запятой): ");

eps = Convert.ToDouble(Console.ReadLine());

eps = Math.Pow(10.0, -eps);

int k = 2; do

{

fx0 = x0 - 3.0 * Math.Pow(Math.Cos(x0), 2.0);

fx1 = x1 - 3.0 * Math.Pow(Math.Cos(x1), 2.0);

x2 = x1 - fx1 * (x1 - x0) / (fx1 - fx0);

dx = Math.Abs(x2 - x1);

x0 = x1;

x1 = x2;

Console.WriteLine("Приближение x" + k + " = " + x2);

Console.WriteLine("|x" + k + " - x" + (k - 1) + "| = " + dx);

k++;

}

while (dx > eps && k <= 102);

if (k > 102) Console.WriteLine("Не удаётся достичь требуемой точности");

else

{

Console.WriteLine("Ответ: x = " + x2);

Console.WriteLine("Для проверки: fx = " + (x2 - 3.0 * Math.Pow(Math.Cos(x2), 2.0)));

}

Console.ReadKey();

}

}

}

3.3. Тестирование

Построим графики функций (рис. 4). Корень уравнения - точка их пересечения. В окрестности x=3 корня нет (рис. 5).

Рис. 4. Графическое представление уравнения

Рис. 5. Графики в окрестности x=3