2012-03-28 449 views
-1

我試圖用fortran編寫一個exp(x)/ sin(x)的泰勒級數展開式,但是當我測試我的小數實現(N = 3和X = 1.0)並手動添加它們,結果不符合我的預期。手邊我計算了4.444 ..,並且我發現了程序7.54113。你能否檢查我的代碼並告訴我是否有任何問題。Fortran中exp(x)/ sin(x)的泰勒級數展開

這裏是在WolframAlpha的E 1 X/SIN(X)的展開公式:http://www.wolframalpha.com/input/?i=e%5Ex%2Fsin%28x%29

PROGRAM Taylor 
IMPLICIT NONE 


INTEGER ::Count1,Count2,N=3 
REAL:: X=1.0,Sum=0.0 
COMPLEX ::i=(0.0,0.1) 
INTEGER:: FACT 

    DO Count1=1,N,1 
    DO Count2=0,N,1 
     Sum=Sum+EXP(i*X*(-1+2*Count1))*(X**Count2)/FACT(Count2) 
    END DO 

END DO 

PRINT*,Sum 

END PROGRAM Taylor 

INTEGER FUNCTION FACT(n) 
    IMPLICIT NONE 
    INTEGER, INTENT(IN) :: n 
    INTEGER :: i, Ans 
    Ans = 1 
    DO i = 1, n 
    Ans = Ans * i 
    END DO 
    FACT = Ans 
END FUNCTION FACT 
+4

嘗試在Excel中編寫Taylor條件(或其他...),然後在Fortran中重寫它。這不是Fortran問題,而是理解如何將函數擴展到良好擴展的問題。 – Rook 2012-03-28 10:17:23

+0

您是否試圖計算複雜或實數值情形的泰勒級數展開式? – talonmies 2012-03-28 11:09:23

+0

'COMPLEX :: i =(0.0,0.1)'哎呀? – steabert 2012-03-28 16:24:01

回答

2

沃爾夫勒姆文章的擴展公式是用q = e **(ix)表示的,所以有一個複雜的術語。因此「和」應該被宣佈爲複雜。

如前所述,階乘函數是簡單的。小心溢出。

最好將你的程序放到一個模塊中,然後從主程序中「使用」那個模塊。儘可能多地使用編譯器調試選項。例如,當使用適當的警告選項時,gfortran會警告「總和」的類型:「警告:從COMPLEX(4)到REAL(4)轉換中可能發生的值更改」。如果您使用的是gfortran,請嘗試:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace

由於您可以手動執行此問題,因此請嘗試使用寫入語句輸出每個步驟並與您的手形計算進行比較。您可能會很快看到計算分歧的位置。如果不清楚爲什麼計算不同,請將其分解成幾部分。

+0

不是在我看到的關於x = 0的系列擴展中。替代形式當然有它。我正在從頂部看第九個盒子。 – duffymo 2012-03-28 14:58:28

+0

看起來海報在第15個方框中使用雙重和,「系列表示」,而不是「關於零的系列展開」中的總和。 – 2012-03-28 15:27:28

+0

我沒有那麼遠;我在方框9停了下來。我會看看。 – duffymo 2012-03-28 16:02:05

3

我沒有看到在擴張的鎢任何複雜的方面,所以我不知道你爲什麼認爲你需要指數項中的複數。而且你無法按照你編程的方式得到1/x項。你需要一個x **( - 1.0)的術語。

您的因子實現也很樸素。

我建議您忘記循環和階乘,並從多項式,係數和Horner的評估方法開始。得到這個工作,然後看看你是否可以理清循環。