53 lines
1.6 KiB
FortranFixed
53 lines
1.6 KiB
FortranFixed
subroutine planarfit(nsamp,x,y,z,a,b,d,fatbeta)
|
|
!fit a plane in the form of ax+by+cz+d=0 where c is set to 1.
|
|
!Because we set c=1, we cannot fit for vertical planes in parallel to the
|
|
!x-z or y-z planes. But perfectly flat planes in parallel to the x-y plane can be included.
|
|
!no initial guess for a, b and d are needed
|
|
implicit none
|
|
integer nsamp,i
|
|
double precision x(nsamp),y(nsamp),z(nsamp),
|
|
& a,b,d,fatbeta,p1,p2,p3,q1,q2,q3,xmean,ymean,
|
|
& zmean,x2mean,y2mean,xymean,xzmean,yzmean
|
|
!--------------------------------------------------------
|
|
xmean=0.0d0
|
|
ymean=0.0d0
|
|
zmean=0.0d0
|
|
x2mean=0.0d0
|
|
y2mean=0.0d0
|
|
xymean=0.0d0
|
|
xzmean=0.0d0
|
|
yzmean=0.0d0
|
|
do i=1,nsamp
|
|
xmean=xmean+x(i)
|
|
ymean=ymean+y(i)
|
|
zmean=zmean+z(i)
|
|
x2mean=x2mean+x(i)*x(i)
|
|
y2mean=y2mean+y(i)*y(i)
|
|
xymean=xymean+x(i)*y(i)
|
|
xzmean=xzmean+x(i)*z(i)
|
|
yzmean=yzmean+y(i)*z(i)
|
|
enddo
|
|
xmean=xmean/dble(nsamp)
|
|
ymean=ymean/dble(nsamp)
|
|
zmean=zmean/dble(nsamp)
|
|
x2mean=x2mean/dble(nsamp)
|
|
y2mean=y2mean/dble(nsamp)
|
|
xymean=xymean/dble(nsamp)
|
|
xzmean=xzmean/dble(nsamp)
|
|
yzmean=yzmean/dble(nsamp)
|
|
p1=x2mean-xmean*xmean
|
|
p2=xymean-xmean*ymean
|
|
p3=xmean*zmean-xzmean
|
|
q1=xymean-xmean*ymean
|
|
q2=y2mean-ymean*ymean
|
|
q3=ymean*zmean-yzmean
|
|
call linearsys_dim2(p1,p2,p3,q1,q2,q3,a,b)
|
|
d=-(a*xmean+b*ymean+zmean)
|
|
fatbeta=0.0d0
|
|
do i=1,nsamp
|
|
fatbeta=fatbeta+(a*x(i)+b*y(i)+z(i)+d)*
|
|
& (a*x(i)+b*y(i)+z(i)+d)
|
|
enddo
|
|
return
|
|
end
|