Класс аппроксимирующих функций должен, по-видимому, содержать в качестве членов-данных два вектора одинаковой размерности для хранения последовательности узлов и значений заданной функции в этих узлах. Набор функций-членов, помимо обязательного набора конструкторов, должен включать методы реализации рассмотренных алгоритмов и, возможно, подпрограммы для интерфейса пользователя. Ниже приведено содержание включаемого файла с определением класса аппроксимаций, содержащего указанные компоненты с сопровождающими комментариями.
#include "polynom.h"
#include "matrix.h"
/*Класс полиномиальных аппроксимаций */
template <class YourOwnFloatType>
class Approximate
{
/*Для решения задачи аппроксимации нам понадобится массивы узлов и значений функции в узлах, т.е. объекты класса vector */
vector<YourOwnFloatType> x, y;/* Узлы и значения в узлах*/
public:/* Общедоступные методы */
/*Основной конструктор в качестве параметра принимает два вектора - вектор узлов и вектор значений в узлах */
throw xmsg("Количество узлов не совпадает с количеством значений в них");
/*Наверное, в этом случае задача аппроксимации теряет смысл: */
if(x.getm()<2)
throw xmsg("Слишком мало точек");
}
/*Конструктор копирования */
Approximate(Approximate &_): x(_.x), y(_.y) {} /*Результатом решения должен быть, естественно, объект класса polynom */
//Прототипы методов класса аппроксимаций
//Интерполяция каноническим полиномом
polynom<YourOwnFloatType> classic(),
//Интерполяция полиномом Ньютона
newton();
/*Интерполяция кубическими сплайнами. Возвращаемое значение - массив полиномов, организуемый динамически. По окончании работы память из под него в обязательном порядке необходимо освободить */
polynom<YourOwnFloatType>* spline();
/*Аппроксимация функции одной переменной по методу наименьших квадратов при степенном базисе. Аргумент - порядок полинома */
polynom<YourOwnFloatType> MNK(int);
};
/*Теперь определения методов класса полиномиальных аппроксимаций */
/*Первый столбец таблицы - значения в узлах, во всех последующих - разделённые разности соответствующего порядка */
for(int i=0;i<x.getm();i++)
table[i][0]=y[i];
for(int j=1;j<x.getm();j++)
for(int i=j;i<x.getm();i++)
table[i][j]=
(table[j-1][j-1]-table[i][j-1])/(x[j-1]-x[i]);
/*В диагонали сформированной матрицы находятся коэффициенты полинома в Ньютоновой форме. Для того, чтобы перейти к канонической записи полинома, проделаем следующее: */
/*Объявим и инициализируем два вспомогательных полинома - полиномиальный Х и полиномиальную единицу */
polynom<YourOwnFloatType> Odin,X=2,p;
Odin[0]=1,X[1]=1; /*инициализируем их */
/*сформируем искомый полином как сумму произведений одночленов соответствующих степеней */
for(int i=0;i<x.getm();i++)
{
polynom<YourOwnFloatType> temp=table[i][i]*Odin;
for(int j=0;j<i;j++)
temp*=(X-x[j]*Odin);
p+=temp;
}
return p;/* возвращаем результат */
}
//Интерполяция кубическими сплайнами.
/*Общее количество сплайнов равно количеству межузловых промежутков, т.е. x.getm()-1. В связи с этим результатом выполнения данной функции будет не один полином, а x.getm()-1*/