我试图使用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语句输出每个步骤,并与你的手工计算进行比较。你可能很快就会发现计算的分歧。如果不清楚计算不同的原因,请将其分解。