IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 1858


Ignore:
Timestamp:
Sep 22, 2004, 6:55:48 PM (22 years ago)
Author:
gusciora
Message:

...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/test/dataManip/tst_psFunc07.c

    r1848 r1858  
    1515#include "psFunctions.h"
    1616
    17 #define N 8
     17#define NUM_SPLINES 4
    1818#define A 3.0
    1919#define B -4.0
    2020#define C -5.0
    2121#define D 6.0
     22#define MIN 1.0
     23#define MAX 30
    2224
    2325float myFunc(float x)
    2426{
    2527    return(A + x * (B + x * (C + x * (D))));
     28    //    return(A + x * (B + x * (C)));
     29    //    return(A + x * (B));
     30    //    return(A);
    2631}
     32
     33
     34/*****************************************************************************
     35XXX: This is Numerical Recipes in C code.  Remove from distribution.
     36 *****************************************************************************/
     37void spline(float *x, float *y, int n, float yp1, float ypn, float *y2)
     38{
     39    int i,k;
     40    float p,qn,sig,un,u[NUM_SPLINES+1];
     41
     42    if (yp1 > 0.99e30) {
     43        y2[1]=u[1]=0.0;
     44    } else {
     45        y2[1] = -0.5;
     46        u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1);
     47    }
     48
     49    for (i=2;i<=n-1;i++) {
     50        sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
     51        p=sig*y2[i-1]+2.0;
     52        y2[i]=(sig-1.0)/p;
     53        u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
     54        u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p;
     55    }
     56
     57    if (ypn > 0.99e30) {
     58        qn=un=0.0;
     59    } else {
     60        qn=0.5;
     61        un=(3.0/(x[n]-x[n-1]))*(ypn-(y[n]-y[n-1])/(x[n]-x[n-1]));
     62    }
     63    y2[n]=(un-qn*u[n-1])/(qn*y2[n-1]+1.0);
     64
     65    for (k=n-1;k>=1;k--) {
     66        y2[k]=y2[k]*y2[k+1]+u[k];
     67    }
     68}
     69
     70/*****************************************************************************
     71XXX: This is Numerical Recipes in C code.  Remove from distribution.
     72 *****************************************************************************/
     73void splint(float xa[], float ya[], float y2a[], int n, float x, float *y)
     74{
     75    int klo,khi,k;
     76    float h,b,a;
     77
     78    klo=1;
     79    khi=n;
     80    while (khi-klo > 1) {
     81        k=(khi+klo) >> 1;
     82        if (xa[k] > x)
     83            khi=k;
     84        else
     85            klo=k;
     86    }
     87    h=xa[khi]-xa[klo];
     88    a=(xa[khi]-x)/h;
     89    b=(x-xa[klo])/h;
     90    *y=a*ya[klo]+b*ya[khi]+((a*a*a-a)*y2a[klo]+(b*b*b-b)*y2a[khi])*(h*h)/6.0;
     91}
     92
    2793
    2894int main()
     
    3399    //    int  currentId = psMemGetId();
    34100    psSpline1D *tmpSpline;
    35     psVector *data;
    36101    psVector *x;
     102    psVector *newX;
    37103    psVector *y;
     104    psVector *newY;
     105    float NRX[NUM_SPLINES+2];
     106    float NRY[NUM_SPLINES+2];
     107    float tmpY;
     108    float derivs[NUM_SPLINES+2];
    38109
    39110    psTraceSetLevel(".", 0);
     
    44115                            "psFunction functions",
    45116                            "psSpline1DAlloc()");
    46     data = psVectorAlloc(N+1, PS_TYPE_F32);
    47     x = psVectorAlloc(N+1, PS_TYPE_F32);
    48     y = psVectorAlloc(N+1, PS_TYPE_F32);
    49     tmpSpline = psSpline1DAlloc(N, 3, 1.0, 10.0);
     117    x = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
     118    newX = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
     119    y = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
     120    tmpSpline = psSpline1DAlloc(NUM_SPLINES, 3, MIN, MAX);
    50121
    51     for (i=0;i<N+1;i++) {
    52         data->data.F32[i] = tmpSpline->domains[i];
    53         x->data.F32[i] = tmpSpline->domains[i];
    54         y->data.F32[i] = tmpSpline->domains[i];
    55         y->data.F32[i] = myFunc(x->data.F32[i]);
    56         printf("HMMM: (x, y) is (%f, %f)\n", x->data.F32[i], y->data.F32[i]);
     122    for (i=0;i<NUM_SPLINES+1;i++) {
     123        NRX[i+1] = x->data.F32[i] = tmpSpline->domains[i];
     124        NRY[i+1] = y->data.F32[i] = myFunc(x->data.F32[i]);
     125        printf("DATA: (x, y) is (%f, %f)\n", x->data.F32[i], y->data.F32[i]);
     126    }
     127    for (i=0;i<NUM_SPLINES;i++) {
     128        newX->data.F32[i]= ((x->data.F32[i] + x->data.F32[i+1])/2.0);
     129    }
     130    newX->data.F32[NUM_SPLINES] = x->data.F32[NUM_SPLINES];
     131    /****************************************************************************/
     132    /*   NR Code       */
     133    /****************************************************************************/
     134    printf("========================== NR Code =========================\n");
     135    spline(&NRX[0],
     136           &NRY[0],
     137           NUM_SPLINES+1,
     138           0.0,
     139           0.0,
     140           &derivs[0]);
     141    for (i=1;i<=NUM_SPLINES+1;i++) {
     142        printf("NR: derivs[%d] is %f\n", i, derivs[i]);
    57143    }
    58144
    59     //    psSpline1DGen(tmpSpline, data);
    60     psVectorFitSpline1D(tmpSpline, x, y, NULL);
     145    for (i=1;i<=NUM_SPLINES+1;i++) {
     146        printf("===================================================\n");
     147        splint(&NRX[0],
     148               &NRY[0],
     149               &derivs[0],
     150               NUM_SPLINES+1,
     151               newX->data.F32[i-1],
     152               &tmpY);
    61153
    62     for (i=0;i<N+1;i++) {
    63         //        x->data.F32[i] = 0.5 + (float) i+1;
     154        printf("NR: p_psNRSpline1DEval(%f) is %f.  Should be %f\n",
     155               newX->data.F32[i-1], tmpY, myFunc(newX->data.F32[i-1]));
    64156    }
    65157
    66     y = psSpline1DEvalVector(x, tmpSpline);
    67158
    68     for (i=0;i<N+1;i++) {
    69         if (fabs(x->data.F32[i]-y->data.F32[i]) > FLT_EPSILON) {
    70             printf("ERROR: f(%f) is %f.  Should be %f\n", x->data.F32[i], y->data.F32[i], myFunc(x->data.F32[i]));
    71             testStatus = true;
    72         } else {
    73             printf("COOL: f(%f) is %f\n", x->data.F32[i], y->data.F32[i]);
     159    /****************************************************************************/
     160    /*   psLib Code      */
     161    /****************************************************************************/
     162    psVectorFitSpline1D(tmpSpline, x, y, NULL);
     163    for (i=0;i<NUM_SPLINES+1;i++) {
     164        printf("psLib: derivs[%d] is %f\n", i, tmpSpline->p_psDeriv2[i]);
     165    }
     166    newY = psSpline1DEvalVector(newX, tmpSpline);
    74167
    75         }
     168    for (i=0;i<NUM_SPLINES+1;i++) {
     169        printf("===================================================\n");
     170        printf("EVAL: f(%f) is %f.  Should be %f\n",
     171               newX->data.F32[i], newY->data.F32[i], myFunc(newX->data.F32[i]));
     172
     173        tmpY = p_psNRSpline1DEval(tmpSpline, x, y, newX->data.F32[i]);
     174        printf("HMMM: p_psNRSpline1DEval(%f) is %f.  Should be %f\n",
     175               newX->data.F32[i], tmpY, myFunc(newX->data.F32[i]));
    76176    }
    77177
Note: See TracChangeset for help on using the changeset viewer.