这是我到目前为止的代码,因为我仍在试图弄清楚如何设置它,所以有点乱,但我无法弄清楚如何获得输出。该代码应该采用指数的泰勒级数多项式,并检查获得近似值所需的迭代次数。
#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;
}
}
答案 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 == 5
在pow( 5, 21 ) / factorial( 21 )
到达n
时21
的计算不准确,该计划似乎失败了0.000034 // the result this programme finds
0.0000093331055943447405008542892329719 // the result Calculator finds
:
input
所以,是的...如果你希望这个程序使用更大的input
值,你需要一个更好的方法。不从头开始计算第n个术语并从(n - 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++)
将printf("%d %f %f %f/n"
更改为printf("%d %f %f %f\n"
添加\n
将"... --------"
更改为"... --------\n"
将delta = (exp_val - taylor);
更改为delta = fabs(exp_val - taylor);
更改为double taylor = 0.0;
初始化。
更改为taylor += ((pow(input,n))/ f);
注意:+ =
轻微:&#34;请&#34;不是&#34; Plese&#34;。
轻微:放弃int total;