Реализуя серию маклаурина, но получаю неправильный ответ

Я пытаюсь реализовать серию Mauriac только для первых 7 функций серии. У меня есть массив, который содержит все значения (0) до 5 производных. но чтобы просто моя цель, мне нужно сделать эту математическую функцию:

F (X)=2+0-13x^2+26* х ^3+(-299/12)*(х ^4)+13* х ^ 5

так что если: f(2)= 175,3

но вместо этого код дает мне F (2)= 275,0

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x,i;

    double term [5] = {2,0,-13,26,-299,13};
    double answer;

    printf("\n\nEnter the value of x in the series :  ");
    scanf("%d",&x);

    term [2]*=(x*x);
    term [3]*=(x*x*x);
    term [4]*=(x*x*x*x)/12;
    term [5]*=(x*x*x*x*x);

    for (i=1; i <6; i++)
    {
        answer = answer + term[i];
    }

    printf("f(%d)= %lf",x,answer);

    return 0;
}

3 ответа

Несколько вопросов здесь. Похоже, вы не до конца понимаете, как работают массивы в C. term[5] это массив из 5 элементов. Первый индекс этого массива term[0], так как массивы всегда начинаются с 0. Затем происходит так.

  • term[0]
  • term[1]
  • term[2]
  • term[3]
  • term[4]

Что вы делаете, когда объявляете term массив, если вы пытаетесь поместить 6 значений в массив с 5 индексами. Это не работает, так что вам придется сделать term[6] создать 6 индексов, с фактическим индексом 6 вне границ. Еще одна вещь, которую я заметил, это то, что вы вручную делаете экспоненты ((x*x*x) и так далее), когда вы вычисляете каждый элемент вашего массива. Вы должны действительно использовать pow() функция от math.h, Эта функция из библиотеки C Math. Чтобы скомпилировать программу, включающую библиотеку C Math, вы должны указать ее для компоновщика.

Вместо того, чтобы собирать, как это,

$ cc program.c -o program

Вы бы скомпилировали так, чтобы включить библиотеку Math. Обратите внимание на -lm.

$ cc program.c -lm -o program

Я восстановил вашу программу, чтобы использовать pow() функция. Я также сделал x двойной, так как мы передаем его pow() и изменили %d в операторах printf и scanf к %f, Я также дал answer начальное значение 0, так как вы использовали переменную неинициализированной, как указали другие.

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

int main(void) {
    double x;
    int i;

    double term[6] = {2,0,-13,26,-299,13};
    double answer = 0;

    printf("\n\nEnter the value of x in the series :  ");
    scanf("%f",&x);

    term[2] *= pow(x, 2);
    term[3] *= pow(x, 3);
    term[4] *= pow(x, 4)/12;
    term[5] *= pow(x, 5);

    for (i = 0; i < 6; i++) {
        answer = answer + term[i];
    }

    printf("f(%f) = %f \n", x, answer);
    return 0;
}

Я проверил это, и ввод числа 2 в командной строке дает правильное значение: f(2.00000) = 175.33333,

Другая версия основной функции будет:

  int main(void) {
    double x;
    int i;

    double term[6] = {2,0,-13,26,-299.0/12.0,13};
    double answer = 0;
    double p = 1;

    printf("\n\nEnter the value of x in the series :  ");
    scanf("%lf",&x);

    for (i = 0; i < 6; i++, p*=x) {
        answer = answer + term[i] * p;
    }

    printf("f(%f) = %f \n", x, answer);
    return 0;
  }

Это устраняет избыточные умножения x и делает использование термина последовательным. В зависимости от вашего приложения это может быть адаптировано к функции, которая принимает число терминов, массив терминов и значение x и возвращает ответ.

Целью ОП является оценка полинома пятой степени

f (x) = 2 - 13x 2 + 26x 3 - (299/12) x 4 + 13x 5

Но опубликованный код имеет некоторые проблемы:

#include <stdio.h>

int main()
{
    int x,i;  // <- 'x' is declared as 'int'

    double term [5] = {2,0,-13,26,-299,13};  // <- this array has 6 elements, not 5
    double answer;
    // ...
    term [2]*=(x*x);
    term [3]*=(x*x*x);       //    Both 'x' and 12 are 'int', so an integer division
    term [4]*=(x*x*x*x)/12;  // <- is performed: 16/12 = 1 not 1.3333
    term [5]*=(x*x*x*x*x);   //    This is also inefficient

    for (i=1; i <6; i++)     // <- Given 'double term[5]', array indeces should be in [0, 5)
    {
        answer = answer + term[i];
    }
    // ...
}

Более эффективным способом оценки многочлена является метод Хорнера, который "позволяет вычислять многочлен степени n только с n - 1 умножениями и n - 1 сложениями".

Полином OP может быть записан как

f(x) = 2 + x(0 + x(-13 + x(26 + x(-299/12 + 13x))))

Ниже приведен пример такой реализации

#include <stdio.h>
#include <assert.h>

// Uses Horner's method to evaluate a polynomial
double evaluate_poly(double x, size_t n, double *coeffs)
{
    assert(n  &&  coeffs);
    double y = coeffs[--n];
    while (n)
    {
        y = coeffs[--n] + x * y;
    }
    return y;
}

int main(void)
{
    double terms[] = {
        2.0 , 0.0, -13.0, 26.0, -299.0/12.0, 13.0
    };
    size_t n_terms = sizeof terms / sizeof *terms;

    puts("  x         f(x)\n-----------------");
    for (int i = 0; i <= 10; ++i)
    {
        double x = i / 5.0;
        double answer = evaluate_poly(x, n_terms, terms);
        printf("%4.1lf   %10.6lf\n", x, answer);
    }

    return 0;
}

Тестируемый ЗДЕСЬ.

Другие вопросы по тегам