Fortran中exp(x)/ sin(x)的泰勒级数展开式

时间:2012-03-28 09:02:35

标签: fortran fortran90 taylor-series

我尝试使用fortran为exp(x)/ sin(x)写一个泰勒级数展开,但是当我测试我的实现小数(N = 3和X = 1.0)并手动添加它们时,结果是不符合我的期望。手动上我计算了4.444 ..,并且通过程序我找到了7.54113。你能检查一下我的代码并告诉我是否有任何错误。

这是wolframalpha中e ^ 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

2 个答案:

答案 0 :(得分:3)

在Wolfram的扩展中我没有看到任何复杂的术语,所以我想知道为什么你认为你需要指数项中的复数。你无法按照编程方式获得1 / x术语。你需要一个x **( - 1.0)的术语。

你的因子实现也很幼稚。

我建议您忘记循环和阶乘,并从多项式,系数和Horner的评估方法开始。让它工作,然后看看你是否可以整理循环。

答案 1 :(得分:2)

Wolfram文章使用q = e **(ix)表示扩展公式,因此存在一个复杂的术语。因此,“sum”应该被宣布为复杂的。

如前所述,阶乘函数是简单的。小心溢出。

最好将程序放入模块中,并从主程序中“使用”该模块。使用尽可能多的编译器调试选项。例如,当使用适当的警告选项时,gfortran会警告“sum”的类型:“Warning:从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

由于您可以手动执行此问题,因此请尝试使用write语句输出每个步骤并与手计算进行比较。您可能会很快看到计算的不同之处。如果不清楚为什么计算不同,请将其分解成碎片。