Fortran 数组不可分类语句
Fortran array unclassiable statement
program rk4
real x(200), y(200), h, k1, k2, k3, k4
integer i
read*,x(0),y(0),h
do i=0,10
k1=x(i)-y(i)+2
x(i+1)=x(i)+h
k2=(x(i)+h/2)-(y(i)+(h/2)*k1))+2
k3=(x(i)+h/2)-(y(i)+(h/2)*k2))+2
k4=(x(i+1))-(y(i)+h*(k3))+2
y(i+1)=y(i)+(h/6)*(k1+2*k2+2*k3+k4)
print*, 'x=', x(i+1), 'y=', y(i+1)
enddo
end
第 9 行和第 10 行:
k2=(x(i)+h/2)-(y(i)+(h/2)*k1))+2
k3=(x(i)+h/2)-(y(i)+(h/2)*k2))+2
我得到 "Unclassifiable statement at (1)",其中 (1) 指向 k2 和 k3。我看不出我做错了什么,因为 k1 和 k4 遵循类似的结构,而且它们似乎没有任何问题。
看来错误信息是因为 k2
和 k3
的右括号“)”太多了。另一个错误是数组 x
和 y
需要声明为 x(0:200)
和 y(0:200)
,因为您正在访问 x(0)
和 y(0)
。如果以上两点是固定的,代码应该可以正常工作。
作为旁注,我真的建议放置 implicit none
,这对于检测潜在的错误很有用,并在浮点运算中使用 2.0 而不是 2 之类的浮点文字(除了像 x**2
).在下面的代码中,我将分析 solution 与您的 RK4 结果进行了比较,它们似乎相互吻合。
program rk4
implicit none !<--- this is useful
real x(0:200), y(0:200), h, k1, k2, k3, k4 !<--- indices now start from 0
integer i
read *, x(0), y(0), h
do i = 0, 10
x(i+1) = x(i) + h
k1 = x(i) - y(i) + 2.0 ! y' = x - y + 2
k2 = ( x(i) + h/2.0 ) - ( y(i) + h/2.0 * k1 ) + 2.0 !<--- ")" has been removed
k3 = ( x(i) + h/2.0 ) - ( y(i) + h/2.0 * k2 ) + 2.0 !<--- here also
k4 = ( x(i+1) ) - ( y(i) + h * k3 ) + 2.0
y(i+1) = y(i) + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 )
print*, 'x=', x(i+1), 'y(rk4)=', y(i+1), &
'y(ana)=', x(i+1)+1.0 + (y(0)-x(0)-1.0) * exp(-x(i+1)+x(0))
enddo
end
program rk4
real x(200), y(200), h, k1, k2, k3, k4
integer i
read*,x(0),y(0),h
do i=0,10
k1=x(i)-y(i)+2
x(i+1)=x(i)+h
k2=(x(i)+h/2)-(y(i)+(h/2)*k1))+2
k3=(x(i)+h/2)-(y(i)+(h/2)*k2))+2
k4=(x(i+1))-(y(i)+h*(k3))+2
y(i+1)=y(i)+(h/6)*(k1+2*k2+2*k3+k4)
print*, 'x=', x(i+1), 'y=', y(i+1)
enddo
end
第 9 行和第 10 行:
k2=(x(i)+h/2)-(y(i)+(h/2)*k1))+2
k3=(x(i)+h/2)-(y(i)+(h/2)*k2))+2
我得到 "Unclassifiable statement at (1)",其中 (1) 指向 k2 和 k3。我看不出我做错了什么,因为 k1 和 k4 遵循类似的结构,而且它们似乎没有任何问题。
看来错误信息是因为 k2
和 k3
的右括号“)”太多了。另一个错误是数组 x
和 y
需要声明为 x(0:200)
和 y(0:200)
,因为您正在访问 x(0)
和 y(0)
。如果以上两点是固定的,代码应该可以正常工作。
作为旁注,我真的建议放置 implicit none
,这对于检测潜在的错误很有用,并在浮点运算中使用 2.0 而不是 2 之类的浮点文字(除了像 x**2
).在下面的代码中,我将分析 solution 与您的 RK4 结果进行了比较,它们似乎相互吻合。
program rk4
implicit none !<--- this is useful
real x(0:200), y(0:200), h, k1, k2, k3, k4 !<--- indices now start from 0
integer i
read *, x(0), y(0), h
do i = 0, 10
x(i+1) = x(i) + h
k1 = x(i) - y(i) + 2.0 ! y' = x - y + 2
k2 = ( x(i) + h/2.0 ) - ( y(i) + h/2.0 * k1 ) + 2.0 !<--- ")" has been removed
k3 = ( x(i) + h/2.0 ) - ( y(i) + h/2.0 * k2 ) + 2.0 !<--- here also
k4 = ( x(i+1) ) - ( y(i) + h * k3 ) + 2.0
y(i+1) = y(i) + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 )
print*, 'x=', x(i+1), 'y(rk4)=', y(i+1), &
'y(ana)=', x(i+1)+1.0 + (y(0)-x(0)-1.0) * exp(-x(i+1)+x(0))
enddo
end