2016-10-17 37 views
0

我需要执行泰勒系列arctangent 50次。意思是arctan泰勒级数域[-1,1]之间的50个数字。我已经用手动用户输入测试了它,并且它工作正常,但是对于50个不同输入的for循环,我在代码中增加了0.01,并且它们的相应结果不成功。到目前为止,我已经尝试过所有我能想到的,我没有想法。任何帮助,将不胜感激。围绕Taylor系列的括号与另一个for循环有冲突吗?我怀疑这是括号,但是当我尝试修复它时没有工作。Arctan泰勒系列在C

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

main (void) { 
    double n; 
    double x; 
    double tSeries=0.0; 
    double t2; 
    double t1; 

    for(n=0;n<=50;++n) { 
     for(x=-1;x<=1;x=x+0.01) { 

      t1=(pow(x,2*n+1))*pow(-1,n); 
      t2=t1/(2*n+1); 
      tSeries+=t2; 

      printf("arctan(%lf)=%lf\n",x,tSeries); 
     } 
    } 
    return 0; 
} 
+2

你的描述看起来相当困惑,代码没有多大帮助。它看起来像'x'表示arctangent函数的参数,但该变量在程序过程中需要201个不同的值,而不是50.变量'n'在程序中需要51个值,但这似乎代表扩张中的一个术语。最好的情况是,你的嵌套是向后的 - 'x'上的循环应该是外部的,或者对我来说是这样。 –

+0

您应该使用函数来计算传入的值的反正切值。然后安排一个循环来调用具有不同值的循环,并在循环中每次打印结果。这将避免这些问题。功能是你的朋友。 –

+0

请注意,浮点数的重复增量通常是一个糟糕的主意。 “浮点数就像一小堆沙子;每次移动一个沙子,你就会失去一点沙子,并且会得到一点污垢。”(Kernighan&Plauger - 编程风格的元素,引用了这位多产的作者的匿名)。你可以使用'for(int i = -100; i <= 100; i ++){double x = i/100.0; ...}以获得更好的准确性。您可以在块的顶部(在任何版本的C中的'{')之后声明变量,并且最好将变量的范围减小到最小。 –

回答

1

你得到了混合的循环,内部的混合,反之亦然。

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
int main(void) 
{ 
    double n; 
    double x; 
    double tSeries = 0.0; 
    double t2; 
    double t1; 

    for (x = -1; x <= 1; x += 0.01) { 
    for (n = 0; n <= 50; n++) { 
     t1 = (pow(x, 2 * n + 1)) * pow(-1, n); 
     t2 = t1/(2 * n + 1); 
     tSeries += t2; 
    } 
    printf("arctan(%lf)=%lf (%lf)\n", x, tSeries, atan(x)); 
    tSeries = 0.0; 
    } 
    return 0; 
} 
+0

在内循环开始之前,您是否需要重置'tSeries = 0.0;'? –

+0

@JonathanLeffler啊!我已经想知道了。谢谢! – deamentiaemundi

+0

噢:请: - 'double tSeries = 0.0;'在外部循环内部并消除外部变量。你可以在内部循环中声明和初始化't1'和't2'。而且,在稍微大一点的层面上,内部循环应该都是反正切的函数 - 这首先会避免反向循环的问题。 –

2

在您发布的代码中,内部循环覆盖变量x,外部循环覆盖功率n。

我认为你想为每个x的值求和n的值,所以n上的循环应该是内部循环。

我认为你也需要为你的总和,t系列为每个x值。

最后,我希望你在计算总和后打印答案,所以printf应该在n循环之外。

幂级数的评估有一些技巧。我喜欢数字食谱这种事情。尝试第5章关于功能的评估。 (C中的Numerical Recipes,Press等人,2nd Ed。,1992,CUP。)

立即注意到的一件事是,固定幂级数的上限,你正在评估一个多项式。我的NR副本第5.3节强烈建议不要使用pow()的调用总和。他们对此非常坚定!

让我知道你是否希望我发布正确的代码。

+1

他们是否更改了数字食谱的许可证,或者您为什么会建议? – deamentiaemundi

+0

我没有Numerical Recipes的代码,但我的书桌上有这本书。当我需要编写一个数值算法时,我总是检查一下NR对它的说明。这为我节省了大量的时间。如果您想使用其确切代码,我不确定授权安排。 – gusgw

+0

我知道很多我在OP中的规定都很奇怪,但我可以控制的一些东西,并且由我的教师指定为某种方式。虽然我很欣赏这个帮助,但我一定会看看那些文字,以帮助我在未来的C中努力。我已经明白了,但非常感谢。 – cphoenix