| Syntax C/C++ | #include <MFstd.h> 
int VF_linfit( fVector A, iVector AStatus, unsigned npars, fVector X, fVector Y, ui sizex, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int VF_linfitwW( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, fVector X, fVector Y, fVector InvVar, ui sizex, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int VF_linfitwEdit( fVector A, iVector AStatus, unsigned npars, fVector X, fVector Y, ui sizex, float thresh, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int VF_linfitwWwEdit( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, fVector X, fVector Y, fVector InvVar, ui sizex, float thresh, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs)); |  
| C++ MatObj | #include <OptiVec.h> 
int vector<T>::linfit( const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int vector<T>::linfitwW( matrix<T> Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const vector<T>& InvVar, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int vector<T>::linfitwW( matrix<T>* Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const vector<T>& InvVar, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int vector<T>::linfitwEdit( const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const T thresh, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int vector<T>::linfitwWwEdit( matrix<T> Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const vector<T>& InvVar, const T thresh, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs));   
int vector<T>::linfitwWwEdit( matrix<T>* Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const vector<T>& InvVar, const T thresh, 
void funcs(fVector BasFuncs, float x, unsigned nfuncs)); |  
| Pascal/Delphi | uses MFstd; 
function VF_linfit( A:fVector; AStatus:iVector; npars:UInt; X, Y:fVector; sizex:UIntSize; funcs:Pointer ): IntBool;   
function VF_linfitwW( A:fVector; Covar:fMatrix; AStatus:iVector; npars:UInt; X, Y, InvVar:fVector; sizex:UIntSize; funcs:Pointer ): IntBool;   
function VF_linfitwEdit( A:fVector; AStatus:iVector; npars:UInt; X, Y:fVector; sizex:UIntSize; thresh:Single; funcs:Pointer ): IntBool;   
function VF_linfitwWwEdit( A:fVector; Covar:fMatrix; AStatus:iVector; npars:UInt; X, Y, InvVar:fVector; sizex:UIntSize; thresh:Single; funcs:Pointer ): IntBool; |  
  | 
| Beschreibung | Die Eingabe-Daten X, Y (und InvVar) werden benutzt, um die Parameter ai der allgemeinen linearen Funktion 
 y = a0f0(x) + a1f1(x) + a2f2(x)... 
zu bestimmen. Die Parameter ai werden in dem Vektor A zurückgegeben. 
Argumente:
 
| A | Vektor der Länge npars; gibt die berechneten Koeffizienten zurück |  
| Covar | Matrix der Dimensionen [npars, npars]; gibt die Kovarianzen der Koeffizenten zurück Falls die Kovarianzen nicht benötigt werden, rufe man die Funktion mit Covar=NULL / nil. |  
| AStatus | Vektor der Länge npars; entscheidet darüber, welche Parameter frei oder eingefroren sind |  
| npars | Gesamtzahl der Parameter |  
| X, Y, InvVar | Vektoren der Länge sizex mit den Eingabe-Daten |  
| funcs | Benutzer-definierte Modell-Funktion |  
   
Die Modell-Funktion (und damit der Parameter-Vektor) kann mehr Parameter enthalten als tatsächlich angepaßt werden sollen. Daher muss 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 VF_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 Argument x hat sie die einzelnen fi(x) zu berechnen und in dem Vektor BasFuncs zu speichern. In C/C++ muss sie als 
void MyFunc( fVector BasFuncs, float x, unsigned nfuncs)
 {
   BasFuncs[0] = f0( x );
   BasFuncs[1] = f1( x);
   . . .
 } 
definiert und an VF_linfit durch Aufruf von 
VF_linfit( A, AStatus, npars, X, Y, sizex, MyFunc ); 
übergeben werden.
 In Pascal/Delphi muss die Modell-Funktion als 
procedure MyFunc( BasFuncs:fVector; x:Single; nfuncs:UInt );
 begin
   VF_Pelement( BasFuncs, 0 )^ := f0( x );
   VF_Pelement( BasFuncs, 1 )^ := f1( x );
   . . .
 end; 
definiert und an VF_linfit durch Aufruf von 
VF_linfit( A, AStatus, npars, X, Y, sizex, @MyFunc ); 
übergeben werden. Man beachte den Adress-Operator vor "MyFunc.". 
 Die Funktionen f0( x ) etc. dürfen die Parameter ai selbst nicht enthalten.
 In der gewichteten Variante VF_linfitwW muss der Vektor InvVar den Kehrwert der Varianzen der einzelnen X-Y -Datenpunkte enthalten, und die Matrix MCovar gibt die Kovarianzen der Parameter ai zurück: MCovari,j = covariance( ai, aj ).
 Intern verwendet VF_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. Die hierfür standardmäßig voreingestellte Schwelle kann mittels VF_setLinfitNeglect verändert werden.  VF_getLinfitNeglect liest die derzeit eingestellte Schwelle. Da VF_setLinfitNeglect nicht fiber-sicher ist, sollte diese Funktion nicht verwendet werden, um verschiedene Schwellenwerte für verschiedene Aufrufe von VF_linfit usw. einzustellen. Anstatt wiederholt den Standard-Wert zu ändern, gebrauche man vielmehr die "wEdit"-Varianten von VF_linfit usw., also VF_linfitwEdit, VF_linfitwWwEdit usw.
 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.  |  
  |