Аппроксимация Функций. Метод Гаусса

Тема в разделе "C/C++/C#", создана пользователем kobrin13, 20 ноя 2013.

  1. kobrin13

    kobrin13 New Member

    Регистрация:
    9 ноя 2013
    Сообщения:
    4
    Симпатии:
    0
    Только неделю начал изучать С, как дали вот такую задачку и я немного запутался. Подскажите, в чем косяк
    Вот задание:
    требуется аппроксимировать заданную исходную функцию f(x) многочленом на интервале [а, b]. Задано количество неизвестных параметров n, вид аппроксимации и m - количество точек, в которых задана функция. Таблица исходной функции Yi=f(Xj) вычисляется в точках Xi=a + (i-1)(b-a)/(m -1), i = 1, m. Используя полученную таблицу (Xi, Yi), требуется вычислить значения функций f(Xi), φ(Xj,с) и погрешность d(Xj) = f(Xj)- φ(Xj,с) в точках Xj = а + (j -1 )(b - а)/20; j = 1.21, построить графики и проанализировать качество полученной аппроксимации.
    Функция F(x) - ex / x3 – sin3(x); a, m, n = 4; b=7; вид аппроксимации - метод Гаусса.
    Вот, что получается, точнее не получается...

    #include <stdio.h>
    #include <math.h>
    #include <conio.h>

    int m = 4, n = 4, p;
    float r, q, s;
    float a = 4, b = 7;
    float x[5], y[5], xt[22], c[5];
    float g[5][5];

    void main( )
    {
    for (int i = 1; i <= m; i++)
    {
    x = a + (i - 1) * (b - a) / (m - 1);
    y = (exp(x) / pow(x, 3)) - pow(sin(x), 3);
    }

    for (int j = 1; j <= 21; j++)
    {
    xt[j] = a + (j - 1) * (b - a) / 20;
    }

    for (int i = 1; i <= n; i++)
    {
    g[1] = 1;
    }

    for (int i = 1; i <= n; i++)
    {
    for (int k = 2; k <= n; k++)
    {
    g[k] = g[k-1] * x;
    }
    }

    for (int k = 0; k < (n - 1); k++)
    {
    p = k;

    for (int m = (k + 1); m <= n; m++)
    {
    if (fabs(g[p][k]) < fabs(g[m][k]))
    p = m;
    }

    for (int j = k; j <= n; j++)
    {
    r = g[k][j];
    g[k][j] = g[p][j];
    g[p][j] = r;
    }

    r = y[k];
    y[k] = y[p];
    y[p] = r;

    for (int m = (k + 1); m < n; m++)
    {
    q = g[m][k] / g[k][k];
    y[m] = y[m] - (q * y[k]);

    for (int i = k; i < n; i++)
    {
    g[m] = g[m] - (q * g[k]);
    }
    }
    }

    x[n] = y[n] / g[n][n];

    for (int k = (n - 1); k >= 0; k--)
    {
    s = 0;

    for (int i = (k + 1); i < n; i++)
    {
    s = s + g[k] * x;
    }

    x[k] = (y[k] - s) / g[k][k];
    }

    for (int i = 1; i <= 5; i++)
    {
    printf("x[%d] = %f\n", i, x[i-1]);
    }
    getchar();
    }
     
Загрузка...

Поделиться этой страницей