MF_linfit MD_linfit ME_linfit
MF_linfitwW MD_linfitwW ME_linfitwW
FunktionDatenanpassung für bezüglich ihrer Parameter lineare Modellfunktionen z=f(x, y)
Syntax C/C++#include <MFstd.h>
int MF_linfit( fVector A, iVector AStatus, unsigned npars, fVector X, fVector Y, fMatrix Z, ui htZ, ui lenZ,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));

int MF_linfitwW( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, fVector X, fVector Y, fMatrix Z, fMatrix InvVar, ui htZ, ui lenZ,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));

C++ MatObj#include <OptiVec.h>
int vector<T>::linfit( const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));

int vector<T>::linfitwW( matrix<T> Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ, const matrix<T>& MInvVar,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));

int vector<T>::linfitwW( matrix<T>* Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ, const matrix<T>& MInvVar,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));

Pascal/Delphiuses MFstd;
function MF_linfit( A:fVector; AStatus:iVector; npars:UInt; X, Y:fVector; MZ:fMatrix; htZ, lenZ:UIntSize; funcs:Pointer ): IntBool;

function MF_linfitwW( A:fVector; Covar:fMatrix; AStatus:iVector; npars:UInt; X, Y:fVector; MZ, MInvVar:fMatrix; htZ, lenZ:UIntSize; funcs:Pointer ): IntBool;

BeschreibungDie Eingabe-Daten X, Y, MZ (und MInvVar) werden benutzt, um die Parameter ai der allgemeinen linearen Funktion
z = a0f0(x, y) + a1f1(x, y) + a2f2(x, y)...
zu bestimmen. Die Parameter ai werden in dem Vektor A zurückgegeben.

Argumente:
AVektor der Länge npars; gibt die berechneten Koeffizienten zurück
CovarMatrix der Dimensionen [npars, npars]; gibt die Kovarianzen der Koeffizenten zurück
AStatusVektor der Länge npars; entscheidet darüber, welche Parameter frei oder eingefroren sind
nparsGesamtzahl der Parameter
X, YVektoren der Länge lenZbzw. htZ, die das X-Y-Koordinatensystem der Matrix Z aufspannen
MZ, MInvVarMatrizen der Dimensionen [htZ, lenZ] mit den Eingabedaten sowie, bei der gewichteten Variante, dem Kehrwert von deren Varianzen
funcsBenutzer-definierte Modell-Funktion
 
Die Modell-Funktion (und damit der Parameter-Vektor) kann mehr Parameter enthalten als tatsächlich angepaßt werden sollen. Daher muß ein zusätzlicher Vektor AStatus die Information darüber enthalten, welche Parameter bei ihren Eingabe-Werten eingefroren bleiben sollen (AStatus[i] = 0) und welche anzupassen sind (AStatus[i] = 1). Alle eingefrorenen Parameter müssen in A vor dem Aufruf von MF_linfit initialisiert sein. npars bezeichnet die Gesamtzahl der Parameter in A (also nicht nur die freien Parameter!).

Die Modell-Funktion "funcs" ist vom Anwender zu schreiben. Für jedes Argumentenpaar x, y hat sie die einzelnen fi(x, y) zu berechnen und in dem Vektor BasFuncs zu speichern. In C/C++ muß sie als
void MyFunc( fVector BasFuncs, float x, float y, unsigned nfuncs);
{
  BasFuncs[0] = f0( x, y );
  BasFuncs[1] = f1( x, y);
  . . .
}

definiert und an MF_linfit durch Aufruf von
MF_linfit( A, AStatus, npars, X, Y, MZ, htZ, lenZ, MyFunc );
übergeben werden.
In Pascal/Delphi muß die Modell-Funktion als
procedure MyFunc( BasFuncs:fVector; x, y:Single; nfuncs:UInt );
begin
  VF_Pelement( BasFuncs, 0 )^ := f0( x, y );
  VF_Pelement( BasFuncs, 1 )^ := f1( x, y );
  . . .
end;

definiert und an MF_linfit durch Aufruf von
MF_linfit( A, AStatus, npars, X, Y, MZ, htZ, lenZ, @MyFunc );
übergeben werden. Man beachte den Adress-Operator vor "MyFunc.". In Turbo Pascal muß die Modellfunktion mit der Option "Force Far Calls" {$F+} compiliert werden.

Die Funktionen f0( x, y ) etc. dürfen die Parameter ai selbst nicht enthalten.
In der gewichteten Variante MF_linfitwW muß die Matrix MInvVar den Kehrwert der Varianzen der einzelnen X-Y-Z-Datenpunkte enthalten, und die Matrix MCovar gibt die Kovarianzen der Parameter ai zurück: MCovari,j = covariance( ai, aj ).

Intern verwendet MF_linfit einen auf Singulärwert-Zerlegung (SVD) basierenden Algorithmus, um eine Lösung auch für (nahezu) singuläre Gleichungssysteme zu erhalten. Dabei werden Koeffizienten ai, deren Signifikanz unter einer gewissen Schwelle liegt, gleich 0 anstatt Unendlich gesetzt. Diese Schwelle kann durch Aufruf von VF_setLinfitNeglect modifiziert werden. VF_getLinfitNeglect liest die derzeit eingestellte Schwelle.

In dem sehr seltenen Fall, dass diese Funktion keine Lösung finden kann, gibt sie 1 (TRUE) zurück und setzt alle A[i] = 0.

RückgabewertFALSE (0), wenn fehlerfrei, andernfalls TRUE (!= 0).
QuerverweisVF_linfit,   MF_nonlinfit,   Kap. 13,  FITDEMO*.*

MatrixLib Inhaltsverzeichnis  OptiVec Home