Текст подпрограммы и версий qsf1r_p.zip qsf1e_p.zip |
Тексты тестовых примеров tqsf1r_p.zip tqsf1e_p.zip |
Вычисление интегралов вида B (1) ∫ f (x) SIN (ρx + φ) dx , A B (2) ∫ f (x) COS (ρx + φ) dx A
по формулам интерполяционного типа 5 - й степени точности.
QSF1R вычисляет интегралы (1), (2) или один из них с заданной абсолютной погрешностью E по формулам интерполяционного типа 5 - й степени точности с фиксированным распределением узлов.
Весь отрезок интегрирования A, B разбивается на K равных частичных отрезков; к каждому отрезку применяются формулы интерполяционного типа. Полученные значения интеграла по всем частичным отрезкам суммируются.
Л.Г.Васильева. Набор стандартных программ численного интегрирования с фиксированным распределенем узлов. Сб. "Численный анализ на ФОРТРАНе", вып.8, Изд - во МГУ, 1974.
procedure QSF1R(var RINT1 :Real; var RINT2 :Real; A :Real; B :Real; F :Func_F1; RO :Real; FI :Real; E :Real; var K :Integer; L1 :Integer; L2 :Integer; var IERR :Integer);
Параметры
RINT1 - RINT2 | вещественные переменные, содержащие вычисленные значения интегралов (1) и (2) соответственно; |
A, B - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
F - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
RO - | заданное значение параметра ρ (тип: вещественный); |
FI - | заданное значение параметра φ (тип: вещественный); |
E - | заданная абсолютная погрешность вычисления интегралов (тип: вещественный); |
K - | целая переменная, задающая число частичных отрезков разбиения; |
L1, L2 - | задают режим работы подпрограммы (тип: целый); при этом: если |
L1=1,L2=0 - | вычисляется интеграл (1); |
L1=0,L2=1 - | вычисляется интеграл (2); |
L1=1,L2=1 - | вычисляются интегралы (1) и (2); |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
IERR=65 - | когда заданная точность не может быть достигнута при максимально возможном числе частичных отрезков разбиения; значение K полагается равным 1048576. |
Версии
QSF1E - | вычисление с расширенной (Extended) точностью интегралов вида (1) и (2) по формулам интерполяционного типа 5 - й степени точности. |
Вызываемые подпрограммы
UTQS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QSF1R. |
UTQS12 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QSF1E. |
Замечания по использованию
Проводятся два последовательных просчета интегралов по всему отрезку интегрирования по K и 2 K частичным отрезкам. Если абсолютная величина разности этих двух последовательных просчетов не превосходит E, то счет заканчивается, и за значения интегралов принимаются pезультаты последнего просчета. B противном случае значение K удваивается и процесс повторяется. При E ≤ 0 происходит только один просчет с заданным K. Максимальное значение K, котоpое можно задавать, не должно превосходить 524288. Если заданная точность не может быть достигнута, то K полагается равным 1048576. При выходе из подпрограммы значение K полагается равным числу частичных отрезков разбиения, при котоpом проводился последний просчет интеграла. В подпрограмме QSF1E параметры RINT1, RINT2, A, B, F, RO, FI, E имеют тип Extended. |
Unit TQSF1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FQSF1R_p, QSF1R_p; function TQSF1R: String; implementation function TQSF1R: String; var K,L1,L2,IERR :Integer; A,B,RO,FI,E,RINT1,RINT2 :Real; begin Result := ''; { результат функции } A := 0.0; B := 1.0; K := 1; Е := -1.E-7; L1 := 1; L2 := 1; RO := 10.0; FI := 0.0; QSF1R(RINT1,RINT2,A,B,FQSF1R,RO,FI,E,K,L1,L2,IERR); Result := Result + Format('%s',[' RINT1=']); Result := Result + Format('%20.16f ',[RINT1]); Result := Result + Format('%s',[' RINT2=']); Result := Result + Format('%20.16f ',[RINT2]); Result := Result + Format('%s',[' K=']); Result := Result + Format('%7d ',[K]); Result := Result + Format('%s',[' IERR=']); Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; UtRes('TQSF1R',Result); { вывод результатов в файл TQSF1R.res } exit; end; end. Unit FQSF1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; function FQSF1R(X :Real): Real; implementation function FQSF1R(X :Real): Real; begin { Result - прототип имени функции FQSF1R на FORTRANe } Result := IntPower(X,4); exit; end; end. Результаты: RINT1 = 0.053824477954 RINT2 = - 0.079553512319 K = 2 IERR = 0