Все методы реализованы в виде одной процедуры-функции (см. ПРОГРАММУ 5.1), в которой параметр MetInt определяет выбранный метод интегрирования. Если известно аналитическое выражение для интегрируемой функции, необходимо выполнить подготовительную работу - написать подпрограмму, которая будет заполнять таблицу значений x и F(x).
Одновременно с расчетом интеграла процедура рассчитывает среднее и действующее значение кривой любым из методов, что достигается делением значения интеграла на величину интервала аргумента xn - x0. Также в программе значение шага h не постоянно, а рассчитывается по текущим значениям аргумента xi.. Это позволяет использовать процедуры при обработке расчетных данных с переменным шагом по аргументу. В процедуре рассчитывается необходимое число точек для методов средних прямоугольников и парабол Nr.
На практических занятиях предлагается с помощью программы, обрабатывающей результаты расчета математической модели электромагнита, оценить точность расчета интеграла различными методами при изменении шага интегрирования. За базу при этом берется значение интеграла, полученное аналитически.
|
|
ПРОГРАММА 5.1
{ Процедурa-функция для расчета величины определенного
интеграла, среднего и действующего значений функции, заданной таблично }
{_________ В вызывающей программе :____________________}
{Const NMax=500; Макс. число точек в таблице функции }
{ Тип - одномерный массив для хранения и передачи в подпрограмму значений аргумента и функции }
{ Type VecF=array[0..NMax] Of Real; }
{___________ Расчет определенного интеграла ____________}
Function Integral (N:Integer; x,F:VecF; MetInt:Integer;
Var Sr:Real; Var Eff:Real):Real;
{ N - число узлов функции F(x) }
{ x - массив аргументов }
{ F - массив значений интегрируемой функции }
{ MetInt - выбираемый метод интегрирования }
{ Sr - среднее значение функции }
{ Eff - действующее значение функции }
Var
i, { Cчетчик циклов }
Nr { Расчетное число узлов функции }: Integer;
Sum,
Sum1 {Переменные для накопления сумм интегралов}: Real;
F1 { Массив значений вспомогательной функции }
{для расчета действующего значения }: VecF;
Begin
{ Заполнение массива вспомогательной функции }
For i:=0 to N do
F1[i]:=F[i]*F[i];
Nr:=N ;{ Исходное расчетное число узлов функции }
{ Коррекция Nr для методов средних прямоугольников и парабол }
If MetInt > 3 Then Nr:=(N div 2)*2;
Sum:=0.0;
Sum1:=0.0; { Начальное обнуление сумм }
Case MetInt of { Выбор метода интегрирования }
1 :{ Метод левых прямоугольников }
Begin
For i:=0 to Nr-1 do Sum:=Sum+F[i]*(x[i+1]-x[i]);
For i:=0 to Nr-1 do Sum1:=Sum1+F1[i]*(x[i+1]-x[i]);
End;
2 :{ Метод правых прямоугольников }
Begin
For i:=0 to Nr-1 do Sum:=Sum+F[i+1]*(x[i+1]-x[i]);
For i:=0 to Nr-1 do Sum1:=Sum1+F1[i+1]*(x[i+1]-x[i]);
End;
3 :{ Метод трапеций }
Begin
For i:=0 to Nr-1 do Sum:=Sum+0.5*(F[i+1]+F[i])*(x[i+1]-x[i]);
For i:=0 to Nr-1 do Sum1:=Sum1+0.5*(F1[i+1]+F1[i])*(x[i+1]-x[i]);
|
|
End;
4 :{ Метод средних прямоугольников}
Begin
i:=1;
Repeat
Sum:=Sum+F[i]*(x[i+1]-x[i-1]);
Sum1:=Sum1+F1[i]*(x[i+1]-x[i-1]);
i:=i+2;
Until i > Nr;
End;
5:{ Метод парабол (Симпсона)}
Begin
i:=1;
Repeat
Sum:=Sum+(F[i-1]+4.0*F[i]+F[i+1])*(0.5*(x[i+1]-x[i-1]))/3.0;
Sum1:=Sum1+(F1[i-1]+4.0*F1[i]+F1[i+1])*(0.5*(x[i+1]-x[i-1]))/3.0;
i:=i+2;
Until i > Nr;
End; End;
Integral:=Sum; { Значение интеграла }
Sr:= Sum/(x[Nr]-x[0]); { Cреднее значение кривой }
Eff_Znach:=Sqrt(Sum1/(x[Nr]-x[0])); { Действующее значение кривой }
End ;{ Integral_____________________________________________}