Текст подпрограммы и версий
qs80r_p.zip  qs80e_p.zip 
Тексты тестовых примеров
tqs80r_p.zip  tqs80e_p.zip 

Подпрограмма:  QS80R (модуль QS80R_p)

Назначение

Вычисление узлов и весов Гаусса - Лежандра.

Математическое описание

QS80R вычисляет по методу Ньютона корни X1,X2, ..., Хn полинома Лежандра

     Ln(x) = 1/(2nn)  dn(x2-1)n / dxn 

и соответствующие им весовые множители C1, C2, ... ,Cn для квадратурной формулы Гаусса

        1
       ∫  f(x) dx  ≈ ( c1f(x1) + c2f(x2) + ... + cnf(xn) ) .
     -1 

Для  n допускаются значения 2 ≤ n ≤ 128.

Я.М.Жилейкин, А.Г.Симакин. Набор стандартных программ приближенного вычисления многократных интегралов с помощью метода Гаусса. Сб. "Численный анализ на ФОРТРАНе", вып. 19, Изд-во МГУ, 1977.

Использование

function QS80R(NN :Integer; var X :Array of Real;
                var A :Array of Real): String;

Параметры

N - заданное число узлов и весов Гаусса - Лежандра (тип: целый);
X - вещественный вектоp длины entier ( (N + 1)/2 ), содержащий вычисленные значения узлов;
C - вещественный вектоp длины entier ( (N + 1)/2 ), содержащий вычисленные значения весов.

Версии

QS80E -   вычисление с расширенной (Extended) точностью узлов и весов Гаусса - Лежандра.

Вызываемые подпрограммы: нет

Замечания по использованию

 

Tак как корни полиномов Лежандра L (X) симметричны относительно нуля, а веса, соответствующие симметричным корням, равны, то в вектоp Х засылаются только неотрицательные корни в порядке их убывания, а в вектоp C - соответствующие им веса.

В подпрограмме QS80E параметры X, C имеют тип Extended.

Пример использования

Unit TQS80R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, QS80R_p;

function TQS80R: String;

implementation

function TQS80R: String;
var
N,_i :Integer;
X :Array [0..2] of Real;
С :Array [0..2] of Real;
begin
Result := '';  { результат функции }
N := 5;
QS80R(N,X,C);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%16.7f ',[X[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%16.7f ',[C[_i]]);
  if ( ((_i+1) mod 1)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TQS80R',Result);  { вывод результатов в файл TQS80R.res }
exit;
end;

end.

Результаты:

      X (1)  =  0.9061798459
      X (2)  =  0.5384693101
      X (3)  =  0.0000000000

      C (1)  =  0.2369268850
      C (2)  =  0.4786286705
      C (3)  =  0.5888888888