我尝试使用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
答案 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语句输出每个步骤并与手计算进行比较。您可能会很快看到计算的不同之处。如果不清楚为什么计算不同,请将其分解成碎片。