我希望循环运行,直到等式的结果等于前一个结果

时间:2014-11-30 00:38:05

标签: while-loop fortran

我正在FORTRAN中编写一个代码来计算行星的位置。我需要使用牛顿数值方法解决开普勒方程,我的循环遇到问题。代码如下所示。我可以编译它没有错误消息,但它不会运行。它只会陷入永远的循环中。我希望循环运行直到E(i)和以下结果相等。任何帮助将不胜感激。

do while (E(i)/=E(i+1))
    E(1)=M
    E(i+1)=E(i)-((M-E(i)+(p*sin(E(i))))/((p*cos(E(i)))-1))
end do

另外,我如何在程序开头定义变量“E”。我目前有这个,但'11'只是因为我最初的循环运行了10次。如果我没有指定循环运行的次数,我该如何定义变量?

double precision :: E(11)

1 个答案:

答案 0 :(得分:3)

我没有检查你的收敛实现是否正确,但你绝对不想检查确切的相等性。你必须允许一些不精确,因为浮点计算是不精确的

     (abs(E(i)-E(i+1))<eps)

其中eps是一个小数字。

由于@agentp建议您不要更改i,因此您始终使用2个值E(i)E(i+1)i,无论您在循环之前设置了什么)。您不使用数组的任何其他元素。

对于可以有任何长度的数组,根据您的需要,理论上可以使用

     double precision, allocatable :: E(:)

但你可能根本不想使用数组而只需要两个标量值

 double precision :: E1, E2

 E1 = M
 do
    E2 = E1 - ((M-E1+(p*sin(E1))) / ((p*cos(E1))-1))

    if (abs(E1-E2) < eps) exit
    E1 = E2
 end do

请注意,新代码(而不是旧real(....))最好使用种类符号(double precision)。