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));
 
int MF_linfitwEdit( fVector A, iVector AStatus, unsigned npars, fVector X, fVector Y, fMatrix Z, ui htZ, ui lenZ, float thresh,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));
 
int MF_linfitwWwEdit( fVector A, fMatrix Covar, iVector AStatus, unsigned npars, fVector X, fVector Y, fMatrix Z, fMatrix InvVar, ui htZ, ui lenZ, float thresh,
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));
 
int vector<T>::linfitwEdit( const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ, const T thresh,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));
 
int vector<T>::linfitwWwEdit( matrix<T> Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ, const matrix<T>& MInvVar, const T thresh,
void funcs(fVector BasFuncs, float x, float y, unsigned nfuncs));
 
int vector<T>::linfitwWwEdit( matrix<T>* Covar, const vector<int>& AStatus, const vector<T>& X, const vector<T>& Y, const matrix<T>& MZ, const matrix<T>& MInvVar, const T thresh,
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;
 
function MF_linfitwEdit( A:fVector; AStatus:iVector; npars:UInt; X, Y:fVector; MZ:fMatrix; htZ, lenZ:UIntSize; thresh:Single; funcs:Pointer ): IntBool;
 
function MF_linfitwWwEdit( A:fVector; Covar:fMatrix; AStatus:iVector; npars:UInt; X, Y:fVector; MZ, MInvVar:fMatrix; htZ, lenZ:UIntSize; thresh:Single; 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.
Falls die Kovarianzen nicht benötigt werden, rufe man die Funktion mit Covar=NULL / nil.
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 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 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++ muss 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 muss 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 muss 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 muss 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. 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 / MF_linfit usw. einzustellen. Anstatt wiederholt den Standard-Wert zu ändern, gebrauche man vielmehr die "wEdit"-Varianten von VF / MF_linfit usw., also MF_linfitwEdit, MF_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.

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

MatrixLib Inhaltsverzeichnis  OptiVec Home