Текст подпрограммы и версий iam2r_c.zip , iam2d_c.zip |
Тексты тестовых примеров tiam2r_c.zip , tiam2d_c.zip |
Среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией.
Пусть задана кусочно - постоянная функция f0 (x), x ∈ [x1, xN], имеющая узловые точки x1, ..., xN и узловые значения y1, ..., yN:
f0(x) = (yi+1 - y1) x / (xi+1 - x1) + (y1xi+1 - yi+1x1) / (xi+1 - x1) ,
x ∈ [x1,xi+1] , i = 1, ..., N-1
Строится среднеквадратическая аппроксимация функции f0 (x) в классе выпуклых функций по методу, разработанному в [1].
Основной процедурой в этом методе является построение интерполяционного кубического сплайна с нулевыми краевыми условиями.
Построенная аппроксимирующая функция является выпуклой кусочно - линейной функцией, узловые точки которой содержатся среди узловых точек исходной функции.
1. | Малышев В.А. Среднеквадратическая аппроксимация выпуклыми функциями. Сб."Численный анализ: методы, алгоритмы, приложения". Изд - во МГУ, 1985. |
int iam2r_c (integer *n, real *x, real *y, real *z, integer *ii, real *f0, real *f, real *a, real *b, real *c, real *h, real *v)
Параметры
n - | заданное число узловых точек аппроксимируемой кусочно - линейной функции (тип: целый); |
x - | вещественный вектор длины n заданных значений узловых точек; |
y - | вещественный вектор длины n заданных значений аппроксимируемой кусочно - линейной функции; |
z - | вещественный вектор длины n вычисленных в точках x1, ..., xn значений аппроксимирующей кусочно - линейной функции; |
i i - | целый вектор длины n, содержащий полученные номера i1, ...,ik (k ≤ n) узловых точек xi 1, ..., xi k аппроксимирующей кусочно - линейной функции; |
f0, f, - a, b, c, h, v | вещественные рабочие векторы длины n; |
Версии
iam2d_c - | среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией в режиме удвоенной точности. При этом параметры x, y, z, f0, f, a, b, c, h и v должны иметь тип double. |
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Для среднеквадратической аппроксимации кусочно - линейной функции
f0(x) = (yi+1 - y1) x / (xi+1 - x1) + (y1xi+1 - yi+1x1) / (xi+1 - x1) ,
x ∈ [x1,xi+1] , i = 1, ..., 10
такой, что
x = ( 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. )
y = ( 8., 5., 6., 4., 3., 4., 5., 4., 7., 9., 8. )
Обращение к подпрограмме имеет вид:
int main(void)
{
/* Initialized data */
static float x[11] = { 0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f,10.f };
static float y[11] = { 8.f,5.f,6.f,4.f,3.f,4.f,5.f,4.f,7.f,9.f,8.f };
/* Local variables */
extern int iam2r_c(int *, float *, float *, float *, int *, float *,
float *, float *, float *, float *, float *, float *);
static float a[11], b[11], c__[11], f[11], h__[11];
static int i__[11], j, n, i;
static float v[11], z__[11], f0[11];
static int ii[11];
int i__1;
n = 11;
iam2r_c(&n, x, y, z__, ii, f0, f, a, b, c__, h__, v);
i__1 = n;
for (j = 1; j <= i__1; ++j) {
/* l1: */
i__[j - 1] = j;
}
for (i = 0; i <= 5; i+= 5) {
printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
x[i], x[i+1], x[i+2], x[i+3], x[i+4]);
}
printf("\n %9.2e \n", x[10]);
for (i = 0; i <= 5; i+= 5) {
printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
y[i], y[i+1], y[i+2], y[i+3], y[i+4]);
}
printf("\n %9.2e \n", y[10]);
for (i = 0; i <= 5; i+= 5) {
printf("\n %9.2e %9.2e %9.2e %9.2e %9.2e ",
z__[i], z__[i+1], z__[i+2], z__[i+3], z__[i+4]);
}
printf("\n %9.2e \n", z__[10]);
printf("\n %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i \n",
ii[0],ii[1],ii[2],ii[3],ii[4],ii[5],ii[6],
ii[7],ii[8],ii[9],ii[10]);
return 0;
} /* main */
Результат:
z__ = ( 7.59, 5.83, 5.01, 4.19, 3.38, 3.92, 4.46, 5.00, 6.54, 8.07, 9.61 )