我正在编写一个程序,以最小化四参数最小二乘拟合的卡方。我有很多问题,但现在程序一直给我同样的三个问题,我的子程序调用; " Assignment.f:12.25:
REAL sum0,sum1,sum2,sumWt0,sumWt,sumWt2
1
Assignment.f:48.72:
CALL sum2(sumWt2,Wt2)
2
错误:' sum2' at(1)的类型与(2)"的CALL不一致。 代码如下:
PROGRAM assignment
! A program designed to fit experiemental data, using the method
! of least squares to minimise the associated chi-squared and
! obtain the four control parameters A,B,h1 and h2.
!*****************************************************************
IMPLICIT NONE
INTEGER i,t0
REAL t(17),t2(17),Ct(17),eCt(17),W(17),Wt0(17),Wt(17),Wt2(17)
REAL A,B,h1,h2,Cs,matrix(2:2),inverse(2:2)
REAL sum0,sum1,sum2,sumWt0,sumWt,sumWt2
OPEN(21, FILE='data.txt', STATUS='OLD')
DO i=1,17
READ (21,*)t(i),Ct(i),eCt(i)
END DO
CLOSE(21)
!*****************************************************************
OPEN(21, FILE='outtest.txt', FORM='FORMATTED', STATUS='NEW')
DO i=1,17
WRITE(21,*)t(i),Ct(i),eCt(i)
END DO
CLOSE(21)
!Just to check input file is being read correctly.
!*****************************************************************
DO i= 1,17,1
t0= 1
t2(i)= (t(i))**2
W(i)= 1/(eCt(i))**2
Wt0(i)= W(i)*t0
Wt(i)= W(i)*t(i)
Wt2(i)= W(i)*t2(i)
!The above calculates Wt2, Wt and Wt0 for data.txt
END DO
CALL sum0(sumWt0,Wt0)
WRITE(*,*) 'sumWt0=', sumWt0
CALL sum1(sumWt,Wt)
WRITE(*,*) 'sumWt=', sumWt
CALL sum2(sumWt2,Wt2)
WRITE(*,*) 'sumWt2=', sumWt2
END
!Assign weighted t values to the A matrix
!*****************************************************************
!*****************************************************************
!****************************FUNCTIONS****************************
!*****************************************************************
!*****************************************************************
REAL FUNCTION sum0(sumWt0,Wt0)
IMPLICIT NONE
INTEGER i,t0
REAL sumWt0,Wt0(17),eCt(17),W(17)
W(i)= 1/((eCt(i))**2)
DO i= 1,17,1
t0= 1
Wt0(i)= W(i)*t0
END DO
SumWt0= 0.0
DO 10 i=1,17
sumWt0= sumWt0 + Wt0(i)
10 CONTINUE
RETURN
END
!Function used to sum weighted values of t^0
!*****************************************************************
!*****************************************************************
DOUBLE PRECISION FUNCTION sum1(sumWt,Wt)
IMPLICIT NONE
INTEGER i, t(17)
DOUBLE PRECISION sumWt,Wt(17),eCt(17),W(17)
W(i)= 1/((eCt(i))**2)
DO i= 1,17,1
Wt(i)= W(i)*t(i)
END DO
SumWt= 0.0
DO 10 i=1,17
sumWt= sumWt + Wt(i)
10 CONTINUE
RETURN
END
!Function used to sum weighted values of t^0
!*****************************************************************
!*****************************************************************
DOUBLE PRECISION FUNCTION sum2(sumWt2,Wt2)
IMPLICIT NONE
INTEGER i,t2(17)
DOUBLE PRECISION sumWt2,Wt2(17),eCt(17),W(17)
W(i)= 1/((eCt(i))**2)
DO i= 1,17,1
Wt2(i)= W(i)*t2(i)
END DO
SumWt2= 0.0
DO 10 i=1,17
sumWt2= sumWt2 + Wt2(i)
10 CONTINUE
RETURN
END
!Function used to sum weighted values of t^0
!*****************************************************************
不知道为什么一直这样做。
答案 0 :(得分:2)
你为什么要打电话?您正在撰写诸如
之类的陈述CALL sum2(sumWt2,Wt2)
但sum2
被声明为
DOUBLE PRECISION FUNCTION sum2(sumWt2,Wt2)
CALL
仅适用于子程序。如果您不理解子例程和函数之间的区别,请返回教科书或其他喜欢的教程资源,并重新阅读相关章节。在Fortran中,函数返回一个值,通常用于赋值的rhs,例如
mysum = sum2(values)
除了这种混淆之外,您在程序开头声明sum2
为REAL
类型,然后定义同名的double precision
函数。我怀疑这种不一致可能是您报告错误消息的直接原因。
现在它看起来像是在尝试编写超出当前功能的程序。忘掉它,直到你可以写一个函数(这是我建议的)或一个子程序来返回一个值为1的数组之和。换句话说,写一个FORTRAN77函数来实现Fortran 90 sum
内在的禁果。
如果您再次编辑问题,请确保:
continue
语句,将其替换为end do
; 答案 1 :(得分:0)
您收到了哪些错误消息?编译器是否接受DO 10"循环"中的多行语句? (不需要第6列延续标记?),你还在做什么?我认为你只需在上面的1..17循环中粘贴一个sumWt0 = sumWt0 + Wt0(i)
(我认为这是一个错字,你在尝试使用sumWt0(*)时它是一个错误标量)。
PROGRAM test
IMPLICIT NONE
INTEGER i,t0
REAL t(17),Ct(17),eCt(17),W(17),Wt0(17),sumWt0,sum0
OPEN(21, FILE='data.txt', STATUS='OLD')
DO i=1,17
READ (21,*)t(i),Ct(i),eCt(i)
END DO
CLOSE(21)
SumWt0 = 0.0
DO i= 1,17
t0= 1 ' What is the purpose of this?
Wt0(i)=W(i)*t0
SumWt0 = SumWt0 + Wt0(i)
END DO
WRITE(*,*) 'sumWt0=', sumWt0
STOP
END