3

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

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

}
4

2 回答 2

2

在这里,我已经修复了它,没有改变你的方法,除了我真正不得不做的部分。在编写代码之前我们必须澄清的一件事是泰勒多项式是如何产生的。它不是第一项加上第n项,而是从第一项到第n项的所有项的总和。因此,您肯定必须taylor通过当前第 n 项而不是其他方式来增加变量。

这是代码,其中包含简短的注释作为解释:

#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 == 4kind 的东西都会破坏它,因为你看,即使是 4,它也delta只能在第 19 个循环中首先将错误降低到阈值以下。n == 5由于对pow( 5, 21 ) / factorial( 21 )何时n到达的计算不准确,该程序似乎失败了21

0.000034    // the result this programme finds
0.0000093331055943447405008542892329719 // the result Calculator finds

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

于 2014-03-02T04:20:15.160 回答
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. 次要:“请”而不是“请”。

  8. 次要:掉落int total;

于 2014-03-02T04:24:57.137 回答