!**********************************************************************! ! ! File: lfit.f90 (08-Jun-2001) ! (08-Jun-2006) ! (22-Apr-2008) ! ! Lineares Ausgleichsproblem mit Fitfunktion der Form ! ! _m_ ! \ ! y(x) = /___ c(k)*phi_k(x) ! k=1 ! ! auf dem Intervall [0,1], wo ! ! phi_k(x) = x*(1-x)*(2*x-1)**(k-1) ! ! Loesung des linearen Gleichungssystems fuer Fitparameter mit ! Gauss'scher Elimination und partieller Pivotierung ! ! m..............Anzahl der Fitparameter c_k ! lfit_in.dat....Eingabefile mit zu fittenden Daten (enthaelt in erster ! Zeile Anzahl der Datenpunkte n) ! ! nx.............Anzahl der Datenpunkte fuer Darstellung der gefitteten ! Funktion im Intervall [0,1] ! lfit_out.dat...Ausgabefile mit gefitteter Funktion ! !**********************************************************************! module lfit_m !**********************************************************************! implicit none private integer,parameter,public::double=selected_real_kind(15) real(kind=double),parameter,public::eps=1.0e-08 public::gaussp,phi contains !**********************************************************************! function phi(k,x) result(phix) !**********************************************************************! integer,intent(in)::k real(kind=double),intent(in)::x real(kind=double)::phix ! Basisfunktionen fuer Fit if(k==0) then phix=x*(1.0-x) else phix=x*(1.0-x)*(2.0*x-1.0)**k end if return end function phi !**********************************************************************! subroutine gaussp(a_in,b,x) !**********************************************************************! real(kind=double),dimension(:,:),intent(in)::a_in real(kind=double),dimension(:),intent(in)::b real(kind=double),dimension(:),intent(out)::x integer::i,itemp,j,k,m,n integer,dimension(size(b))::iperm real(kind=double)::pivot,pmax real(kind=double),dimension(size(b),size(b)+1)::a n=size(a_in,dim=1) ! Dimension des Gleichungssystems ! Kopie der Koeffizientenmatrix a_in und der rechten Seite b ! in EINE n*(n+1) Matrix a (d.h. a_in wird nicht ueberschrieben) a(:,1:n)=a_in a(:,n+1)=b ! Permutationsvektor initialisieren iperm=(/(j,j=1,n)/) do i=1,n-1 ! Maximales Pivotelement in Spalte i suchen m=maxloc(abs(a(iperm(i:n),i)),dim=1)+i-1 pmax=abs(a(iperm(m),i)) if(pmax