Автор: Пользователь скрыл имя, 22 Декабря 2011 в 20:19, курс лекций
Под табуляцией функции понимается вычисление значений функции в зависимости от аргумента, который меняется в определенных пределах с постоянным шагом. Решение задачи табуляции является достаточно характерным примером реализации циклического алгоритма.
1. Табуляция функции 4
1.1. Практические задания 6
2. Методы нахождения корней уравнений 8
2.1. Метод половинного деления 8
2.2. Итерационные методы 10
2.3. Практические задания 15
3. Вычисление определенного интеграла 16
3.1. Практические задания 19
4. Вычисление конечных сумм 20
4.1. Практические задания 24
5. Индексированные переменные 26
5.1. Одномерный массив 26
5.2. Практические задания 30
5.3. Двумерный массив 32
5.4. Практические задания 38
6. Решение системы линейных алгебраических
уравнений методом Гаусса 41
6.1. Практические задания 44
Литература 46
I » S = [0,5×(f(a) + f(b)) + f(a + Dx) + f(a + 2×Dx) +…+ f(a + (n - 1) ×Dx)]×Dx .
Проводя через три следующих подряд значения функции параболу, можно приближённо представить интеграл I как сумму площадей параболических трапеций:
I » S = [(f(a) + f(b) + 4(f(a + Dx) + 2(f(a + 2×Dx) + 4(f(a + 3×Dx) + …
+ 4(f(a + (n - 1)×Dx)]×Dx / 3 =
где:
Количество разбиений n обязательно должно быть чётным, поскольку число параболических трапеций в 2 раза меньше.
Вычисление интеграла с заданной точностью здесь основано на том, что формально точность должна возрастать с увеличением числа разбиений n интервала интегрирования. Пусть Sn – значение интеграла, полученное при разбиении интервала интегрирования на n частей, и S2n – значение, вычисленное при удвоенном числе разбиений. Тогда можно использовать следующие критерии достижения заданной точности e:
| S2n – Sn| < e при S2n < 1 и |(S2n – Sn) / S2n | < e при S2n ³ 1.
На рис. 3.2 приведён алгоритм численного решения интеграла с заданной точностью. Непосредственное нахождение значения интеграла по какому-либо из предложенных выше методов предлагается оформить в виде подпрограммы.
Рис. 3.2. Структурограмма алгоритма решения определённого интеграла
№ | Подынтегральная функция | Пределы интегрирования |
1 | 0; 1 | |
2 | cos x2 | 0; 1 |
3 | ex × sin x | 0; p |
4 | x × arctg x | 0; Ö3 |
5 | (x2 - 1) ×10-2x | 0; 1 |
6 | 0,1; 2 | |
7 | x2 × (1 - x)2 | 0; 1 |
8 | x3 × e2x | 0; 1 |
9 | 0; p/2 | |
10 | x × ln (1 + x) | 0; 0,5 |
11 | cos3x × sin2x | 0; p/3 |
12 | 0; 1 | |
13 | x × cos x | 0; p |
14 | x × ln (1 + x3) | 0; 0,5 |
15 | cos2 6x | 0; p/2 |
16 | 0; 0,5 | |
17 | 0; 1 | |
18 | x × sin x2 | 0; 1 |
19 | arctg x2 | 0; 0,5 |
20 | 0; p |
Часто для вычисления значений некоторой функции используют разложение этой функции в бесконечный ряд. Так, например, функцию у = e x можно представить в виде ряда Маклорена:
где - общий член ряда, а Rn - остаточный член ряда. Так как ряд сходится, т.е. остаточный член при увеличении значения n стремится к нулю, то функцию у = ex можно аппроксимировать конечной суммой вида:
где e - заранее заданная точность аппроксимации.
Вычисление конечных сумм для различных значений аргумента функции х и для различного количества членов ряда n представляет собой задачу с двумя вложенными циклами. Внутренний цикл - вычисление суммы n членов ряда для фиксированного значения х; внешний цикл - изменение аргумента х в заданном интервале.
Алгоритм вычисления конечной суммы зависит от вида общего члена ряда.
требуют вычисления факториала и возведения аргумента в степени высоких порядков для каждого члена ряда. Прямое использование формулы общего члена ряда приводит к увеличению объема вычислительной работы и, при больших n, к уменьшению точности.
В этих случаях для вычисления очередного члена суммы используют рекуррентные соотношения, т.е. выражают последующий член ряда через предыдущий. Например, необходимо вычислить сумму 20 членов ряда:
где аргумент х изменяется в интервале [0;1] с шагом 0,1.
а) у = 3х б)
Рис. 4.1. Блок-схемы вычислений сумм двух рядов различного типа
Эта
сумма является частичной суммой
ряда для функции у = 3х.
Составим рекуррентную формулу, основываясь
на формулах n-го и n+1-го членов
ряда:
то есть .
Полагая аn = 1 при n = 0, по этой формуле можно определить все члены ряда, исключая первый.
Суммирование проводится методом накопления. Присвоим переменной S начальное значение, равное первому члену суммы, в данном случае S = 1. Затем, вычисляя очередные члены ряда по рекуррентной формуле, прибавляем каждое из этих значений к накопителю: S = S + an. При составлении алгоритма (рис. 4.1(а)) учтем, что нам необходимо вычислить 19 следующих членов ряда, так как мы начали накопление с первого члена.
Параллельно, для контроля правильности алгоритма, вычисляем и значение исходной функции у = 3х.
В качестве примера рассмотрим нахождение частичной суммы разложения в ряд функции:
Для
рядов подобного типа нецелесообразно
прибегать к
составлению рекуррентных формул. Каждый
очередной член
определяется подстановкой значения
n в формулу общего члена. Так,
при n = 1 запишем a1 = -cos(x),
при n = 2 получаем
и т.д.
Составим алгоритм вычисления суммы этого знакопеременного ряда. Пусть количество слагаемых n = 30, диапазон изменения аргумента 0,l ≤ x ≤ l и его шаг Dx = 0,1. Положим S = 0, n = 1, C = -1 и вычислим первый член суммы по формуле общего члена ряда. Изменив знак С на обратный, в следующем выполнении цикла имеем второй член суммы и т. д. Полностью алгоритм нахождения суммы рассматриваемого ряда приведён на рис. 4.1(б).
В подобных рядах целесообразно для сомножителей, содержащих степени высших порядков и факториалы, составлять рекуррентные соотношения, а остальные сомножители вычислять непосредственной подстановкой значения n. В качестве примера рассмотрим вычисление значений ряда
для n = 30, 0,l ≤ x ≤ l, Dx = 0,1. Сумма членов этого ряда является частичной суммой разложения функции . Для каждого члена ряда сомножители (-1)n+1 и х2n+1 будем вычислять рекуррентно, а 1/(4n2-1) непосредственно. Ниже приведён листинг программы решения этой задачи.
#include <stdio.h>
#include <math.h>
int main()
{
double x,a,S,y;
int n;
for (x=0.1; x<=1; x+=0.1)
{
a=-x;
S=0;
for (n=1;n<=30;n++)
{
a=-a*x*x;
S=S+a/(4*n*n-1);
}
y=0.5*((x*x+1)*atan(x)
printf("x=%3.1f S=%8.5f y=%8.5f \n",x,S,y);
};
getchar(); /* ожидание нажатия клавиши пользователем */
return 0;
}
Так как алгоритмы вычисления конечных сумм очень индивидуальны, рекомендуется составленную программу проверить подстановкой для первых двух-трех членов суммы. Для контроля правильности составления алгоритма в наших задачах параллельно с вычислением суммы значение функции определяется и непосредственно.
а) Решить задачу вычисления конечной суммы ряда для заданного числа n при изменении аргумента х в заданном диапазоне, количество шагов изменения х равно 10,
б)
Определить число членов конечной суммы
n, позволяющее аппроксимировать функцию
с заданной точностью e (например, e = 10-5), исходя из критерия
.
№ |
Сумма |
Диапазон
изменения аргумента |
n |
Функция y(х) |
1 | 0,l ÷l | 10 | sin(x) | |
2 | 0,l ÷l | 15 | cos(x + 0,8) | |
3 | l ÷2 | 15 | ex | |
4 | 0,l ÷0,8 | 50 | ||
5 | 0,l4÷0,5 | 40 | arctg(x) | |
6 | 0,l÷l | 20 | ecos(x) ×cos(sin(x)) | |
7 | 0,0l÷l | 10 | ||
8 | 0,l ÷l | 10 | 2×cos2(x - 1) | |
9 | 0,2÷l | 20 | ||
10 | 0,l ÷l | 10 | cos(x) | |
11 | 0,l ÷l | 15 | e3x | |
12 | 0,1 ÷l | 10 | sin(x+0,5) | |
13 | 0,l ÷l | 10 | ex×ln5 | |
14 | 0,75÷2 | 15 | ln(x) | |
15 | 0,l ÷l | 10 | ||
16 | 0,l ÷0,9 | 60 | ln(1 - x) | |
17 | 0,l ÷0,9 | 35 | ||
18 | l ÷3 | 10 | ch(x) | |
19 | 0,l ÷ 1 | 10 | ||
20 | l ÷3 | 20 | sh(x) |