- •Учебное пособие
- •Введение
- •Глава 1. Прикладные математические задачи
- •1.1. Вычисление математических функций
- •1.2. Создание программного модуля, объединяющего математические функции
- •1.3. Решение системы линейных алгебраических уравнений
- •1.4. Построение таблицы функции
- •Глава 2. Задачи вычислительной математики
- •2.1. Решение нелинейного уравнения
- •2.2. Численное дифференцирование
- •2.3. Численное интегрирование
- •2.4. Решение дифференциального уравнения
- •2.5. Аппроксимация функции
- •2.6. Интерполяция функции
- •Глава 3. Задачи математической статистики
- •3.1. Вычисление основных статистических величин
- •3.2. Создание программного статистического модуля
- •4. Построение графиков функций и создание диаграмм
- •4.1. Инициализация графического режима
- •4.2. Использование графических примитивов
- •4.3. Создание двумерной диаграммы
- •4.4. Построение графика функции
- •4.5. Создание трехмерной диаграммы
- •Библиографический список
вывод полученного значения корня. Так как корней несколько, то предусматривается неоднократное выполнение программы с различными начальными приближениями, для чего в программе использован цикл с постусловием.
На рис. 2.2. показаны результаты работы программы newton
Рис. 2.2. Результаты работы программы решения нелинейного уравнения методом Ньютона
Последовательно вводя различные начальные приближения, можно найти все три корня данного нелинейного уравнения, что и продемонстрировано на рис.2.2.
2.2. Численное дифференцирование
Согласно определению, производная некоторой функции y=f(x) в
точке x0 является пределом отношения приращения функции к приращению ее аргумента при стремлении приращения аргумента к нулю:
y ' (x0 ) = f ' (x0 ) = lim |
y , |
|
|
(2.4) |
|
|
|
|
x→0 |
x |
|
|
|
|
|
где |
x = x − x0 , y = f (x0 + x) − f (x0 ) . |
|
|
||||
Алгоритм вычисления производной по |
ее определению сводится к |
||||||
следующему: |
последовательно |
вычисляют |
величину |
∆y/∆x |
с |
||
последовательным уменьшением |
величины |
|
∆x. Это |
уменьшение |
35
производится до тех пор, пока разность между последними двумя вычисленными значениями частного не станет меньше некоторой заданной величины ε (точности вычислений). Последнее полученное частное и принимают в качестве искомой величины производной.
Рассмотрим программу вычисления производной с заданной точностью
по ее определению на примере вычисления функции y = x3. Текст программы приведен ниже.
program proizvod; Uses Crt;
const
var
k=10;
dx,dy1,dy2,e,ekon,x:real; function dy(iks,diks:real):real; begin
iks*iks*iks)/diks dy:=((iks+diks)*(iks+diks)*(iks+diks)-
end; begin
ClrScr;
writeln('Программа вычисления производной функции
у=x*x*x');
writeln('Введите значение x'); readln(x);
writeln('Введите требуемую точность вычислений'); readln(ekon);
dx:=0.0001;
dy1:=dy(x,dx); repeat
dx:=dx/k;
dy2:=dy(x,dx); e:=dy2-dy1; dy1:=dy2
until e<ekon;
writeln('Производная функции равна ',dy2:9:3); readln
end.
В данной программе ее основная часть начинается с ввода двух исходных значений – величины аргумента x, для которого вычисляется
производная, и требуемой точности вычислений ekon (эта величина равна ε
- разнице между двумя последними результатами вычислений). Затем задается начальное значение шага изменения аргумента dx (чем меньше
будет этот начальный шаг, тем точнее будет полученный результат). Далее
36
производится вычисление отношения изменения значения функции y = x3 к изменению значения ее аргумента.
Это значение, обозначенное в программе как dy1, вычисляется с помощью созданной в программе функции dy. Вычисление отношения в
функции производится следующим образом. Вначале вычисляются значения для аргумента iks и для аргумента iks+diks и
определяется их разность. Затем полученная разность делится на разность аргументов – величину diks. При обращении к функции из основной части
программы формальные параметры iks и diks заменяются на фактические параметры x и dx.
Дальнейшие вычисления в программе производятся в цикле с постусловием. В теле цикла производятся следующие действия. Вначале шаг изменения аргумента уменьшается в k раз. Величина уменьшения аргумента
в программе — величина постоянная и берется равной 10. Затем для нового значения шага dx c помощью функции dy вычисляется соответствующее
значение отношения изменения функции к заданному шагу изменения аргумента. Эта величина обозначается переменной dy2. Затем вычисляется e
- разность между двумя полученными значениями отношений. В последнем операторе переменной dy1 присваивается новое значение dy2, то есть
последнее вычисленное значение отношения. При каждом последующем выполнении цикла будет находиться новое значение отношения для нового, уменьшенного еще в 10 раз, значения шага изменения аргумента и находиться разность между двумя последними вычисленными значениями отношения. Условием завершения работы цикла является выполнение неравенства, согласно которому величина разности e должна быть меньше, чем заданное пользователем значение ekon.
Последнее найденное в цикле значение dx2 и будет искомой
величиной, которая выводится на экран компьютера с помощью оператора writeln. Результат работы программы для x, равного 5, приведен на
рис. 2.3.
37
Рис. 2.3. Результаты работы программы вычисления производной функции y = x3
2.3. Численное интегрирование
Приближенное вычисление значения определенного интеграла
bпроизводится следующим образом: участок от a до b разбивается
òf (x)dx
a
на n равных по величине отрезков. Длина каждого отрезка h = (b-a)/n.
Значения аргумента в точках разбиения будут соответственно равны: x0=a, x1=a+h, …,xi= x0+ih, …, xn=b. Значения функции f(x) в точках xi будут
соответственно обозначаться yi. Тогда согласно, например, формуле трапеций определенный интеграл можно будет вычислить следующим образом:
b |
|
|
|
|
y0 + yn |
|
|
|
ò f (x)dx ≈ h( |
+ y1 |
+... yi +... + yn ) |
|
|||||
2 |
(2.5) |
|||||||
a |
|
|
|
|
|
|
|
|
Программа, реализующая вычисление определенного интеграла |
||||||||
функции y = |
|
|
1 |
|
по методу трапеций, приведена ниже. |
|
||
1 |
+ x |
|
||||||
|
|
|
|
|
||||
program trapecia; |
|
|
|
|||||
Uses Crt; |
|
|
|
|
|
|
|
|
var |
|
|
|
|
|
|
a,b,h,s,x,yn,yk,yp:real; |
|
i,n:integer; |
|
|||||||
begin |
|
|
|
|
|
|
|
|
ClrScr; |
|
|
|
|
|
|
|
|
writeln('Программа вычисления определенного интеграла для функции 1/(1+x)');
writeln('Введите начальный и конечный пределы интегрирования');
readln(a); readln(b);
writeln('Введите число отрезков, на которые будет разбит');
writeln('участок интегрирования'); readln(n);
h:=(b-a)/n; yp:=0; x:=a;
for i:=1 to n-1 do begin
x:=x+h;
38
yp:=yp+1/(1+x)
end;
yn:=1/(1+a);
YK:=1/(1+B);
s:=((yk+yn)/2+yp)*h;
writeln('Приближенное значение интеграла равно',s:9:3);
readln end.
В начале основной части данной программы пользователь должен
ввести с клавиатуры значения пределов интегрирования a и b и величину n – количество участков, на которые будет разбит промежуток интегрирования. Последнюю величину рекомендуется брать достаточно большой, так как чем больше число участков, тем точнее будет полученный результат. Затем
вычисляется величина h – длина участка, на которые разбивается отрезок. Далее в программе определяется сумма промежуточных значений
функции y, то есть сумма всех значений функции в точках xi , кроме первого и последнего. Эта величина обозначается в программе yp. Начальное ее
значение берется равным нулю, а итоговое значение этой величины вычисляется в цикле с заданным числом повторений. В цикле сперва
определяется значение аргумента в каждой из точек xi. Это значение вычисляется путем прибавления к предыдущему значению аргумента
величины h (начальное значение аргумента берется равным a). Затем вычисляется соответствующее аргументу значение функции, и это значение прибавляется к величине yp.
По завершении работы цикла вычисляются величины yn и yk –
значения функции в начальной и конечной точках отрезка интегрирования. Полусумма этих величин прибавляется к yp, и полученная сумма
умножается на h. Таким образом, мы получаем по формуле трапеций искомую величину s – значение определенного интеграла для функции 1/
(x+1) на заданном пользователем отрезке. Теперь остается только вывести полученное значение на экран компьютера оператором вывода.
Результаты работы программы для вычисления определенного интеграла на отрезке от 0 до 10 приведены на рис. 2.4.
39
Рис. 2.4. Результаты работы программы приближенного вычисления
определенного интеграла функции |
y = |
|
|
1 |
методом трапеций |
|
1 |
+ x |
|||||
|
|
|
Наряду с методом трапеций для вычисления определенного интеграла применяется также метод Симпсона. Суть этого метода заключается в том,
что отрезок интегрирования разбивается на 2n участков длиной h. Затем на
каждом участке, длина которого равна 2h, |
подынтегральная |
функция |
заменяется параболой, которая проходит через начальную точку |
данного |
|
участка, его середину и конечную точку |
участка. То есть, если |
подынтегральная функция в точках с горизонтальными координатами xi,xi+1 и xi+2 имеет соответственно значения yi,yi+1 и yi+2, то и аппроксимирующая ее
парабола должна проходить через точки с координатами (xi,yi), (xi+1,yi+1) и (xi+2, yi+2).
Определение значения интеграла функции f(x) по формуле Симпсона, называемой также формулой парабол, выглядит следующим образом:
b |
f (x)dx ≈ h |
(( y0 + y2n ) + 2( y2 + y4 + ... + y2n−2 ) + |
ò |
||
a |
6 |
|
|
|
+ 4( y1 + y3 + ... + y2n−1))
(2.6) На основании данной формулы можно составить программу, которая
бы вычисляла значение определенного интеграла функции на заданном участке. Для упрощения процесса составления программы формулу Симпсона преобразуем к следующему виду:
b |
f (x)dx ≈ h |
|
2n−1 |
|
(2.7) |
ò |
( y0 + y2n + |
å(3 +ci ) yi ) |
, |
||
3 |
|
i 1 |
|
||
a |
|
|
= |
|
|
где c – это переменная, которая принимает значение, равное 1 при нечетном значении i, и принимает значение, равное –1 при четном i.
40
Реализацию метода Симпсона на практике рассмотрим на примере составления программы, которая вычисляет значение определенного интеграла для подынтегральной функции y =e −x2 .
Начальное и конечное значения отрезка интегрирования, а также количество участков, на которые разбивается отрезок интегрирования, вводятся пользователем с клавиатуры. Для вычисления значения заданной функции используется стандартная функция языка Паскаль exp(x). Ниже
приводится текст программы, которая выполняет поставленную задачу.
program simpson; Uses Crt;
var i,k,m:integer; begina,b,c,h,s,s1,x:real;
ClrScr;
writeln('Программа вычисления определенного интеграла ');
writeln('для функции y=exp(-x*x)'); writeln;
writeln('Введите начальное значение отрезка интегрирования');
readln(a);
writeln;
writeln('Введите конечное значение отрезка интегрирования');
readln(b);
writeln;
writeln('Введите количество участков, на которые будет разбит');
writeln('отрезок интегрирования'); readln(k);
writeln;
x:=a;
c:=1;
s:=0; h:=(b-a)/k; m:=k-1;
for i:=1 to m do begin x:=x+h;
s:=s+(3+c)*exp(-x*x); c:=-c
end; s1:=exp(-a*a)+exp(-b*b);
41
s:=h*(s1+s)/3;
writeln('значение определенного интеграла на отрезке от ',a:5:2,' до ',b:5:2);
writeln('равно ',s:7:3); readln
end.
В данной программе после ввода исходных данных (значение количества участков разбиения отрезка присваивается переменной k, то есть
k=2n) производятся начальные присваивания. Аргументу x — значение начальной точки отрезка a. Переменной s, которая представляет собой
вычисляемое в программе значение интеграла, будет присвоено начальное значение 0. Переменной c — начальное значение 1.
2n−1
Затем в программе вычисляется значение суммы å(3 +ci ) yi . Для
i=1
этого используется цикл с заранее заданным числом повторений. Начальное значение переменной цикла i равно единице, а конечное значение m равно
k-1, то есть 2n-1. В цикле производятся следующие действия. Текущее значение аргумента увеличивается на h, к текущему значению переменной s
прибавляется новая величина согласно приведенной формуле, текущее значение переменной c изменяется на противоположное. После завершения работы цикла находим величину s1 – сумму начального и конечного
значений подынтегральной функции.
Теперь подставим вычисленные величины в формулу и получим искомое значение s. Результаты работы программы при вычислении
определенного интеграла экспоненциальной функции на отрезке от 0 до 1 приведены на рис. 2.5.
42
Рис. 2.5. Результаты работы программы вычисления определенного интеграла функции y = e− x 2 методом Симпсона на отрезке от 0 до 1
В завершении данного раздела пособия рассмотрим программу, которая вычисляет значение определенного интеграла для подынтегральной функции
sin(x) обоими вышеприведенными способами. В программе integral,
текст которой приводится ниже, каждый из способов вычисления определенного интеграла реализован в виде отдельной процедуры. В основной же части программы производится только ввод исходных данных,
обращение к каждой из двух имеющихся в программе процедур (процедура trap для метода трапеций и процедура simpson для метода Симпсона) и
вывод полученного результата для каждого из вышеуказанных методов.
program integral; Uses Crt;
var k:integer; a,b,ints,intt:real;
procedure trap(a1,b1:real; k1:integer; var s:real);
vari:integer; beginh,x,yp,yn,yk:real;
h:=(b-a)/k1; yp:=0;
x:=a;
for i:=1 to k1-1 do begin
x:=x+h;
yp:=yp+sin(x)
end;
yn:=sin(a);
yk:=sin(b);
s:=((yk+yn)/2+yp)*h;
end;
procedure simpson(a2,b2:real; k2:integer; var s:real);
vari,m,c:integer; h,s1,x:real;
begin x:=a2; c:=1; s:=0;
h:=(b2-a2)/k2;
43
m:=k2-1;
for i:=1 to m do begin
x:=x+h;
s:=s+(3+c)*sin(x); c:=-c
end;
s1:=sin(a)+sin(b);
s:=h*(s1+s)/3;
end; begin
ClrScr;
writeln('Программа вычисления определенного интеграла ');
writeln('для функции y=sin(x)'); writeln;
writeln('Введите начальное значение отрезка интегрирования');
readln(a);
writeln;
writeln('Введите конечное значение отрезка интегрирования');
readln(b);
writeln;
writeln('Введите количество участков, на которые будет разбит');
writeln('отрезок интегрирования'); readln(k);
writeln;
a:=a*pi/180;
b:=b*pi/180;
trap(a,b,k,intt);
simpson(a,b,k,ints);
writeln('определенный интеграл, вычисленный с использованием');
writeln('метода трапеций равен ',intt:7:3); writeln;
writeln('определенный интеграл, вычисленный с использованием');
writeln('метода Симпсона равен ',ints:7:3); readln
end.
При разработке программы было учтено то обстоятельство, что обычно аргумент тригонометрических функций выражается в градусах, в то время
44
как используемая в программе встроенная тригонометрическая функция языка Паскаль обрабатывает аргумент, выраженный в радианах. Поэтому перед обращением к процедурам исходные данные переводятся из градусов в радианы, и, следовательно, пользователь, работающий с данной программой, может смело вводить исходные данные в градусах.
На рис. 2.6 приводятся результаты работы программы – вычисление значения определенного интеграла функции sin(x) на отрезке от 0 до 90
градусов (или от 0 до π2 радиан). Для контроля правильности работы
программы вычислим величину данного интеграла аналитическим способом и сравним его с результатами, полученными посредством использования численных методов. Аналитическое решение поставленной задачи выглядит следующим образом:
π |
|
π |
|
|
2 |
|
|
(2.8) |
|
|
2 |
|
||
òsin( x)dx =−cos( x) |
|
=1 |
||
|
||||
|
0 |
. |
||
0 |
|
|
|
45