MF_multiLinfit MD_multiLinfit ME_multiLinfit
MF_multiLinfitwW MD_multiLinfitwW ME_multiLinfitwW
Funktionaus mehreren X-Y-Z-Datensätzen gleichzeitig die Parameter einer gemeinsamen linearen Modell-Funktion bestimmen
Syntax C/C++#include <MFstd.h>
int MF_multiLinfit( fVector A, iVector AStatus, unsigned npars, MF_EXPERIMENT *ListOfExperiments, unsigned nexperiments,
void (*funcs)(fVector BasFuncs, float x, float y, unsigned nfuncs, unsigned iexperiment) );

int MF_multiLinfitwW( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, MF_EXPERIMENT *ListOfExperiments, unsigned nexperiments,
void (*funcs)(fVector BasFuncs, float x, float y, unsigned nfuncs, unsigned iexperiment) );

Pascal/Delphiuses MFstd;
function MF_multiLinfit( A:fVector; AStatus:iVector; nParameters:UInt; ListOfExperiments: PMF_EXPERIMENT; nexperiments:UInt; funcs: Pointer ): IntBool;
function MF_multiLinfitwW( A:fVector; Covar:fMatrix; AStatus:iVector; nParameters:UInt; ListOfExperiments: PMF_EXPERIMENT; nexperiments:UInt; funcs: Pointer ): IntBool;
BeschreibungDie in ListOfExperiments enthaltenen Eingabe-Daten werden benutzt, um die Parameter ai einer 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
ListOfExperimentsEingabedaten, siehe Kap. 13.4
nexperimentsAnzahl der Datensätze in ListOfExperiments
modelfuncBenutzer-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_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 MF_EXPERIMENT zusammengefaßt werden. Angenommen, man habe zwei Sätze von X-Y-Z-Daten, deren jeder aus den Vektoren X und Y für die unabhängigen Variablen, der Matrix Z für die z=f(x,y)-Werte und, für MF_multiLinfitwW, den Einzelpunkt-Wichtungen in MInvVar besteht. Die Matrix-Dimensionen seinen htZ (= sizeY) und lenZ (= sizeX). Man hat dann eine Experimenten-Liste zu konstruieren wie in dem folgenden Beispiel:

Experimenten-Liste in C/C++ konstruieren MF_EXPERIMENT ExpList[2];
ExpList[0].X = X1;  ExpList[0].Y = Y1;  
ExpList[0].MZ = MZ1;
ExpList[0].htZ = htZ1;  ExpList[0].lenZ = lenZ1;
ExpList[1].X = X1;  ExpList[1].Y = Y2;  
ExpList[1].MZ = MZ2;
ExpList[1].htZ = htZ2;  ExpList[1].lenZ = lenZ2;
/* für die Variante mit Einzelpunkt-Wichtung außerdem: */
ExpList[0].MInvVar = MInvVar1;  
ExpList[0].WeightOfExperiment = wt1;
ExpList[1].MInvVar = MInvVar2;  
ExpList[1].WeightOfExperiment = wt2;
 
Experimenten-Liste in Pascal/Delphi konstruieren var ExpList: array[0..1] of MF_EXPERIMENT;
begin
  ...
  ExpList[0].X := X1;  ExpList[0].Y := Y1;  
  ExpList[0].MZ := MZ1;
  ExpList[0].htZ := htZ1;  ExpList[0].lenZ := lenZ1;
  ExpList[1].X := X2;  ExpList[1].Y := Y2;  
  ExpList[1].MZ := MZ2;
  ExpList[1].htZ := htZ2;  ExpList[1].lenZ := lenZ2;
  (* für die Variante mit Einzelpunkt-Wichtung außerdem: *)
  ExpList[0].MInvVar := MInvVar1;  
  ExpList[0].WeightOfExperiment := wt1;
  ExpList[1].MInvVar := MInvVar2;  
  ExpList[1].WeightOfExperiment := wt2;
  ...
end;

 
Sowohl C/C++ als auch Pascal/Delphi

Die Modell-Funktion "funcs" ist vom Anwender zu schreiben. Für jedes Argumenten-Paar x, y hat sie die einzelnen fi(x, y) zu berechnen und in dem Vektor BasFuncs zu speichern.
In C/C++ muß sie als
 

Modell-Funktion für C/C++ void MyFunc( fVector BasFuncs, float x, float y, unsigned nfuncs, unsigned iexperiment )
{
  BasFuncs[0] = f0( x, y );
  BasFuncs[1] = f1( x, y );
  ...
}

geschrieben und an MF_multiLinfit durch Aufruf von
MF_multiLinfit( A, AStatus, npars, ExpList, 2, MyFunc );
übergeben werden.
Modell-Funktion für Pascal/Delphi procedure MyFunc( BasFuncs:fVector; x, y:Single; nfuncs, iexperiment:UInt );
begin
  VF_Pelement( BasFuncs, 0 )^ := f0( x, y );
  VF_Pelement( BasFuncs, 1 )^ := f1( x, y );
  ...
end;

Diese Modell-Funktion muß an MF_multiLinfit durch Aufruf von
MF_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 muß 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 MF_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 MZ-Werte um einen für jedes Experiment verschiedenen Wert C verschoben sein. In diesem Falle muß 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, y ) etc. dürfen die Parameter ai selbst nicht enthalten.
In der gewichteten Variante MF_multiLinfitwW muß die Matrix ExpList[i].MInvVar jedes Experimentes 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_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. 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).
QuerverweisMF_linfit,   MF_nonlinfit,   MF_multiNonlinfit,   Kap. 13,  FITDEMO*.*

MatrixLib Inhaltsverzeichnis  OptiVec Home