Нужна помощь в программировании серий Mclauren и Taylor? - PullRequest
2 голосов
/ 27 мая 2010

Хорошо, вот что у меня есть:

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180;
  int i, val=0, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of 42 = %d\n", val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0.00, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==1)
      sign *= -1.0; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==1)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%g degrees) = %d\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

и вот вывод:

McLaurin of 42 = 0
Enter x in degrees:
42
0.733038-1.00000011.0000001
Taylor of sin(42 degrees) = -1073741824

Я подозреваю, что причина этих возмутительных чисел связана с тем, что я перепутал свои числа и числа? Но я просто не могу понять ... !! Возможно, это математическая вещь, но она никогда не была моей сильной стороной, не говоря уже о программе с исчислением. Также Mclaurin терпит неудачу, как он равен нулю? WTF! Пожалуйста, помогите исправить мой код Noobish. Я все еще новичок ...

---- Обновление ----

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180, val=0;
  int i, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==0)
      sign *= -1; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==0)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

Даёт мне странную ошибку.

/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot open output file a.exe: Device or resource busy
collect2: ld returned 1 exit status
Can anyone explain what's wrong now?

Ответы [ 3 ]

1 голос
/ 27 мая 2010

несколько вещей выпрыгивают:

  1. в McLauren вы определяете val (ваше вычисленное значение) как int. попробуйте определить его как число с плавающей точкой
  2. в Taylor вы только переворачиваете свой знак каждый раз, чтобы он показывал -1, 1, -1, -1, 1, 1 .... и т. Д.
  3. я думаю, что ваша формула для ряда Тейлора неверна, после обновления в wikipedia вам не следует звонить sin или cos (потому что это то, что вы пытаетесь вычислить)

удачи!

1 голос
/ 27 мая 2010

Этот, который уже упоминался, определенно неприятен:

  • val должен быть плавающей точкой в ​​McLaurin ()

Кроме того, вам нужно использовать %f или %g вместо %d при использовании printf () для распечатки ваших val s. Вот почему вы получаете такие сумасшедшие числа: числа с плавающей точкой интерпретируются как целые числа.

Кроме того, в Taylor () вам нужно изменить два оператора if на

if(i%2==0)

потому что вы Тейлор, расширяющий грех, а не потому.

Выполнение этих действий дает 0,669130 и 0,708945 для ответов серий Маклаурина и Тейлора, соответственно, с использованием того же числа терминов, что и в вашем коде. Если я добавлю еще два условия к ответу серии Тейлора (используйте i <4 вместо i <2), я получу 0.668793. Истинный ответ (с использованием того же числа, что и вы) - 0,669130, на который получен ответ из ряда Тейлора с добавлением еще 3 дополнительных терминов. </p>

1 голос
/ 27 мая 2010

Некоторые потенциальные источники ошибок:

  • у вашего значения pi недостаточно цифр для равномерной точности;
  • в вашей функции Maclaurin у вас есть val как целое число, по которому вы выполняете деление;
  • в Тейлоре вы используете только 2 термина в серии

Я думаю?

...