Das Hinzufügen von neuen, eigenen Modellen gestaltet sich deshalb recht einfach. Alle Modellfunktionen, die in irgendeinem Programm aufgerufen werden, sind für den zweidimensionalen Fall in der Datei ../grille/allg/modell2.c definiert. Für den 1D bzw 3D-Fall gelten die Ausführungen dieser Seite ganz genauso. Sie sind nur in ../grille/allg/modell1.c bzw. ../grille/allg/modell3.c, mit einem Aufrufparameter (Koordinatenunterschiede) weniger bzw. mehr, definiert. Im weiteren beschränke ich mich deshalb auf den 2D-Fall.
Als Ausgangspunkt soll das Beispiel der isotropen Gauß'schen Funktion dienen:
double gaussI2(double h,double r,mostruk *m) { double s; s=exp(-((*m).alphak)*((*m).alphak)*(h*h+r*r)); return(s); } |
double neueFunktionI2(double h,double r,mostruk *m) { double s; . . Funktionskörper mit (*m).alphak, (*m).alphag usw. usf. . . return(s); } |
In diesem Funktionskörper kann man auf folgende Modellparameter zugreifen, sie seien mit ihren korrespondierenden Bezeichnungen in den ID's aufgeführt:
Variable | ID's (Auto-,Kreuzkorrelation) | Inhalt |
alphag | mp1mnn, amnnpp (1.Wert) | minimale Reichweite |
alphak | mp1mnn, amnnpp (2.Wert) | maximale oder isotrope Reichweite |
tba | mp1mnn, amnnpp (3.Wert) | Richtungswinkel zur maximalen Reichweite |
betak | mp1mnn, amnnpp (4.Wert) | minimale oder isotrope Wellenlänge |
betag | mp1mnn, amnnpp (5.Wert) | maximale Wellenlänge |
tbb | mp1mnn, amnnpp (6.Wert) | Richtungswinkel zur maximalen Wellenlänge |
nue | mp2mnn, bmnnpp (1. Wert) | Exponent der verallg. Modelle |
mqmglatt | mp3mnn, cmnnpp (1. Wert) | meist Glättungsfaktor in Kernfunktionen |
kern2 | mp3mnn, cmnnpp (2. Wert) | 2. Parameter in Kenfunktionen |
kern3 | mp3mnn, cmnnpp (3. Wert) | 3. Parameter in Kenfunktionen |
Hat man sich seine Funktion geschrieben, muß man sie dem Funktionsarray
in ../grille/allg/modell2.h bekannt machen. Dieses indexierte Feld
ist die Grundlage für die Auswahl des jeweiligen Modells während der
Berechnung. Der Index ist gleich der Zahl der Modellnummer in akornn
bzw. cknnpp. Hier ein Beispiel:
struct ftab modell[] = { dummy, exponI2, lineaI2, spherI2, gaussI2, alexpI2, alhirI2, konstI2, cosmoI2, /* 8. Element siehe COSMOD */ sinmoI2, /* 9. Element siehe SINMOD */ mqmHAI2, mqm_inverse2, multilog2, na_cubic_spline2, thin_plate_spline2, sincI2, /* 15. Element, siehe ANZISOMOD */ exponA2, lineaA2, spherA2, gaussA2, alexpA2, alhirA2, konstI2, cosmoA2, sinmoA2, }; /* COSMOD = 8; SINMOD = 9; ANZISOMOD = 15; */ |
struct ftab modell[] = { dummy, exponI2, lineaI2, spherI2, gaussI2, alexpI2, alhirI2, konstI2, neueFunktionI2; cosmoI2, /* 9. Element siehe COSMOD */ sinmoI2, /* 10. Element siehe SINMOD */ mqmHAI2, mqm_inverse2, multilog2, na_cubic_spline2, thin_plate_spline2, sincI2, /* 16. Element, siehe ANZISOMOD */ exponA2, lineaA2, spherA2, gaussA2, alexpA2, alhirA2, konstI2, neueFunktionA2; cosmoA2, sinmoA2, }; /* COSMOD = 9; SINMOD = 10; ANZISOMOD = 16; */ |
double gaussA2(double h,double r,mostruk *m) { double para,s; para = Ellippara_actual_2d(h,r,(*m).alphak,(*m).alphag,(*m).tba); s = h*h + r*r; s = s * para * para * (-1.0); s = exp(s); return(s); } |