Реализуя серию маклаурина, но получаю неправильный ответ
Я пытаюсь реализовать серию 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;
}
Тестируемый ЗДЕСЬ.