реализуя серию маклаурина, но получаю неправильный ответ - PullRequest
0 голосов
/ 25 декабря 2018

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

f (x) = 2 + 0-13x ^ 2 + 26 * x ^ 3 + (- 299/12) * (x ^ 4) + 13 * x ^ 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 ]

0 голосов
/ 27 декабря 2018

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

  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 и возвращает ответ.

0 голосов
/ 28 декабря 2018

Цель OP - оценить многочлен пятой степени

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;
}

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

0 голосов
/ 25 декабря 2018

Несколько вопросов здесь.Похоже, вы не совсем понимаете, как работают массивы в 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.

...