Текст подпрограммы и версий 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