-1

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

2 回答 2

3

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

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

我建议你忘记循环和阶乘,从多项式、系数和霍纳的评估方法开始。让它工作,然后看看你是否可以解决这个循环。

于 2012-03-28T09:08:38.987 回答
2

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 语句输出每个步骤并与您的手动计算进行比较。您可能很快就会看到计算的分歧之处。如果不清楚为什么计算不同,请将其分解为多个部分。

于 2012-03-28T12:54:20.193 回答