Files
piscal/dataassim/math/optimization/planarfit.f
T
2016-02-03 18:52:05 +00:00

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