| VF_multiLinfit
 | VD_multiLinfit | 
VE_multiLinfit |   
| VF_multiLinfitwW | 
VD_multiLinfitwW | 
VE_multiLinfitwW |  
  | 
| Funktion | aus mehreren X-Y-Datensätzen gleichzeitig die Parameter einer gemeinsamen linearen Modell-Funktion bestimmen |  
  | 
| Syntax C/C++ | #include <MFstd.h> 
int VF_multiLinfit( fVector A, iVector AStatus, unsigned npars, VF_EXPERIMENT *ListOfExperiments, unsigned nexperiments, 
void (*funcs)(fVector BasFuncs, float x,unsigned nfuncs, unsigned iexperiment) );   
int VF_multiLinfitwW( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, VF_EXPERIMENT *ListOfExperiments, unsigned nexperiments, 
void (*funcs)(fVector BasFuncs, float x, unsigned nfuncs, unsigned iexperiment) );   
int VF_multiLinfitwEdit( fVector A, iVector AStatus, unsigned npars, VF_EXPERIMENT *ListOfExperiments, unsigned nexperiments, float thresh, 
void (*funcs)(fVector BasFuncs, float x,unsigned nfuncs, unsigned iexperiment) );   
int VF_multiLinfitwWwEdit( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, VF_EXPERIMENT *ListOfExperiments, unsigned nexperiments, float thresh, 
void (*funcs)(fVector BasFuncs, float x, unsigned nfuncs, unsigned iexperiment) ); |  
| Pascal/Delphi | uses MFstd; 
function VF_multiLinfit( A:fVector; AStatus:iVector; nParameters:UInt; ListOfExperiments: PVF_EXPERIMENT; nexperiments:UInt; funcs: Pointer ): IntBool;   
function VF_multiLinfitwW( A:fVector; Covar:fMatrix; AStatus:iVector; nParameters:UInt; ListOfExperiments:PVF_EXPERIMENT; nexperiments:UInt; funcs:Pointer ): IntBool;   
function VF_multiLinfitwEdit( A:fVector; AStatus:iVector; nParameters:UInt; ListOfExperiments: PVF_EXPERIMENT; nexperiments:UInt; thresh:Single; funcs: Pointer ): IntBool;   
function VF_multiLinfitwWwEdit( A:fVector; Covar:fMatrix; AStatus:iVector; nParameters:UInt; ListOfExperiments:PVF_EXPERIMENT; nexperiments:UInt; thresh:Single; funcs:Pointer ): IntBool; |  
  | 
| Beschreibung | Die in ListOfExperiments enthaltenen Eingabe-Daten werden benutzt, um die Parameter ai einer 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 |  
| ListOfExperiments | Eingabedaten, siehe Kap. 13.4 |  
| nexperiments | Anzahl der Datensätze in ListOfExperiments |  
| modelfunc | 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_multiLinfit initialisiert sein. npars bezeichnet die Gesamtzahl der Parameter in A (also nicht nur die freien Parameter!). 
Die Eingabe-Daten müssen in Sätzen des Typs VF_EXPERIMENT zusammengefaßt werden. Angenommen, man habe zwei X-Y-Datensätze, bestehend aus den Vektoren X1, Y1 (für VF_multiLinfitwW auch InvVar1) von je size1 Elementen, und X2, Y2 (und InvVar2) von je size2 Elementen. Hieraus hat man die Experimenten-Liste zusammenzustellen wie im folgenden Beispiel:
  |  | Experimenten-Liste in C/C++ konstruieren | 
VF_EXPERIMENT ExpList[2];
 ExpList[0].X = X1;  ExpList[0].Y = Y1;  ExpList[0].size = size1;
 ExpList[1].X = X2;  ExpList[1].Y = Y2;  ExpList[1].size = size2;
 /* für die Variante mit Einzelpunkt-Wichtung außerdem: */
 ExpList[0].InvVar = InvVar1;  ExpList[0].WeightOfExperiment = wt1;
 ExpList[1].InvVar = InvVar2;  ExpList[1].WeightOfExperiment = wt2;
  
 |  | Experimenten-Liste in Pascal/Delphi konstruieren | 
var ExpList: array[0..1] of VF_EXPERIMENT;
 begin
   ...
   ExpList[0].X := X1;  ExpList[0].Y := Y1;  
   ExpList[0].size := size1;
   ExpList[1].X := X2;  ExpList[1].Y := Y2;  
   ExpList[1].size := size2;
   (* für die Variante mit Einzelpunkt-Wichtung außerdem: *)
   ExpList[0].InvVar := InvVar1;  
   ExpList[0].WeightOfExperiment := wt1;
   ExpList[1].InvVar := InvVar2;  
   ExpList[1].WeightOfExperiment := wt2;
   ... 
 end;
  
 |  | Sowohl C/C++ als auch Pascal/Delphi | 
 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  
  |  | Modell-Funktion für C/C++ | 
void MyFunc( fVector BasFuncs, float x, unsigned nfuncs, unsigned iexperiment )
 {
   BasFuncs[0] = f0( x );
   BasFuncs[1] = f1( x);
   ...
 } 
geschrieben und an VF_multiLinfit durch Aufruf von 
VF_multiLinfit( A, AStatus, npars, ExpList, 2, MyFunc );
 übergeben werden.
 |  | Modell-Funktion für Pascal/Delphi | 
procedure MyFunc( BasFuncs:fVector; x:Single; nfuncs, iexperiment:UInt );
 begin
   VF_Pelement( BasFuncs, 0 )^ := f0( x );
   VF_Pelement( BasFuncs, 1 )^ := f1( x );
   ...
 end; 
Diese Modell-Funktion muss an VF_multiLinfit durch Aufruf von 
VF_multiLinfit( A, AStatus, npars, @ExpList, 2, @MyFunc );
 übergeben werden. Man beachte die Adress-Operatoren vor "ExpList" (statischer Pascal-Array, der an OptiVec-Funktion übergeben wird) und "MyFunc" (Zeiger auf die Funktion MyFunc). In Turbo Pascal muss die Modellfunktion mit der Option "Force Far Calls" {$F+} compiliert werden.
 |  | Sowohl C/C++ als auch Pascal/Delphi | 
 Das Argument iexperiment, mit dem MyFunc intern von VF_multiLinfit aus aufgerufen werden wird, erlaubt die Unterscheidung zwischen Parametern, die allen Experimenten gemeinsam sind, und solchen, die  individuell zu den einzelnen Experimenten gehören. Z.B. könnten die Y-Werte um einen für jedes Experiment verschiedenen Wert C verschoben sein. In diesem Falle muss A so viele Verschiebungen enthalten, wie es Experimente gibt. In MyFunc hätte man dies in der folgenden Weise zu berücksichtigen (Beispiel in C/C++; die Übersetzung in Pascal/Delphi dürfte leicht sein):
   if( iexperiment == 0 ) { BasFuncs[2] = 1; BasFuncs[3] = 0; }
   else {BasFuncs[2] = 0; BasFuncs[3] = 1; }
 Die Funktionen f0( x ) etc. dürfen die Parameter ai selbst nicht enthalten.
 In der gewichteten Variante VF_multiLinfitwW muss der Vektor ExpList[i].InvVar jedes Experimentes 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_multiLinfit 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_multiLinfit usw. einzustellen. Anstatt wiederholt den Standard-Wert zu ändern, gebrauche man vielmehr die "wEdit"-Varianten von VF_multiLinfit usw., also VF_multiLinfitwEdit, VF_multiLinfitwWwEdit 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.  |  
  | 
| Rückgabewert | FALSE (0), wenn fehlerfrei, andernfalls TRUE (!= 0). |  
  | 
 |