Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение математических задач.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
858.1 Кб
Скачать

вывод полученного значения корня. Так как корней несколько, то предусматривается неоднократное выполнение программы с различными начальными приближениями, для чего в программе использован цикл с постусловием.

На рис. 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

производится вычисление отношения изменения значения функции 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 + ... + y2n2 ) +

ò

a

6

 

 

 

+ 4( y1 + y3 + ... + y2n1))

(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 = ex 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