|
Текст подпрограммы и версий ii20r_c.zip |
Тексты тестовых примеров tii20r_c.zip |
Дробно - рациональная интерполяция функции, заданной на конечном интервале.
Пусть на интервале [u, v] задана функция f (x). Вычисляется дробно - рациональная функция вида
p+1 q+1
R (x) = ( ∑ A k * Tk - 1 ( z ) ) / ( ∑ B k * Tk - 1 ( z ) ) ≡
k = 1 k = 1
p+1 q+1
≡ ( ∑ C k x k - 1 ) / ( ∑ D k x k - 1 ) ,
k = 1 k = 1
где z = ( 2x - u - v ) / ( v - u ) для x ∈ [u , v], Tk ( z ) - полином Чебышева 1 - го рода степени k, B1 = D1 = 1, p, q - заданные натуральные числа, удовлетворяющая условиям интерполяции:
R ( x j ) = f ( x j )
в узлах x j = 0.5 * ( u + v - ( v - u ) cos y j ), где y j = ( j - 0.5 ) * π / ( p + q + 1 ), j = 1, 2, ..., p + q + 1.
Для найденного R (x) в узлах сетки x k = 0.5 * ( u + v + ( v - u ) cos f k ), f k = ( k - 1 ) * π / ( p + q + 1 ), k = 1, 2, ..., p + q + 2, вычисляются характеристики точности интерполяции
E1 = max k | Δ f k | , E2 = max k | Δ k / f k | ,
EPS1 = E1 / min k | Δ k | , EPS2 = E2 / min k | Δ k | ,
где
f k = f ( x k ) , Δ k = f ( x k ) - R ( x k ) .
Curtis A., Osborne M.R. The construction of minimax rational approximations to functions, Computer J., 1966, v.9, N 3, 286 - 293.
int ii20r_c (integer *ip, integer *iq, real *u, real *v,
R_fp funct, real *a, real *b, real *al, real *be, real *rab,
real *rab1, real *rab2, real *rab3, real *rab4, integer *ierr)
Параметры
| ip, iq - | заданные степени числителя p и знаменателя  q, ip ≥ 0, iq ≥ 0 (тип: целый); |
| u, v - | заданные нижняя и верхняя границы интервала интерполяции (тип: вещественный); |
| funct - | имя вещественной подпрограммы - функции вычисления значений f (x); |
| a - | вещественный вектоp длины ip + 1 значений a k = a[k]; |
| b - | вещественный вектоp длины iq + 1 значений b k = b[k]; |
| al - | вещественный вектоp длины ip + 1 значений c k = al[k]; |
| be - | вещественный вектоp длины iq + 1 значений d k = be[k]; |
| rab - | вещественный вектоp длины iq, используемый в подпрограмме как рабочий; |
| rab1 - | вещественный двумерный массив размера 3 * (2 ( ip + iq + 1) + 1), используемый в подпрограмме как pабочий; |
| rab2 - | вещественный двумерный массив размера 6 * ( ip + iq + 2), используемый как рабочий; после окончания работы подпрограммы в нем запоминаются хаpактеристики интерполяции E1 = rab2 (1, 1), E2 = rab2 (2, 1), Eps1 = rab2 (3, 1), Eps2 = rab2 (4, 1); |
| rab3 - | вещественный вектоp длины ip + 1, используемый в подпрограмме как рабочий; |
| rab4 - | вещественный двумерный массив размера iq * iq, используемый в подпрограмме как pабочий; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | когда вычисленный знаменатель искомого приближения имеет корень в интервале [u, v]; |
| ierr=66 - | когда матрица для определения коэффициентов приближения вырождена. |
Версии: нет
Вызываемые подпрограммы
| uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i i20r_c. |
Замечания по использованию: нет
int main(void)
{
/* Local variables */
extern int ii20r_c(int *, int *, float *, float *, R_fp, float *,
float *, float *, float *, float *, float *, float *,
float *, float *, int *);
static int ierr;
static float a[3], b[3];
static float u, v;
extern float funct_c();
static float be[3], al[3];
static int ip, iq;
static float rab[2], rab1[33] /* was [3][11] */,
rab2[36] /* was [6][6] */,
rab3[3], rab4[4] /* was [2][2] */;
#define rab2_ref(a_1,a_2) rab2[(a_2)*6 + a_1 - 7]
ip = 2;
iq = 2;
u = -1.f;
v = 1.f;
ii20r_c(&ip, &iq, &u, &v, (R_fp)funct_c, a, b, al, be, rab, rab1, rab2,
rab3, rab4, &ierr);
printf("\n %5i %5i %16.7e %16.7e %5i \n", ip, iq, u, v, ierr);
printf("\n %16.7e %16.7e %16.7e \n", a[0],a[1],a[2]);
printf("\n %16.7e %16.7e %16.7e \n", b[0],b[1],b[2]);
printf("\n %16.7e %16.7e %16.7e \n", al[0],al[1],al[2]);
printf("\n %16.7e %16.7e %16.7e \n", be[0],be[1],be[2]);
printf("\n %16.7e %16.7e %16.7e %16.7e \n",
rab2_ref(1, 1), rab2_ref(2, 1), rab2_ref(3, 1), rab2_ref(4, 1));
return 0;
} /* main */
float funct_c(float *x)
{
/* System generated locals */
float ret_val;
/* Builtin functions */
double exp(double);
ret_val = (float)exp(*x);
return ret_val;
} /* funct_c */
Результаты:
a = (1., .480197, .0392021) ;
b = (1., -.480197, .0392021) ;
al = (1., .499789, .0816032) ;
be = (1., -.499789, .0816032) ;
ierr = 0
rab2 (1, 1) = .00024 ; rab2 (2, 1) = .000089 ;
rab2 (3, 1) = 7.3884 ; rab2 (4, 1) = 1.05524