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



我试图使用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

我在Wolfram的扩展中没有看到任何复数项,所以我想知道为什么你认为你需要指数项中的复数。你不可能用你编程的方式得到这个1/x项。你需要一个x**(-1.0)项。

您的阶乘实现也相当幼稚。

我建议你忘记循环和阶乘,从多项式、系数和Horner的评估方法开始。让它发挥作用,然后看看你是否能整理出循环。

Wolfram的文章有一个用q=e**(ix)表示的展开式,所以有一个复杂的项。因此,"sum"应声明为复数。

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

最好将过程放入一个模块中,然后从主程序中"使用"该模块。使用尽可能多的编译器调试选项。例如,当使用适当的警告选项时,gfortran会对"sum"的类型发出警告:"警告:从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语句输出每个步骤,并与你的手工计算进行比较。你可能很快就会发现计算的分歧。如果不清楚计算不同的原因,请将其分解。

最新更新