|
Текст подпрограммы и версий ia01r_c.zip |
Тексты тестовых примеров tia01r_c.zip |
Построение наилучшего среднеквадратического приближения одномерной дискретной функции на множестве кусочно - монотонных функций.
Пусть задана дискретная фунkция F = (f1, f2, ..., fN). Отыскивается дискретная функция T = (t1, t2, ..., tN), для которой
N
∑ pk*( tk - fk )2 =
k=1
N
= inf ∑ pk*( yk - fk )2 ,
Y∈V k=1
где P = (p1, p2, ..., pN) - положительная весовая функция, V - множество дискретных функций Y = (y1, y2, ..., yN) удовлетворяющих условиям кусочной монотонности:
mk ( yk+1 - yk ) ≥ 0 , k = 1, 2, ..., N-1
с заданными параметрами mk, принимающими значения 1, - 1 или 0 и априорно характеризующими поведение искомой функции.
B подпрограмме реализован прямой метод решения задачи, требующий не более 3N2 арифметических операций.
Самарин M.K. Среднеквадратическая аппроксимация кусочно - монотонными функциями, Сб. "Численный анализ на ФОРТРАНе", вып.15, Изд-во МГУ, 1976.
int ia01r_c (real *f, real *t, real *p, integer *m, integer *n)
Параметры
| f - | вектоp значений заданной дискретной функции (тип: вещественный); |
| t - | вектоp значений искомой функции (тип: вещественный); |
| p - | вектоp весовых коэффициентов (тип: вещественный); |
| m - | вектоp размерности n, в первых n - 1 компонентах которого заданы параметры mk, определяющие условия кусочной монотонности, а последняя компонента является рабочей (тип: целый); |
| n - | размерность вещественных вектоpов f, t и p. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Для приближения дискретной функции F = (0., 2., - 5., 1., - 1.) при весовых коэффициентах, равных единице, на множестве Y, удовлетворяющих условиям
yk+1 - yk ≥ 0 , k = 1, 2, 3, 4 ,
обращение к подпрограмме имеет вид:
int main(void)
{
/* Initialized data */
static float f[5] = { 0.f,2.f,-5.f,1.f,-1.f };
static float p[5] = { 1.f,1.f,1.f,1.f,1.f };
static int m[5] = { 1,1,1,1,0 };
/* Local variables */
extern int ia01r_c(float *, float *, float *, int *, int *);
static int n, i;
static float t[5];
n = 5;
ia01r_c(f, t, p, m, &n);
for (i = 1; i <= 5; ++i) {
printf("\n %16.7e \n",t[i-1]);
}
return 0;
} /* main */
Результат:
t = (-1., -1., -1., 0., 0.)