Lav et plugin for lineærindstilling |
forrige | Lav yderligere plugin | næste |
For at lave et plugin for lineærindstilling, kan du implementere dine egne indstillingsalgoritmer og give passende vektorer som uddata. Kst levereres dog allerede med deklarationsfiler som gør det enkelt for dig at implementere plugin for lineær mindste kvadratindstilling ved kun at sørge for nogle få funktioner. Dette afsnit beskriver hvordan man får nytte af disse filer.
Der sørges for to deklarationsfiler til at udføre lineærindstillinger, linear.h
(for uvægtede lineærindstillinger) og linear_weighted.h
(for vægtede lineærindstillinger). Begge findes under kst(plugins/fits/
i kildekodearkivet for Kst. For at bruge filerne, inkluderes blot en af dem i dit plugins kildekode:
#include <../linear.h>eller
#include <../linear_weighted.h>(pr konvention placerer vi kildekoden for pluginnet et mappeniveau under stedet hvor deklarationsfilerne er).
Givet en generel lineær model:
hvor y
er en vektor med n
observationer, X
er en matrix med størrelsen n
gange p
med prediktorvariabler, og c
er vektoren med p
parametre for bedste indstilling som skal estimeres. Deklarationsfilen sørger for funktioner til at estimere c
for et givet y
og X
. For at sørge for X
, skal følgende funktion implementeres i pluginnets kildekode:
double calculate_matrix_entry( double
dX
, int iPos
)
Funktionen skal returnere værdien af resultatet i søjle iPos
fra matricen med prediktorvariabler, ved at bruge x
-værdien dX
. Funktionen kaldes af linear.h eller linear_weighted.h. Implementeringen af funktionen afhænger af modellen du vil bruge til indstillingen, og er entydig for hvert plugin for lineærindstilling. For eksempel for at tilpasse en polynommodel, vil funktionen calculate_matrix_entry
kunne implementeres på følgende måde:
double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; }
Når en passende deklarationsfil er inkluderet og funktionen calculate_matrix_entry
er implementeret, kaldes en passende indstillingsfunktion som inkluderes fra deklarationsfilen:
kstfit_linear_unweighted( inArrays
, inArrayLens
,
outArrays
, outArrayLens
,
outScalars
, iNumParams
)
;
eller kstfit_linear_weighted( inArrays
, inArrayLens
,
outArrays
, outArrayLens
,
outScalars
, iNumParams
)
;
Hver funktion returnerer 0
når det lykkes, eller -1
ved fejl, så det er en god idé at lade returværdien for den eksporterede C-funktion være den samme som returværdien for indstillingsfunktionen. For at holde det enkelt, kan koden for pluginnet blot sende argumenterne videre som gives til den eksporterede C-funktion til tilpasningsfunktionen. Bemærk dog at inArrays skal have følgende struktur:
inArrays[0]
skal indeholde feltet med x-koordinater for datapunkterne
inArrays[1]
skal indeholde feltet med y-koordinater for datapunkterne
inArrays[2]
er der kun hvis kstfit_linear_weighted
kaldes, og skal indeholde feltet med vægtninger for tilpasningen.
Den nemmeste måde at sikre at inArrays er rigtigt struktureret er at angive de n rigtige rækkefølge for inddatavektorer i pluginnets XML-fil.
iNumParams
er antal parametre som indgår i den brugte tilpasningsmodel, hvilket skal være lig med antal søjler i matricen X
med prediktorvariabler. iNumParams
skal angives rigtigt før tilpasningsfunktionen kaldes.
Efter funktionen kstfit_linear_unweighted
eller kstfit_linear_weighted
er kaldet, er outArrays
og outScalars
blevet tildelt følgende:
outArrays[0]
vil indeholde feltet med tilpassede y-værdier.
outArrays[1]
vil indeholde feltet med rester.
outArrays[2]
vil indeholde feltet med estimerede parametre for bedste tilpasning.
outArrays[3]
vil indeholde kovariansmatricen, returneret linje for linje i feltet.
outScalars[0]
vil indeholde chi^2/nu, hvor chi^2 er den vægtede sum af kvadratresternes, og nu frihedsgraderne.
outArrayLens
vil have den rigtige værdi til at angive længden for hvert uddatafelt.
Sørg for at angiven uddata i XML-filen passer sammen med dem som de eksporterede C-funktioner returnerer (hvilket i de fleste tilfælde simpelthen er uddata fra tilpasningsfunktionen).
Det følgende er et eksempel på kildekoden for et plugin for lineærindstilling.
/* * Polynomial fitting plugin for KST. * Copyright 2004, The University of British Columbia * Released under the terms of the GPL. */ #include "../linear.h" double calculate_matrix_entry( double dX, int iPos ) { double dY; dY = pow( dX, (double)iPos ); return dY; } extern "C" int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]); int kstfit_polynomial_unweighted( const double *const inArrays[], const int inArrayLens[], const double inScalars[], double *outArrays[], int outArrayLens[], double outScalars[]) { int iRetVal = -1; int iNumParams; iNumParams = 1 + (int)floor( inScalars[0] ); if( iNumParams > 0 ) { iRetVal = kstfit_linear_unweighted( inArrays, inArrayLens, outArrays, outArrayLens, outScalars, iNumParams ); } return iRetVal; }
forrige | hjem | næste |
Lav yderligere plugin | op | Lav plugin for ikke-lineær indstilling |