指数泰勒级数

时间:2014-03-02 01:45:30

标签: c factorial taylor-series

这是我到目前为止的代码,因为我仍在试图弄清楚如何设置它,所以有点乱,但我无法弄清楚如何获得输出。该代码应该采用指数的泰勒级数多项式,并检查获得近似值所需的迭代次数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*Prototype for functions used*/
double factorial (int);

int main()
{
   double input = 0;
   double exp_val;
   double delta = 1;
   int f =0;
   int n = 0;
   double taylor;
   int total;
   printf("Plese enter the exponent to check for convergence:\n");
   scanf("%lf", &input);
   exp_val = exp(input);
   printf("  #     Iter      e^X      Sum     Diff\n");
   printf("----   ------   -------   -----  --------");

   while(delta > 0.00001)
   {
      f = factorial(n);
      taylor = ((pow(input,n))/ f);
      delta = (exp_val - taylor);
      printf("%d %f %f %f/n", (n+1), exp_val, taylor, delta);
      n++;
   }
   system("pause");


}

double factorial (int n)
{
  int r = 0;
  int sum = 1;
  int total = 0;
  if (n == 0)
    return total =1;
  else
  {
     for(r; r<n; r++)
     {
        sum = sum * r;
        total = sum + 1;

     }

     return total;
  }

}

2 个答案:

答案 0 :(得分:2)

在这里,我已经修好了它,没有改变你的方法,除了我真正需要的部分。在代码之前我们必须澄清的一件事是如何制作泰勒多项式。它不是第一个术语加上第n个术语,而是第一个术语第n个术语的所有术语的总和< / em>的。因此,您必须使用当前 nth term 而不是以其他方式增加taylor变量。

这是代码,其中有简短的评论作为解释:

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

/*Prototype for functions used*/
unsigned long long factorial( int );    // <-- made it return unsigned long long

int main( )
{
    double input = 0;
    double exp_val;
    double delta = 1;
    unsigned long long f = 0;   // <-- changed its type
    int n = 0;
    double taylor = 0;  // <-- initialized with 0
    printf( "Plese enter the exponent to check for convergence:\n" );
    scanf( "%lf", &input );
    exp_val = exp( input );
    printf( " #          e^X            Sum           Diff\n" );        // <-- made some cosmetic changes
    printf( "---      ---------      ---------      ---------\n" );     // <-- added \n

    while ( delta > 0.00001 )
    {
        f = factorial( n );
        taylor += ( ( pow( input, n ) ) / f );  // += instead of =
        delta = ( exp_val - taylor );
        printf( "%2d    %12f   %12f   %12f\n", ( n + 1 ), exp_val, taylor, delta ); // <-- replaced / with \ before the n
        n++;                                                                        // and made some edits to make it look better
    }
    system( "pause" );
    return 0;           // <-- better add this
}

unsigned long long factorial( int n )   // <-- made it return unsigned long long
{
    int r = 0;
    unsigned long long sum = 1; // <-- changed its type
    if ( n == 0 )
        return sum; // <-- this
    else
    {
        for ( r; r<n; r++ )
        {
            sum *= r + 1;   // <-- changed this
        }

        return sum; // <-- and this
    }
}

您必须记住,您可能不会输入太高的值。任何高于input == 4类型的东西都会打破它,因为,你看,即使是4,它也可以首先在第19个循环中减少阈值以下的误差delta。由于n == 5pow( 5, 21 ) / factorial( 21 )到达n21的计算不准确,该计划似乎失败了0.000034 // the result this programme finds 0.0000093331055943447405008542892329719 // the result Calculator finds

input

所以,是的...如果你希望这个程序使用更大的input值,你需要一个更好的方法。不从头开始计算第n个术语并从(n - 1)术语计算它可能会有所帮助,直到其他人有更大的{{1}}值。说。

答案 1 :(得分:1)

几个问题:

  1. int r = 0; ... for(r; r<n; r++)更改为int r; ... for(r=1; r<=n; r++)int r = 1; ... for(; r<=n; r++)

  2. printf("%d %f %f %f/n"更改为printf("%d %f %f %f\n"添加\n

  3. "... --------"更改为"... --------\n"

  4. delta = (exp_val - taylor);更改为delta = fabs(exp_val - taylor);

  5. 更改为double taylor = 0.0;初始化。

  6. 更改为taylor += ((pow(input,n))/ f);注意:+ =

  7. 轻微:&#34;请&#34;不是&#34; Plese&#34;。

  8. 轻微:放弃int total;