Текст подпрограммы и версий qs14r_p.zip |
Тексты тестовых примеров tqs14r_p.zip |
Вычисление определенного интеграла от комплекснозначной функции вещественного аргумента по квадратурной формуле Гаусса.
Пусть f (x) = f1 (x) + i f (x) - комплекснозначная функция вещественного аргумента, определенная на конечном отрезке [a, b], вычисляется
b ∫ f (x) dx ≈ a N ≈ (b - a) ∑ cj f ( (b - a) yj / 2 + (a + b) / 2 ) / 2 = JN , j=1
где JN = J1N + i J2N, yj и cj соответственно узлы и веса Гаусса для отрезка [-1,1], i = √-1.
Число узлов интегрирования N принимает только следующие значения: 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96. Пусть n - номеp элемента указанного списка; обозначим J1N и J2N (N принимает перечисленные значения) через J1(n) и J2(n) соответственно.
B качестве приближенного значения интеграла берется J1 (n + 1) + i J2 (n + 1), если величина
E(n) = [ (J1(n+1) - J1(n))2 + (J2(n+1) - J2(n))2] / [(J1(n+1))2 + (J2(n+1))2 ]1/2
меньше или pавна заданной относительной точности вычисления интеграла E.
procedure QS14R(var RINT :Array of Real; A :Real; B :Real; F :Proc_F3; E :Real; var N :Integer; var IERR :Integer);
Параметры
RINT - | вещественный вектоp длины 2 для вычисленных значений J1 (n + 1) и J2 (n + 1); |
A, B - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
F - | имя подпрограммы, вычисляющей подинтегральную функцию f (x); |
E - | заданная относительная погрешность вычисления интеграла (тип: вещественный); |
N - | целая переменная, задающая начальное число узлов интегрирования; |
IERR - | целая переменная для диагностических сообщений: |
IERR = 65 - |
когда список узлов исчерпан, а
заданная точность не достигнута, или (J1(n + 1))2 + (J2(n + 1))2 ≤ 10-10 ; |
IERR = 66 - | когда заданное число узлов интегрирования не принадлежит списку допустимых значений узлов. |
Версии: нет
Вызываемые подпрограммы
UTQS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QS14R. |
Замечания по использованию
1. |
Если IERR = 65, то N полагается равным -1. | |
2. |
При E ≤ 0 происходит вычисление интеграла только с заданным N. | |
3. |
Первый оператор подпрограммы F должен иметь вид: |
Unit TQS14R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FQS14R_p, QS14R_p; function TQS14R: String; implementation function TQS14R: String; var N,_i,IERR :Integer; A,B,E :Real; RINT :Array [0..1] of Real; begin Result := ''; { результат функции } A := 1.0; B := IntPower(2.718281828459,3); E := 0.00001; N := 2; QS14R(RINT,A,B,FQS14R,E,N,IERR); Result := Result + Format('%s',[' N=']); Result := Result + Format('%2d',[N]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[RINT[_i]]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TQS14R',Result); { вывод результатов в файл TQS14R.res } exit; end; end. Unit FQS14R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure FQS14R(X :Real; var F1 :Real; var F2 :Real); implementation procedure FQS14R(X :Real; var F1 :Real; var F2 :Real); begin F1 := 1.0/(X*Sqrt(1.0+Ln(X))); F2 := 1.0/X; end; end. Результаты: RINT (1) = 1.9999999999 RINT (2) = 3.0000000000 N = 32