我正在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)
答案 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
)。