2015-11-11 76 views
1
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:Fortran數組unclassiable語句

k2=(x(i)+h/2)-(y(i)+(h/2)*k1))+2 
    k3=(x(i)+h/2)-(y(i)+(h/2)*k2))+2 

我得到 「在不可分類的聲明(1)」,用(1)指向k2和k3。我看不出我做錯了什麼,因爲k1和k4遵循類似的結構,而且看起來他們沒有任何問題。

回答

1

對於k2k3,似乎錯誤消息來自太多右括號「)」。另一個錯誤是,陣列xy需要聲明爲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