
- •Методические указания по выполнению домашних заданий для студентов 1 курса специальности иу-10.
- •Введение.
- •Домашнее задание 1. Практикум 6. Приближенные вычисления.
- •Задача 6.1.
- •Var a, b, c : real;
- •Iter : longword;
- •Inc(iter);
- •Задания.
- •Задача 6.2.
- •Inc(n); inc(iter);
- •Задания.
- •Практикум 7. Процедурные типы.
- •Задача 7.1.
- •Var a, b, X, dx, y1, y2, s1, s2 : real;
- •Var a, b, X, dx, y1, y2, s1, s2 : real;
- •Inc(iter);
- •Задания.
- •Задача 7.2.
- •Var s1, s2 : real;
- •Задания.
- •Домашнее задание 2. Практикум 13. Типизированные файлы.
- •Задача 13.1.
- •Var I : word;
- •Var I, j : word; buf : tSportMan;
- •If fSort(a[I], a[j]) then
- •Var I : word;
- •Var I : word;
- •Var aHi : Ta; Var nHi : word);
- •Var I : word;
- •Задания.
- •Домашнее задание 3. Практикум 18. Использование объектной технологии для построения движущихся фигур.
- •X, y : real;
- •2*T0.X-border, 2*t0.Y-border);
- •X3, y3 : real;
- •X1, y1, x2, y2, x3, y3 : real;
- •Inherited Init(fx0, fy0, fmx, fcnv);
- •Var t : array[1..3] of tPoint; I : byte;
- •Var t0 : tPoint; tc : trPoint; tri:cTri;
- •0,0, 1,0, 0,1, Tc, clRed);
- •Var I : byte; r, a : real;
- •Var t0 : tPoint; tc : trPoint;
- •0,0, 1,0, 0,1, Tc, clRed);
- •Var I : word;
- •Var dx : real; tr : trPoint; tp: tPoint; I : word;
- •Inherited Init(fx0, fy0, fmx, fcnv);
- •Var dx : real;
- •Var t : array[1..3] of tPoint; tr : trPoint;
- •I : byte;
- •Var dx : real;
- •Var list : cList;
- •Var I : word;
Задача 6.2.
Составить программу вычисления ряда, получающегося при разложении функции f(x)=sin(x) в окрестности точки x=0.
f(x)=x-x3/3!+x5/5!-x7/7!+…
Этап 1. «Бумажный». Выполняется с особой тщательностью без компьютера.
Отделяются все члены ряда слева, относительно которых есть хоть малейшие сомнения в их принадлежности к ряду. У первого члена нет факториала – уже повод для сомнения, отделяем. Здесь принцип «маслом кашу не испортишь». Эти отделяемые члены группируются в слагаемое a0=x.
Оставшиеся члены нумеруются натуральными числами 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 для своего варианта задания.