|
Текст подпрограммы и версий ia83r_c.zip , ia83d_c.zip |
Тексты тестовых примеров tia83r_c.zip , tia83d_c.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.
int ia83r_c(integer *m, integer *n, real *x, real *y,
integer *in, integer *iter, real *a, real *ax, integer *jn,
real *rab, integer *ierr)
Параметры
| 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 итераций. |
Версии
| ia83d_c - | построение алгебраического полинома наилучшего равномерного приближения для таблично заданной функции в режиме вычислений с удвоенной точностью. |
Вызываемые подпрограммы
| utia10_c - | подпрограмма выдачи диагностических сообщений при работе ia83r_c; |
| utia11_c - | подпрограмма выдачи диагностических сообщений при работе ia83d_c; |
Замечания по использованию: нет
int main(void)
{
/* Initialized data */
static int in[9] = { 1,6,11,16,21,26,31,36,51 };
/* Local variables */
extern int ia83r_c(int *, int *, float *, float *, int *, int *,
float *, float *, int *, float *, int *);
static int ierr, iter;
static float a[8], h__;
static int k, m, n, i;
static float x[51], y[51];
static int jn[9];
static float ax[9], rab[18] /* was [2][9] */;
int i__1;
float r__1;
#define rab_ref(a_1,a_2) rab[(a_2)*2 + a_1 - 3]
m = 51;
n = 7;
h__ = 2.f / (m - 1);
i__1 = m;
for (k = 1; k <= i__1; ++k) {
x[k - 1] = (k - 1) * h__ - 1.f;
y[k - 1] = (r__1 = x[k - 1], abs(r__1));
/* L5: */
}
ia83r_c(&m, &n, x, y, in, &iter, a, ax, jn, rab, &ierr);
printf("\n %5i \n",ierr);
printf("\n %5i %5i %5i \n",n,m,iter);
printf("\n %16.7e \n",rab_ref(1,1));
for (i = 1; i <= 9; ++i) {
printf("\n %16.7e \n",ax[i-1]);
}
for (i = 1; i <= 8; ++i) {
printf("\n %16.7e \n",a[i-1]);
}
printf("\n jn = %3i %3i %3i %3i %3i %3i %3i %3i %3i \n",
jn[0],jn[1],jn[2],jn[3],jn[4],jn[5],jn[6],jn[7],jn[8]);
return 0;
} /* main */
Результаты:
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)