Текст подпрограммы и версий iam1r_c.zip , iam1d_c.zip |
Тексты тестовых примеров tiam1r_c.zip , tiam1d_c.zip |
Среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией
Пусть задана кусочно - постоянная функция f0 (x), x ∈ (x0, xN]:
f0 (x) = y1 , x ∈ ( x i -1, x1 ] , i = 1,..., N
Строится наилучшая среднеквадратическая аппроксимация функции f0 (x) в классе монотонно возрастающих функций:
xN
∫ [ f(x) - f0(x) ]2 dx = min , f(x) ∈ V1 [x0, xN] ,
x0
где V1 [x0, xN] - множество монотонно возрастающих функций. В подпрограмме реализован прямой метод решения этой задачи, разработанный в [1] и требующий CONST*N арифметических операций. Алгоритм основан на построении выпуклой оболочки функции
x F0 (x) = ∫ f(t) dt x0 и последующем ее дифференцировании.
Построенная аппроксимирующая функция является монотонно возрастающей кусочно - постоянной функцией, точки разрыва которой содержатся среди точек разрыва исходной кусочно - постоянной функции.
1. | Малышев В.А. Решение задачи монотонной аппроксимации и выпуклая оболочка кусочно - линейной функции. Сб."Численный анализ: методы, алгоритмы, приложения". Изд - во МГУ, 1985. |
int iam1r_c (integer *n, real *x0, real *x, real *y, real *z, integer *ii, real *f0)
Параметры
n - | заданное число точек разрыва аппроксимируемой кусочнопостоянной функции (тип: целый); |
x0 - | заданное значение x0 (тип: вещественный); |
x - | вещественный вектор длины n заданных значений точек разрыва; |
y - | вещественный вектор длины n заданных значений аппроксимируемой кусочно - постоянной функции; |
z - | вещественный вектор длины n вычисленных в точках x1, ..., xn значений аппроксимирующей кусочно - постоянной функции; |
i i - | целый вектор длины n, содержащий полученные номера i1, ..., ik (k ≤ n) точек разрыва xi 1, ..., xi k аппроксимиющей кусочно - постоянной функции; |
f0 - | вещественный рабочий вектор длины n |
Версии
iam1d_c - | среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией в режиме удвоенной точности. При этом параметры x0, x, y, z, f0 должны иметь тип double. |
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Для среднеквадратической аппроксимации кусочно - постоянной функции
f0 (x) = y1 , x ∈ ( x i -1, x1 ] , i = 1, ..., 7
такой, что
x0 = 0.
x = ( 2., 4., 5., 7., 10., 12., 15. )
y = ( 1., -1., -2., 2., -0.333333, 3., 1. )
обращение к подпрограмме имеет вид:
int main(void)
{
/* Initialized data */
static float x[7] = { 2.f,4.f,5.f,7.f,10.f,12.f,15.f };
static float y[7] = { 1.f,-1.f,-2.f,2.f,-.333333f,3.f,1.f };
/* Local variables */
extern int iam1r_c(int *, float *, float *, float *, float *, int *,
float *);
static int i__[7], j, n;
static float z__[7], f0[7], x0;
static int ii[7];
int i__1;
n = 7;
x0 = 0.f;
iam1r_c(&n, &x0, x, y, z__, ii, f0);
i__1 = n;
for (j = 1; j <= i__1; ++j) {
/* l1: */
i__[j - 1] = j;
}
printf("\n i__ = %9i %9i %9i %9i %9i %9i %9i \n",
i__[0],i__[1],i__[2],i__[3],i__[4],i__[5],i__[6]);
printf("\n x = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
printf("\n y = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7]);
printf("\n z__ = %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %9.2e \n",
z__[0], z__[1], z__[2], z__[3], z__[4], z__[5], z__[6], z__[7]);
printf("\n ii = %5i %5i %5i %5i %5i %5i %5i \n",
ii[0], ii[1], ii[2], ii[3], ii[4], ii[5], ii[6]);
return 0;
} /* main */
Результат: z__ = ( -0.4, -0.4, -0.4, 0.6, 0.6, 1.8, 1.8 )