|
Текст подпрограммы и версий iib2r_c.zip |
Тексты тестовых примеров tiib2r_c.zip |
Вычисление значения заданной в узлах равномерной сетки табличной функции от одной переменной методом аппроксимирующих квадратичных сплайнов.
Пусть в узлах равномерной ceтkи x K: x1 < x2 < ... < x M с шагом H: x K + 1 = x K + H заданы значения yK = y (x K) , а узлы t K сетки, на которой строятся аппроксимирующие сплайны, таковы, что t K = x K - H / 2.
Значение аппроксимирующего квадратичного сплайна вычисляется по формулам:
S (x) = y2 + ( y2 - y1 ) ( x - x2 ) / H , x ∈ [x1, t3] i+1 S (x) = ∑ y K s K-1 ( x ) , x ∈ [t i , t i + 1] , i = 3, ..., M-3 k = i-1 S (x) = yM-1 + ( yM - yM-1 ) ( x - x M ) / H , x ∈ [t M - 2, x M] ,
где s K (x) - квадратичный В - сплайн [1], построенный по узлам t K, t K + 1, t K + 2.
А.И.Гребенников. Аппроксимация квадратичными сплайнами, Численный анализ на ФОРТРАНе, вып.15, Изд - во МГУ, 1976.
int iib2r_c (real *f, integer *m, real *a, real *h, real *x,
real *s, integer *ierr)
Параметры
| f - | вещественный вектоp длины m значений заданной табличной функции; |
| m - | число узлов сетки (тип: целый); |
| a - | первый узел сетки x1 (тип: вещественный); |
| h - | шаг сетки, h > 0 (тип: вещественный); |
| x - | аргумент, при котоpом производятся вычисления (тип: вещественный); |
| s - | вещественная переменная, которая полагается pавной вычисленному значению функции; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | когда зафиксирована ошибка в задании шага, h ≤ 0; |
| ierr=66 - | когда аргумент x лежит вне отрезка [x1, x m]. |
Версии: нет
Вызываемые подпрограммы
| uti i12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i ib2r_c. |
Замечания по использованию: нет
int main(void)
{
/* Builtin functions */
double cos(double);
/* Local variables */
extern int iib2r_c(float *, int *, float *, float *, float *, float *,
int *);
static float f[6];
static int k;
static float s, x[6], pi;
static int ir;
pi = .62831853059999998f;
for (k = 1; k <= 6; ++k) {
x[k - 1] = (k - 1) * pi;
f[k - 1] = (float)cos(x[k - 1]);
/* l1: */
}
iib2r_c(f, &c__6, &c_b3, &pi, &x[2], &s, &ir);
printf("\n %16.7e \n",s);
return 0;
} /* main */
Результатат: s = 0.29