void make_spl (points_t * pts, spline_t * spl){ int n = pts->n - 1; matrix_t *eqs = make_matrix(n*3, n*3+1); double *x = pts->x; double *y = pts->y; int i; for(i= 0; i < n; i++){ double dx = x[i+1] - x[i]; int if1 = 3*i; int if2 = if1+1; int if3 = if2+1; put_entry_matrix(eqs, if1, if1, dx); put_entry_matrix(eqs, if1, if2, dx*dx/2); put_entry_matrix(eqs, if1, if3, dx*dx*dx/6); put_entry_matrix(eqs, if1, n*3, y[i+1]-y[i]); put_entry_matrix(eqs, if2, if1, 1); put_entry_matrix(eqs, if2, if2, dx); put_entry_matrix(eqs, if2, if3, dx*dx/2); if(if3+1 < n*3) put_entry_matrix(eqs, if2, if3+1, -1); else put_entry_matrix(eqs, if2, if1, 0); put_entry_matrix(eqs, if3, if2, 1); put_entry_matrix(eqs, if3, if3, dx); if(if3+2 < n*3) put_entry_matrix(eqs, if3, if3+2, -1); } #ifdef DEBUG write_matrix(eqs, stdout); #endif if(piv_ge_solver(eqs)) { spl->n = 0; return; } #ifdef DEBUG write_matrix(eqs, stdout); #endif if(alloc_spl(spl, pts->n) == 0){ spl->n = pts->n; for(i = 0; i < n; i++) { spl->x[i] = pts->x[i]; spl->f[i] = pts->y[i]; spl->f1[i] = get_entry_matrix(eqs, 3*i, 3*n); spl->f2[i] = get_entry_matrix(eqs, 3*i+1, 3*n); spl->f3[i] = get_entry_matrix(eqs, 3*i+2, 3*n); } spl->x[n] = pts->x[n]; spl->f[n] = pts->y[n]; spl->f1[n] = spl->f1[n-1]; spl->f2[n] = 0; spl->f3[n] = 0; } }
void make_spl(points_t * pts, spline_t * spl) { matrix_t *eqs = NULL; double *x = pts->x; double *y = pts->y; double a = x[0]; double b = x[pts->n - 1]; int i, j, k; int nb = pts->n - 3 > 10 ? 10 : pts->n - 3; char *nbEnv = getenv("APPROX_BASE_SIZE"); if (nbEnv != NULL && atoi(nbEnv) > 0) nb = atoi(nbEnv); eqs = make_matrix(nb, nb + 1); for (j = 0; j < nb; j++) { for (i = 0; i < nb; i++) for (k = 0; k < pts->n; k++) add_to_entry_matrix(eqs, j, i, fi(i, x[k]) * fi(j, x[k])); for (k = 0; k < pts->n; k++) add_to_entry_matrix(eqs, j, nb, y[k] * fi(j, x[k])); } if (piv_ge_solver(eqs)) { spl->n = 0; return; } if (alloc_spl(spl, nb) == 0) { for (i = 0; i < spl->n; i++) { double xx = spl->x[i] = a + i * (b - a) / (spl->n - 1); xx += 10.0 * DBL_EPSILON; //by nie ulokować punktu w poprz. przedziale spl->f[i] = 0; spl->f1[i] = 0; spl->f2[i] = 0; spl->f3[i] = 0; for (k = 0; k < nb; k++) { double ck = get_entry_matrix(eqs, k, nb); spl->f[i] += ck * fi (k, xx); spl->f1[i] += ck * dfi (k, xx); spl->f2[i] += ck * d2fi(k, xx); spl->f3[i] += ck * d3fi(k, xx); } } } }
void make_spl(points_t * pts, spline_t * spl){ matrix_t *eqs= NULL; double *x = pts->x; double *y = pts->y; int i, j, k; int n = pts->n > 8 ? 8 : pts->n; double a = x[0]; double b = x[pts->n - 1]; char *nEnv= getenv( "APPROX_BASE_SIZE" ); if( nEnv != NULL && atoi( nEnv ) > 0 ) n = atoi( nEnv ); eqs = make_matrix(n, n+1); wypelnijMacierze(eqs, pts, n); if (piv_ge_solver(eqs)) { spl->n = 0; return; } if (alloc_spl(spl, n) == 0) { for (i = 0; i < spl->n; i++) { double xx = spl->x[i] = a + i * (b - a)/(spl->n - 1); xx+= 10.0 * DBL_EPSILON; // zabezpieczenie przed ulokowaniem punktu w poprzednim przedziale spl->f[i] = 0; spl->f1[i] = 0; spl->f2[i] = 0; spl->f3[i] = 0; for (k = 0; k < n; k++) { double ck = get_entry_matrix(eqs, k, n); spl->f[i] += ck * hermite(xx, k); spl->f1[i] += ck * hermiteD1(xx, k); spl->f2[i] += ck * hermiteD2(xx, k); spl->f3[i] += ck * hermiteD3(xx, k); } } } free(eqs); free(x); free(y); }
void make_spl(points_t * pts, spline_t * spl) { matrix_t *eqs= NULL; double *x = pts->x; double *y = pts->y; double a = x[0]; double b = x[pts->n - 1]; int i, j, k; int nb = pts->n - 3 > 10 ? 10 : pts->n - 3; char *nbEnv= getenv( "APPROX_BASE_SIZE" ); if( nbEnv != NULL && atoi( nbEnv ) > 0 ) nb = atoi( nbEnv ); eqs = make_matrix(nb, nb + 1); #ifdef DEBUG #define TESTBASE 500 { FILE *tst = fopen("debug_base_plot.txt", "w"); double dx = (b - a) / (TESTBASE - 1); for( j= 0; j < nb; j++ ) xfi( a, b, nb, j, tst ); for (i = 0; i < TESTBASE; i++) { fprintf(tst, "%g", a + i * dx); for (j = 0; j < nb; j++) { fprintf(tst, " %g", fi (a, b, nb, j, a + i * dx)); fprintf(tst, " %g", dfi (a, b, nb, j, a + i * dx)); fprintf(tst, " %g", d2fi(a, b, nb, j, a + i * dx)); fprintf(tst, " %g", d3fi(a, b, nb, j, a + i * dx)); } fprintf(tst, "\n"); } fclose(tst); } #endif for (j = 0; j < nb; j++) { for (i = 0; i < nb; i++) for (k = 0; k < pts->n; k++) add_to_entry_matrix(eqs, j, i, fi(a, b, nb, i, x[k]) * fi(a, b, nb, j, x[k])); for (k = 0; k < pts->n; k++) add_to_entry_matrix(eqs, j, nb, y[k] * fi(a, b, nb, j, x[k])); } #ifdef DEBUG write_matrix(eqs, stdout); #endif if (piv_ge_solver(eqs)) { spl->n = 0; return; } #ifdef DEBUG write_matrix(eqs, stdout); #endif if (alloc_spl(spl, nb) == 0) { for (i = 0; i < spl->n; i++) { double xx = spl->x[i] = a + i*(b-a)/(spl->n-1); xx+= 10.0*DBL_EPSILON; // zabezpieczenie przed ulokowaniem punktu w poprzednim przedziale spl->f[i] = 0; spl->f1[i] = 0; spl->f2[i] = 0; spl->f3[i] = 0; for (k = 0; k < nb; k++) { double ck = get_entry_matrix(eqs, k, nb); spl->f[i] += ck * fi (a, b, nb, k, xx); spl->f1[i] += ck * dfi (a, b, nb, k, xx); spl->f2[i] += ck * d2fi(a, b, nb, k, xx); spl->f3[i] += ck * d3fi(a, b, nb, k, xx); } } } #ifdef DEBUG { FILE *tst = fopen("debug_spline_plot.txt", "w"); double dx = (b - a) / (TESTBASE - 1); for (i = 0; i < TESTBASE; i++) { double yi= 0; double dyi= 0; double d2yi= 0; double d3yi= 0; double xi= a + i * dx; for( k= 0; k < nb; k++ ) { yi += get_entry_matrix(eqs, k, nb) * fi(a, b, nb, k, xi); dyi += get_entry_matrix(eqs, k, nb) * dfi(a, b, nb, k, xi); d2yi += get_entry_matrix(eqs, k, nb) * d2fi(a, b, nb, k, xi); d3yi += get_entry_matrix(eqs, k, nb) * d3fi(a, b, nb, k, xi); } fprintf(tst, "%g %g %g %g %g\n", xi, yi, dyi, d2yi, d3yi ); } fclose(tst); } #endif }