Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические материалы к ДЗ.doc
Скачиваний:
6
Добавлен:
09.02.2015
Размер:
472.06 Кб
Скачать

Задача 6.2.

Составить программу вычисления ряда, получающегося при разложении функции f(x)=sin(x) в окрестности точки x=0.

f(x)=x-x3/3!+x5/5!-x7/7!+…

Этап 1. «Бумажный». Выполняется с особой тщательностью без компьютера.

  1. Отделяются все члены ряда слева, относительно которых есть хоть малейшие сомнения в их принадлежности к ряду. У первого члена нет факториала – уже повод для сомнения, отделяем. Здесь принцип «маслом кашу не испортишь». Эти отделяемые члены группируются в слагаемое a0=x.

  2. Оставшиеся члены нумеруются натуральными числами 1, 2, 3…

f(x)=x - x3/3! + x5/5! - x7/7!+…

n -> 1 2 3 …

3. Подбором находится формула для n–го члена ряда. В нашем случае

an=(-1)nx2*n+1/(2*n+1)!

Полученную формулу следует обязательно проверить на двух – трех членах ряда.

4. Самое трудное действие – определение знаменателя ряда. В числитель подставляется формула для n+1-го члена ряда, а в знаменатель – для n–го члена ряда.

rn=an+1/an=[ (-1)n+1x2*n+3/(2*n+3)!] / [ (-1)nx2*n+1/(2*n+1)!]

После сокращения степеней остаются факториалы

rn=-x2(2*n+1)!/(2*n+3)!

Чтобы упростить это выражение, необходимо больший факториал выразить через меньший. По определению факториала, путем записи в «обратную» сторону

(2*n+3)!=(2*n+3) (2*n+2)[ (2*n+1) (2*n+0) (2*n-1)…]

Сомножители в квадратных скобках есть ни что иное, как меньший факториал (2*n+1)!. Итак, окончательно (обратите внимание на общие скобки знаменателя)

rn=-x2/((2*n+3)*(2*n+2)).

Все! Можно включать компьютер.

Этап 2. Использование рекуррентной формулы предполагает, что существует некоторое начальное состояние ряда, от которого и будут «развиваться события». Естественно выбрать в качестве такого состояния, ряд при n=1, в котором есть только два слагаемых a0 и an= -x3/6 , а его сумма равна s=a0 + an. Все дальнейшие действия выполняются в итерационном цикле по точности. Для заданного n вычисляется знаменатель ряда rn, затем по рекуррентной формуле определяется следующий член ряда an+1, накапливается новая сумма членов ряда и n увеличивается на единицу. Фрагмент программы, реализующий этот алгоритм, представлен на листинге ниже.

Листинг 6.2. Фрагмент программы. Предельное число итераций NIterMax и точность eps должны быть заданы.

iter:=0; // Счетчик итераций

x:=0.5*3.14159; // Аргумент (параметр)

n:=1; a0:=x; an:=-x*x*x/6; s:=a0+an; // Настройка

repeat

r:=-x*x/((2*n+3)*(2*n+2));

an:=r*an; s:=s+an;

Inc(n); inc(iter);

if abs(an)<eps then break;

until iter>NIterMax;

writeln(' iter=', iter);

writeln(' s=', s:7:5);

Этап 3. Самостоятельная работа. Представленный выше алгоритм является лишь заготовкой. Его необходимо оформить в виде функции с интерфейсом

Function R(x : real; eps : real) : real;

где R сумма членов ряда, вычисленная при аргументе x с точностью eps.

Задания.

С использованием функции, оформленной в соответствии с требованиями этапа 3 предыдущей задачи, составить программу вычисления суммы членов ряда с точностью 0.0001 для своего варианта задания.