Laba 2. 9 вар
.doc
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