Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 Вычислительная математика практика 01-03.pdf
Скачиваний:
16
Добавлен:
05.06.2015
Размер:
390.2 Кб
Скачать

В соответствии с этим функция должна содержать следующие инструкции:

-если значение признака успешного завершения алгоритма достигло максимально возможного, то функция возвращает текущее или нулевое значение X (счетчик итераций при этом должен инкрементироваться);

-алгоритм вычисляет новое приближение решения X;

-если достигнута заданная точность eps, функция возвращает X, иначе функция возвращает результат вызова самой себя, при этом в качестве начального значения приближения используется X.

После описания данного алгоритма его следует тщательно оттрассировать (исполнить пошагово). Следует анализировать выполнение алгоритма

вкаждой его точке с тем, чтобы понять, как он работает.

Варианты решаемых функций

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

Практическое задание №3. Метод Ньютона

Краткое описание задания: задано некоторое число a. задана решаемая функция вида f(x) = 0. Методом Ньютона найти её решение с заданной точностью ε.

Методические указания

1.Программа ничего не принимает с клавиатуры. Все исходные данные задаются в коде программы, как правило, в основном модуле, во время вызова функции метода (внутри функции main).

2.Программа решает задачу двумя способами:

а) с помощью итераций; б) с помощью рекурсии.

3.Название модуля (файла типа .h) для функции метода mnewton.

4.Название функции метода newton.

5.Сигнатура (прототип) функции метода имеет следующий вид:

double newtonN(pef ef, pef ef1, double X0, double eps, int* success);

Здесь:

- N — номер способа (1 или 2);

18

-ef — решаемая функция;

-ef1 — функция производной решаемой функции;

-X0 — начальное (приближенное) значение;

-eps — заданная точность решения;

-success — возвращаемый признак успешного выполнения алгоритма.

-возвращаемое значение функции метода — результат вычисления аргумента x решаемой функции, при котором решаемая функция равна аргументу с заданной точностью eps.

6. Тип решаемой функции и функции производной решаемой функции задается следующим описанием:

typedef double (*pef)(double);

Это описание уже должно быть выполнено в модуле mhalfint.

7. Решаемая функция описывается в основном модуле следующим образом:

// Решаемая функция для метода Ньютона double nt(double x) {

/* код функции */

}

Функция производной для решаемой функции описывается ниже примерно так же:

// Функция производной для метода Ньютона double nt1(double x) {

/* код функции */

}

8. Функция метода вызывается в основной функции.

После вызова выводятся три строчки результата, например:

SUCCESS=4

EPSILON=0.000001

RESULT1=1.843734

Здесь:

SUCCESS — успешность выполнение алгоритма (значение success); EPSILON — заданная точность вычисления (значение EPS); RESULT1 — результат вычислений способом 1, вывод должен соот-

ветствовать заданной точности.

Порядок выполнения задания

1. Сначала выполните действие 1, описанное выше в разделе «Общий порядок выполнения очередного (не первого) задания».

19

2.Добавьте в решение новый модуль типа .h (заголовочный) с названием mnewton. Процесс добавления нового модуля описан в практическом задании №1.

3.Добавьте в новый модуль файловый комментарий, например:

/* Файл mnewton.h

*/

/* ОТИ НИЯУ МИФИ

*/

/* 1ПО-XXД

*/

/* Пономарев Владимир Вадимович

*/

/* Вычислительная математика

*/

/* Программа VM1

*/

/* Метод Ньютона

*/

/* 27.02.2013

*/

4.Основной модуль. Добавьте описание решаемой функции nt:

//Решаемая функция для метода Ньютона

double nt(double x) { return (x);

}

Ниже добавьте описание функции производной nt1:

// Функция производной для метода Ньютона double nt1(double x) {

return (x);

}

Название функции nt1 заканчивается единицей (типа производная функции nt первого порядка).

Для начала будем вычислять решение уравнения x3 + 2x2 + 3x + 5 = 0

с точностью 0.000001. Оно равно 1.843734. Опишите левую часть уравнения в функции nt.

Вычислите производную и опишите ее в функции производной nt1.

5.Измените значение константы EPS на 0.000001. Соответственно измените спецификации вывода значений результатов в функции printr.

6.Модуль mnewton. Добавим в модуль функцию метода для решения задания способом 1, например:

//Метод Ньютона, способ 1

double newton1(pef ef, pef ef1, double X0, double eps, int* success) {

*success = 0; double X = 0.0; return X;

}

20

Здесь устанавливается начальное значение признака успешного завершения алгоритма success, определяется переменная для результата X и возвращается значение результата.

7.Основной модуль. В основной функции следует закомментировать вызовы и выводы результатов предыдущего задания и описать вызов функции newton1 и вывод ее результатов. Начальным приближением для указанной функции является значение –2.

8.Функция метода newton1. Опишите алгоритм для метода Ньютона. Структура алгоритма для метода Ньютона аналогична структуре алго-

ритма для метода простых итераций. Рекомендуется описать переменную g для значения решаемой функции и переменную g1 для значения производной от решаемой функции. Обе переменные должны иметь тип double.

Далее опишите бесконечный цикл, например, при помощи while (1). Внутри цикла:

а) подсчитайте очередную итерацию; б) проверьте значение счетчика итераций и при превышении его мак-

симального значения прервите цикл;

в) вычислите значение g решаемой функции с аргументом X0; г) вычислите значение g1 производной решаемой функции от X0;

д) вычислите значение X для нового приближения, используя формулу для метода Ньютона:

x = x0 g / g1

е) проверьте условие завершения: если абсолютное значение разности нового и начального значений меньше заданной точности, следует прервать выполнение цикла;

ж) присвойте начальному значению X0 вычисленное значение X.

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

10.В модуле mnewton.h опишите функцию для решения способом 2:

// Метод Ньютона, способ 2

double newton2(pef ef, pef ef1, double X0, double eps, int* success) {

double X = 0.0; return X;

}

Поскольку второй способ использует рекурсию, нельзя обнулять пара- метр-признак успешного выполнения алгоритма success.

21