2016-10-17 38 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