2015-12-14 47 views
1

當我編譯我的代碼時,結果很奇怪(非常大,如-1.112E + 09)。當我通過Matlab計算時,答案是-0.0873。如何在Fortran子程序中創建函數?

program test 
real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2 
real :: Y 

call J(X11,X22,X33,BE1A1,BE1B1,M) 
Y = M 
print *,Y 

end program test 

    subroutine J(X1,X2,X3,BE1A1,BE1B1,M) 

    real, intent(in) :: X1,X2,X3,BE1A1,BE1B1 
    real, intent(out) :: M 

    M = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1) 

    contains 

    real function J1(X1,X2,X3,EPS1,EPS2) 

    real, intent(in) :: X1,X2,X3,EPS1,EPS2 
    real :: R 
    R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2) 
    J1 = log(R+X2-EPS2) 

    end function J1 

    end subroutine J 
+1

您應該知道隱式的鍵入規則。特別是對於主程序中的'm'。 – francescalus

+0

謝謝,我想我得到了關鍵點。 –

回答

2
program test 

real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2 
real :: Y 

call J(X11,X22,X33,BE1A1,BE1B1,CM) 
Y = CM 
print *,Y 

end program test 

    subroutine J(X1,X2,X3,BE1A1,BE1B1,CM) 

    real, intent(in) :: X1,X2,X3,BE1A1,BE1B1 
    real, intent(out) :: CM 

    CM = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1) 

    contains 

    real function J1(X1,X2,X3,EPS1,EPS2) 

    real, intent(in) :: X1,X2,X3,EPS1,EPS2 
    real :: R 
    R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2) 
    J1 = log(R+X2-EPS2) 

    end function J1 

    end subroutine J 

現在我可以用Matlab獲得相同的結果!

+0

@VladimirF感謝您的建議。我很欣賞 –

+0

這個could仍然會比'implicit none'更安全。並且請以某種方式清楚你改變了什麼,很難在代碼中找到它。 –