Текст подпрограммы и версий qs82r_p.zip qs82e_p.zip |
Тексты тестовых примеров tqs82r_p.zip tqs82e_p.zip |
Вычисление определенного N - кратного (2 ≤ N ≤ 15) интеграла по прямоугольному параллелепипеду методом Гаусса.
QS82R вычисляет N - кратный интеграл по квадратурной формуле
b1 b2 bN ∫ ∫ ... ∫ f (x1, x2, ... , xN) dx1 dx2 ... dxN ≈ a1 a2 aN N k1 k2 kN ≈ ( ∏ ( bi - ai )/2 ) ∑ ∑ ... ∑ cn1 cn2 ... cnN * i=1 n1=1 n2=1 nN=1 * f ( ( b1 - a1 )/2 xn1 + ( a1 + b1 )/2 , ( b2 - a2 )/2 xn2 + ( a2 + b2 )/2 , ... , ( bN - aN )/2 xnN + ( aN + bN )/2 ) ,
где 2 ≤ ki ≤ 128, а xni и cni ( ni = 1, 2, ..., ki ) соответственно узлы и веса квадратурной формулы Гаусса для отрезка [-1, 1].
Я.М.Жилейкин, А.Г.Симакин. Набор стандартных программ приближенного вычисления многократных интегралов с помощью квадратурных формул Гаусса. Сб. "Численный анализ на ФОРТРАНе", вып. 19, Изд-во МГУ, 1977.
procedure QS82R(var RINT :Real; N :Integer; var A :Array of Real; var B :Array of Real; F :Func_F1A; var NP :Array of Integer; var X :Array of Real; var W :Array of Real);
Параметры
RINT - | вещественная переменная, содержащая вычисленное значение интеграла; |
N - | заданная кратность интегрирования (тип: целый); |
A, B - | вещественные векторы длины N, задающие соответвенно нижние и верхние пределы интегрирования; |
F - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
NP - | целый вектоp длины N, задающий число узлов интегрирования по каждой переменной: NP (I) = kI, I = 1, 2, ..., N; |
X, W - | вещественные двумерные массивы размера N на 64, используемые в подпрограмме как рабочие. |
Версии
QS82E - | вычисление с расширенной (Extended) точностью определенного N - кратного (2 ≤ N ≤ 15) интеграла по прямоугольному параллелепипеду методом Гаусса. |
Вызываемые подпрограммы
QS80R - | подпрограмма вычисления узлов и весов Гаусса - Лежандра. |
QS80E - | подпрограмма вычисления с расширенной (Extended) точностью узлов и весов Гаусса - Лежандра. |
Замечания по использованию
Компоненты вектоpа NP в пределах от 2 до 128. Первый оператор подпрограммы - функции F должен
иметь вид |
Unit TQS82R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FQS82R_p, QS82R_p; function TQS82R: String; implementation function TQS82R: String; var N,I :Integer; RINT :Real; А :Array [0..4] of Real; B :Array [0..4] of Real; NP :Array [0..4] of Integer; X :Array [0..319] of Real; W :Array [0..319] of Real; label _1; begin Result := ''; { результат функции } N := 5; for I:=1 to N do begin NP[I-1] := 10; A[I-1] := -3.0; _1: B[I-1] := 3.0; end; QS82R(RINT,N,A,B,FQS82R,NP,X,W); Result := Result + Format('%s',[' RINT=']); Result := Result + Format('%16.7f ',[RINT]) + #$0D#$0A; UtRes('TQS82R',Result); { вывод результатов в файл TQS82R.res } exit; end; end. Unit FQS82R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; function FQS82R( X :Array of Real): Real; implementation function FQS82R( X :Array of Real): Real; var I :Integer; S,R :Real; label _1; begin { Result - прототип имени функции FQS82R на FORTRANe } S := 0.0; for I:=1 to 5 do begin R := X[I-1]; _1: S := S+R*R; end; Result := Exp(-0.5*S); exit; end; end. Результат: RINT = 97.6288