Lav et plugin for lineærindstilling

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.

Deklarationsfiler

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).

Implementér nødvendige funktioner

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;
}

Kalde tilpasningfunktionerne

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).

Eksempel

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;
}