Changeset 1858
- Timestamp:
- Sep 22, 2004, 6:55:48 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/test/dataManip/tst_psFunc07.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/test/dataManip/tst_psFunc07.c
r1848 r1858 15 15 #include "psFunctions.h" 16 16 17 #define N 817 #define NUM_SPLINES 4 18 18 #define A 3.0 19 19 #define B -4.0 20 20 #define C -5.0 21 21 #define D 6.0 22 #define MIN 1.0 23 #define MAX 30 22 24 23 25 float myFunc(float x) 24 26 { 25 27 return(A + x * (B + x * (C + x * (D)))); 28 // return(A + x * (B + x * (C))); 29 // return(A + x * (B)); 30 // return(A); 26 31 } 32 33 34 /***************************************************************************** 35 XXX: This is Numerical Recipes in C code. Remove from distribution. 36 *****************************************************************************/ 37 void 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 /***************************************************************************** 71 XXX: This is Numerical Recipes in C code. Remove from distribution. 72 *****************************************************************************/ 73 void 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 27 93 28 94 int main() … … 33 99 // int currentId = psMemGetId(); 34 100 psSpline1D *tmpSpline; 35 psVector *data;36 101 psVector *x; 102 psVector *newX; 37 103 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]; 38 109 39 110 psTraceSetLevel(".", 0); … … 44 115 "psFunction functions", 45 116 "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); 50 121 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]); 57 143 } 58 144 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); 61 153 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])); 64 156 } 65 157 66 y = psSpline1DEvalVector(x, tmpSpline);67 158 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); 74 167 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])); 76 176 } 77 177
Note:
See TracChangeset
for help on using the changeset viewer.
