- •Методические указания по выполнению домашних заданий для студентов 1 курса специальности иу-10.
- •Введение.
- •Домашнее задание 1. Практикум 6. Приближенные вычисления.
- •Задача 6.1.
- •Var a, b, c : real;
- •Iter : longword;
- •Inc(iter);
- •Задания.
- •Inc(n); inc(iter);
- •Задания.
- •Задача 6.2.
- •Практикум 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;
Var a, b, c : real;
Iter : longword;
BEGIN
a:=0.001; b:=1.0; iter:=0;
repeat
c:=0.5*(a+b);
if y(a)*y(c)<0 then b:=c else a:=c;
if abs(y(c))<0.0001 then break;
Inc(iter);
until iter>1000;
writeln(' iter=', iter);
writeln(' c=',c:7:5,' y(c)=', y(c):7:5);
readln;
END.
Этап 3. Самостоятельная работа. Представленный выше алгоритм является достаточно сырым для практического использования, поэтому следует оформить его в виде функций с интерфейсом для метода половинного деления и метода хорд1 соответственно
Function Xd(a, b : real; eps : real) : real;
Function Xh(a, b : real; eps : real) : real;
где Xd – приближенное значение корня в методе половинного деления, Xh – приближенное значение корня в методе хорд; a, b – диапазон поиска; eps – точность. Условием прекращения итераций считать выполнение неравенства abs(b-a)<eps или превышение заданного числа итераций (задать константой const iterMax=1000;).
Задания.
С использованием функций Xd и Xh составить программу нахождения всех корней нелинейного уравнения y(x)=0 в заданном интервале методом половинного деления и методом хорд с точностью eps=0.0001. Вывести значение корня и значение функции при данном корне.
Указание. Уравнение может иметь несколько корней в заданном интервале, поэтому для правильного определения количества корней и локализации диапазона поиска корня a,b целесообразно вначале построить график функции y(x). Поиск корней сразу на всем интервале обычно приводит к ошибочным результатам.
Вариант Функция y(x) Интервал
y(x)= sin(2*x)-0.2*x; [0; 5]
y(x)= cos(2*x)-0.2*x; [0; 5]
y(x)= sin(x)-(4-0.5*(x*x-2)); [-5; 5]
y(x)= cos(x)-(4-0.5*(x*x-2)); [-5; 5]
y(x)= 7.37*cos(x)-1/x; [0.1; 2]
y(x)= 3.37*sin(x)-1/x; [0.2; 2]
y(x)= sin(x)-(((x-1)*x+1)*x-1); [-2; 2]
y(x)= cos(x)-(((x-1)*x+1)*x-1); [-2; 2]
y(x)= exp(-sqr(x-4))-0.2*x; [2; 5]
y(x)= exp(-sqr(x-4))-cos(x); [4; 12]
y(x)= exp(-sqr(x-4))-sin(x); [0; 5]
y(x)= 5*exp(-sqr(x-4))-(arctan(x-3)+2); [0; 5]
y(x)= 2.73*sin(x)-(arctan(x-3)+2); [0; 5]
y(x)= x-0.5*x*x-arctan(x-3); [-5; 5]
y(x)= 0.2*x - sin(2*x); [0; 5]
y(x)= 0.2*x - cos(2*x); [0; 5]
y(x)= 4-0.5*(x*x-2) - sin(x); [-5 ; 5]
y(x)= 4-0.5*(x*x-2) - cos(x); [-5 ; 5]
y(x)= 1/x - 7.33*cos(x); [0.1; 2]
y(x)= 1/x - 3.37*sin(x); [0.2; 2]
y(x)= (((x-1)*x+1)*x-1) - sin(x); [-2; 2]
y(x)= (((x-1)*x+1)*x-1) - cos(x); [-2; 2]
y(x)= 0.2*x - exp(-sqr(x-4)); [2; 5]
y(x)= cos(x)- exp(-sqr(x-4)); [4; 12]
y(x)= sin(x)- exp(-sqr(x-4)); [0; 5]
y(x)= arctan(x-3)+2 - 5*exp(-sqr(x-4)); [0; 5]
y(x)= arctan(x-3)+2 - 2.73*sin(x); [0; 5]
y(x)= arctan(x-3)-(x-0.5*x*x); [-5; 5]
Вычисление суммы степенного ряда.
Математические основы и алгоритм решения этой задачи подробно рассмотрены в учебно-методическом пособии [2], поэтому ниже приведены лишь основные моменты.
Из курса математики известно, что любую функцию f(x), имеющую в окрестности точки x0 бесконечное число производных, можно разложить в окрестности этой точки в бесконечный степенной ряд с любой, наперед заданной точностью. Аналитическое выражение такого ряда называется формулой Тейлора. В частном случае, при x0=0, формула Тейлора называется также формулой Маклорена (MacLaurin).
f(x)=f(0)+f’(0)*x/1!+f”(0)*x2/2!+…f(n)(0)*xn/n!+…
Естественно, количество членов ряда, удерживаемых при разложении, будет зависеть от точности. Иначе говоря, точность нужна для определения количества членов ряда при разложении. Во избежание путаницы, всегда будем нумеровать члены ряда, содержащие члены с xn/n! натуральными числами 1, 2, 3…, а члену f(0) присвоим номер 0, т.е.
f(x)=a0+a1+a2+a3…an-1+an+an+1+…
Нетрудно заметить, что у таких рядов отношение rn=an+1/an, не содержит функции факториала и достаточно легко может быть вычислено. Таким образом, если известен текущий член ряда an и имеется формула, позволяющая определить rn, то следующий член ряда может быть найден по рекуррентной формуле an+1=rn * an. Первый член ряда всегда известен, по нему можно найти второй, по второму третий и т.д. Осталось все это просуммировать и добавить a0.
Из теории степенных рядов известны несколько оценок точности. Мы будем пользоваться следующей оценкой: точность считается достигнутой при выполнении условия |an+1 |<eps, где eps наперед заданное малое число.
Таким образом, алгоритм программирования ряда включает в себя «бумажный» этап и собственно программирование. От того насколько успешно, а главное ясно и понятно выполнены выкладки на бумаге, зависит конечный результат.
