- •Алгоритмические языки и программирование итерационные методы решения задач
- •Брянск 2007
- •2.3. Решение нелинейных уравнений
- •2.3.1. Метод половинного деления
- •2.3.2. Метод Ньютона (метод касательных)
- •2.3.3. Модифицированный метод Ньютона (метод хорд)
- •Порядок выполнения работы
- •3.1. Примеры выполнения программ
- •Список заданий
- •4.1. Список заданий на вычисление суммы сходящегося ряда
- •4.2. Список заданий на нахождение корней уравнений
- •Контрольные вопросы
- •Список рекомендуемой литературы
2.3.3. Модифицированный метод Ньютона (метод хорд)
Этот метод лишь немного отличается от метода касательных и обладает меньшей скоростью сходимости. Здесь значение производной вычисляется всего один раз в точке первого приближения и больше не изменяется. Следовательно, её вычисление будет стоять до оператора цикла. Общая формула вычисления последующего приближения будет выглядеть так: xn+1 = xn .
-
Порядок выполнения работы
Для выполнения лабораторной работы необходимо первоначально ознакомиться с теоретической частью. Затем выполнить два задания: вычисление суммы сходящегося ряда и нахождение корня уравнения заданным методом. Для каждого задания необходимо представить алгоритм решения задачи с помощью блок-схемы.
Для нахождения корня уравнения во втором задании необходимо первоначально проанализировать функцию с целью правильного задания исходных данных.
3.1. Примеры выполнения программ
Вычисление суммы сходящегося ряда с заданной точностью
Var {раздел объявления переменных}
n: integer; {переменная сходящегося ряда}
term, summa, precision: real; {переменные, означающие соответственно член ряда, сумма ряда, точность вычисления}
BEGIN {начало тела программы}
Writeln('Данная программа вычисляет сумму сходящегося ряда с за данной точностью, каждый член ряда вычисляется по формуле term=1/n'); {оператор вывода, который описывает назначение программы}
Writeln('Введите точность вычисления');
Readln(precision); {ожидание ввода с клавиатуры, введенное значение запишется в переменную precision}
summa:=0; {для того чтобы накапливать сумму в переменной summa, ее необходимо обнулить, так как при выделении памяти в ней может быть любое значение соответствующего типа}
n:=1; {присваиваем первоначальное значение до входа в цикл согласно заданию}
Repeat
term:=1/n; {вычисление текущего значения члена ряда}
summa:=summa+term; {накопление суммы, к предыдущему значению суммы прибавляется текущее значение}
n:=n+1; {к предыдущему значению переменной «n» прибавляем единицу согласно условию задачи}
Until term<=precision; {цикл выполняется до тех пор, пока текущее значение члена ряда не станет меньшим либо равным точности вычисления}
Writeln('Сумма сходящегося ряда с заданной точностью=', summa: 5: 2); {вывод результата с использованием форматирования}
Writeln('Количество членов ряда=', n);
END. {конец программы}
Пример программы, вычисляющей корень уравнения y=x2-5 методом половинного деления
Uses Crt; {подключаем модуль Crt для того, чтобы воспользоваться процедурой очистки экрана ClrScr;}
Var c, Fc, Fb: double;
a, b, e: real;
BEGIN
ClrScr; {очистка экрана}
Writeln(‘Данная программа находит корень уравнения методом половинного деления y=x2-5’);
Writeln(‘Введите значения концов отрезка, на котором имеется один корень, а также точность вычисления’);
Readln(a,b,e);
{цикл выполняется до тех пор, пока разность концов отрезка по модулю будет больше точности вычисления}
While (abs(b-a)>e) Do
Begin
if (keypressed) then halt; {данная строка обозначает, что при нажатии любой клавиши произойдет выход из программы, это нужно для избегания зацикливания, если начальные данные заданны не верно}
c:=(a+b)/2; {находим середину отрезка}
Fc:=sqr(c)-5; {вычисляем значение функции в новой точке “c”}
Fb:=sqr(b)-5; {вычисляем значение функции в точке “b”}
{если произведение значений функций в точках ‘c’ и ’b’ имеют разные знаки, то на этом промежутке находится корень уравнения}
if (Fc*Fb)>0 then b:=c else a:=c;
End; {окончание цикла while}
Writeln('Корень=', c: 6: 5); {вывод результата}
Readln; {задержка для просмотра результата}
END.
Пример программы, вычисляющей корень уравнения y=x2-5 методом касательных
Uses Crt;
Var F, F_, xLast, e, x: double;
BEGIN
ClrScr;
Writeln(‘Данная программа находит корень уравнения методом касательных y=x2-5’);
Writeln(‘Введите значение аргумента первоначального приближения’);
Readln(x);
Writeln(‘Введите значение точности’);
Readln(e);
Repeat
if (keypressed) then halt;
F:=x*x-5; {подсчет значения функции}
F_:=2*x; {подсчет значения производной функции}
xLast:=x; {сохранение предыдущего значения}
x:=xLast - F/F_; {подсчет текущего значения}
Until (abs(xLast-x)<e);
Writeln('Корень=', x: 5: 4);
Readln;
END.