Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алг яз Лаб 3(I-ИСТ).doc
Скачиваний:
4
Добавлен:
05.11.2018
Размер:
327.17 Кб
Скачать

2.3.3. Модифицированный метод Ньютона (метод хорд)

Этот метод лишь немного отличается от метода касательных и обладает меньшей скоростью сходимости. Здесь значение производной вычисляется всего один раз в точке первого приближения и больше не изменяется. Следовательно, её вычисление будет стоять до оператора цикла. Общая формула вычисления последующего приближения будет выглядеть так: xn+1 = xn.

  1. Порядок выполнения работы

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

Для нахождения корня уравнения во втором задании необходимо первоначально проанализировать функцию с целью правильного задания исходных данных.

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.