Реализация значений гибельтрова пространства

У меня есть задача написать программу:

Пусть Нp[0, 1] - гильбертово пространство функций, суммируемых с квадратом на [0, 1], скалярное произведение в котором имеет вид (x,y) = x(t)y(t)p(f)dt

где p(t) непрерывна на [0, 1] и p(t) > 0 на [0, 1]. Для заданной функции x(t) принадлежащей Hp[0, 1] найти элемент наилучшего приближения элементами подпространства L многочленов степени n <= 3. Составить и реализовать на ЭВМ алгоритм решения этой задачи, предусматривающий:

  1. ортогонализацию базиса L (вычисление интегралов по формуле Симпсона с шагом 0,05);
  2. выдачу на печать коэффициентов многочлена u*(t) по степеням и величины p(x, L) = ||x - u*| Hp[0,1];
  3. в случае, когда весовая функция p(t) зависит от параметра a, исследование зависимости p(x, L) от a при а € [0, 1], изменяющемся с шагом 0,1;
  4. построение графиков x(t) и элемента наилучшего приближения (t) (в вариантах с параметром - только при а = 0 и а = 1);
  5. проверку правильности составления алгоритма на варианте x(t) = t^3, p(t) = 1.

Я реализовал для начала вычисление по формуле Симпсона с шагом 0.05:

public static double Integrate(Func<double, double> func, double a, double b)
{
    double sum = 0;
    double n = 10;
    while (Math.Abs((b - a) / n) > 0.05)
    {
        n++;
    }
    double h = (b - a) / n;
    double x = a + h;
    while (x < b)
    {
        sum += 4 * func(x);
        x += h;
        sum += 2 * func(x);
        x += h;
    }
    sum = (h / 3) * (sum + func(a) - func(b));

    return sum;
}

Тестирую на данных

x_t = (Func<double, double>)(t => Math.Pow(1.0 + t * t, 1.0 / 3.0));
p_t = (Func<double, double, double>)((t, alpha) => 1.0 + alpha * Math.Pow(t, 2.0));

Сделал вывод графиков x(t). Но у меня проблема с расчетом элементов и нормы наилучшего приближения.

При ручном расчете, будет что элемент наилучшего приближения получается:

1
0
0,4
-0,1

А норма наилучшего приближения -

4,8E-05

Но я не могу получить эти значения. Вопрос как рассчитать эти значения с учетом ортогонализацией базиса L и какой код написать?

P.S Можно на любом удобном языке. (C#/C++/Python) Я бы желал разобраться и понять как лучше сделать мне.


Ответы (0 шт):