|
Текст подпрограммы и версий ia83r_p.zip , ia83e_p.zip |
Тексты тестовых примеров tia83r_p.zip , tia83e_p.zip |
Построение алгебраического полинома наилучшего равномерного приближения для таблично заданной функции.
Пусть в узлах сетки x1 < x2 < ...< xM заданы значения табличной функции y : y1, y2 ..., yM. Требуется построить алгебраический полином
N
P*(x) = ∑ ak xk
k =0
заданной степени N ≤ M - 2, который минимизирует максимальное отклонение
h ( y,P ) = max | yk - P(x) |
1≤k≤M
среди всех полиномов P (x) степени N.
Среди узлов x1, x2, ..., xM существуют точки альтернанса x1* < x2* < ... < x*N + 2, в которых
yk - P* (xk*) = (- 1)k h* ,
где h* = max | yk - P*(xk ) | ,
1≤k≤M
h* - максимальное отклонение полинома наилучшего приближения P* (x).
Задача решается на основе итерационного R - алгоритма В.Н.Малоземова, требующего задания начального набора N + 2 точек x1 < x2 < ...< xN + 2, каждая из которых должна совпадать с одним из узлов исходной сетки. Подпрограмма находит точки альтернанса x1* < x2* < ...< x*N + 2, не обязательно совпадающие с начальным набором точек.
Сб. "Вопросы теории и элементы программного обеспечения минимаксных задач", под ред. Демьянова В.Ф., Малоземова В.Н., Л., Изд - во Ленингр. ун - та, 135 - 138, 1977.
procedure IA83R(M :Integer; N :Integer; var X :Array of Real;
var Y :Array of Real; var IN_ :Array of Integer;
var ITER :Integer; var A :Array of Real;
var AX :Array of Real; var JN :Array of Integer;
var RAB :Array of Real; var IERR :Integer);
Параметры
| M - | заданное число узлов сетки (тип: целый); |
| N - | заданная степень полинома, N ≤ M - 2 (тип: целый); |
| X - | вещественный вектор длины M, в котором задаются значения узлов сетки; |
| Y - | вещественный вектор длины M, в котором задаются значения табличной функции; |
| IN_ - | целый вектор длины N + 2 номеров начального набора точек; может изменяться самой программой в процессе вычисления; |
| ITER - | число выполненных при решении задачи итераций (тип: целый); |
| A - | вещественный вектор длины N + 1 вычисленных значений коэффициентов полинома наилучшего приближения, A ( I ) = aI, I = 1, 2, ...,N + 1; |
| AX - | вещественный вектор длины N + 2 вычисленных значений точек альтернанса; |
| JN - | целый вектор длины N + 2 номеров вычисленных значений точек альтернанса; |
| RAB - | вещественный двумерный массив размера 2 * (N + 2), используемый как рабочий; после окончания работы подпрограммы RAB (1, 1) = h*; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом |
| IERR=65 - | когда M < N + 2; |
| IERR=66 - | когда номера начального набора точек не упорядочены строго по возрастанию; или упорядоченность нарушается в процессе работы программы; |
| IERR=67 - | когда значения узлов сетки xi, i = 1, 2, ..., M не упорядочены строго по возрастанию. |
| IERR=68 - | сходимость не может быть достигнута в пределах 30 итераций. |
Версии
| IA83E - | построение алгебраического полинома наилучшего равномерного приближения для таблично заданной функции в режиме вычислений с расширенной (Extended) точностью. |
Вызываемые подпрограммы
| UTIA10 - | подпрограмма выдачи диагностических сообщений при работе IA83R. |
| UTIA11 - | подпрограмма выдачи диагностических сообщений при работе IA83E. |
Замечания по использованию: нет
Unit TIA83R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IA83R_p;
function TIA83R: String;
implementation
function TIA83R: String;
var
M,N,K,I,ITER,IERR :Integer;
H :Real;
A :Array [0..7] of Real;
АХ :Array [0..8] of Real;
RАВ :Array [0..17] of Real;
JN :Array [0..8] of Integer;
X :Array [0..50] of Real;
Y :Array [0..50] of Real;
const
IN_ :Array [0..8] of Integer = ( 1,6,11,16,21,26,31,36,51 );
label
_5;
begin
Result := ''; { результат функции }
M := 51;
N := 7;
H := 2.0/(M-1);
for K:=1 to M do
begin
X[K-1] := -1.0+(K-1)*H;
Y[K-1] := Abs(X[K-1]);
_5:
end;
IA83R(M,N,X,Y,IN_,ITER,A,AX,JN,RAB,IERR);
Result := Result + Format('%s',
[' ТЕСТОВЫЙ ПРИМЕР ДЛЯ IA83R' + #$0D#$0A]) + #$0D#$0A;
Result := Result + Format('%s',[' PEЗYЛЬTATЫ:' + #$0D#$0A + ' IERR=']);
Result := Result + Format('%2d ',[IERR]);
Result := Result + Format('%s',[' N=']);
Result := Result + Format('%2d ',[N]);
Result := Result + Format('%s',[' M=']);
Result := Result + Format('%3d ',[M]);
Result := Result + Format('%s',[' ITER=']);
Result := Result + Format('%3d ',[ITER]);
Result := Result + Format('%s',[' MINMAX=']);
Result := Result + Format('%20.16f ',[RAB[0]]) + #$0D#$0A;
for I:=1 to 8 do
begin
Result := Result + Format(' A(%1d )=%20.16f ',[I,A[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
for I:=1 to 9 do
begin
Result := Result + Format(' АХ(%1d )=%20.16f ',[I,AX[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
for I:=1 to 9 do
begin
Result := Result + Format(' JN(%1d )=%5d ',[I,JN[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TIA83R',Result); { вывод результатов в файл TIA83R.res }
exit;
end;
end.
Результаты:
IERR = 0; ITER = 6;
RAB(1,1) = 0.04587;
A = (0.04587, 0., 2.8698, 0., - 4.18189, 0., 2.31212, 0.);
AX = (- 1., -.880, -.56, -.2, 0., .2, .56, .88, 1.);
JN = (1, 4, 12, 21, 26, 31, 40, 48, 51)