2015-02-17 5 views
-1

У меня есть простой код для теоремы Тейлора для функции cosh().Теорема Тейлора C

Я пытаюсь поймать ошибку - результат иногда близок к реальному ответу.

Как это сделать правильно?

Когда мой старт является 0, конец составляет 5, а подразделяет 5 это дало хорошие результаты, но когда я ставлю 5 в начале и 10 в конце концов, результат находится дальше от ожидаемого значения ,

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

int poww(float number, int a) 
{ 
    float result = 1.0; 
    int i; 
    if(a != 0); 
    { 
     for(i = 0; i < a; i++) { 
      result = result * number; 
     } 
    } 
    return result; 
} 

int factorial(int n) 
{ 
    switch (n) { 
    case 0: 
     return 1; 
     break; 
    default: 
     return n * factorial(n-1); 
    } 
} 

void main() 
{ 
    puts("Enter start: "); 
    float start; 
    scanf("%f", &start); 

    puts("\nEnter end: "); 
    float end; 
    scanf("%f", &end); 

    puts("\nSubintervals:"); 
    int subinterval; 
    scanf("%d", &subinterval); 

    float h = (end - start)/(float)subinterval; 
    printf("h is : %3.2f \n", h); 

    double x, result, temp; 
    int n; 

    for(x = start; x <= end; x += h) { 
     result = 0; 
     for(n = 0 ; ; n++) { 
      temp = poww(x, 2 * n)/(factorial(2 * n) * 1.0); 
      if(temp < 0.00001) { 
       break; 
      } else { 
       result = result + temp; 
       printf("X = %f temp = %f, result = %f\n", x, temp, result); 
      } 
     } 
     printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x)); 
    } 
    puts("Press any key..."); 
    getchar(); 
} 

ПРОБЛЕМА РЕШИТЬ:

функция возвращает целое число, а не двойной, и я изменил каждый поплавок в два раза.

+0

Почему вы печатая результат ехр? –

+0

Какой ожидаемый результат и фактический? –

+0

«результат иногда близок к реальному ответу» - ну разве это не то, что вы хотите? Вы хотите, чтобы результат был далек от фактического ответа? –

ответ

1

Изменить все float типов в double и использовать double в качестве возвращаемого типа для функций factorial() и poww() тоже. В этом случае это самые последние два.

Кроме того, тип возврата на main() должен быть int, а не void.

[Я только что закончил удаление мертвого выражения if в poww() и заметил, что функция только «ускоряет» вычисление pow(). Если вы беспокоитесь о производительности, беспокойтесь о вычислении факториала и мощности на каждом члене, вместо того, чтобы умножить предыдущий член на x^2 и делить на (2 * n) * (2 * n-1).]

я получаю хорошие результаты между 4 и 10 на этом незначительные исправления вашего кода:

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

double poww(float number, int a) 
{ 
    float result = 1.0; 
    int i; 
    for(i = 0; i < a; i++) 
    { 
     result = result * number; 
    } 
    return result; 
} 

double factorial(int n) 
{ 
    switch (n) 
     { 
      case 0: return 1; 
        break; 
      default: return n * factorial(n-1); 
     } 
} 

int main(){ 

    puts("Enter start: "); 
    float start; 
    scanf("%f", &start); 

    puts("\nEnter end: "); 
    float end; 
    scanf("%f", &end); 

    puts("\nSubintervals:"); 
    int subinterval; 
    scanf("%d", &subinterval); 

    float h = (end - start)/(float)subinterval; 
    printf("h is : %3.2f \n", h); 

    double x, result, temp; 
    int n; 

    for(x = start; x <= end; x += h){ 
     result = 0; 
     for(n = 0 ; ; n++){ 
      temp = poww(x, 2 * n)/(factorial(2 * n) * 1.0); 
      if(temp < 0.00001){ 
       break; } 
      else{ 
       result = result + temp; 
       printf("X = %f temp = %f, result = %f\n", x, temp, result); 
      } 
     } 
       printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x)); 
    } 

    puts("Press any key..."); 
    getchar(); 
    return 0; 
} 
+0

Предложите 'float result = 1.0;' -> 'double result = 1.0;' – chux

+0

'if (a! = 0);' ничего не делает - обратите внимание на final ';'. В любом случае, 'if (a! = 0);' не требуется. – chux

+0

@chux Да, я просто получил это тоже, спасибо! Крепление ... –

Смежные вопросы