e02bace.c

/* nag_fit_dim1_spline_knots (e02bac) Example Program.
 *
 * Copyright 2025 Numerical Algorithms Group.
 *
 * Mark 31.1, 2025.
 *
 */
#include<nag.h>
#include<stdio.h>
intmain(void){
Integerexit_status=0,j,m,ncap,ncap7,r,wght;
NagErrorfail;
Nag_Splinespline;
doublefit,ss,*weights=0,*x=0,xarg,*y=0;
INIT_FAIL(fail);
/* Initialize spline */
spline.lamda=0;
spline.c=0;
printf("nag_fit_dim1_spline_knots (e02bac) Example Program Results\n");
scanf("%*[^\n]");/* Skip heading in data file */
while(scanf("%"NAG_IFMT"",&m)!=EOF)
{
if(m>=4){
if(!(weights=NAG_ALLOC(m,double))||!(x=NAG_ALLOC(m,double))||
!(y=NAG_ALLOC(m,double))){
printf("Allocation failure\n");
exit_status=-1;
gotoEND;
}
}else{
printf("Invalid m.\n");
exit_status=1;
gotoEND;
}
scanf("%"NAG_IFMT"%"NAG_IFMT"",&ncap,&wght);
if(ncap>0){
ncap7=ncap+7;
spline.n=ncap7;
if(!(spline.lamda=NAG_ALLOC(ncap7,double))){
printf("Allocation failure\n");
exit_status=-1;
gotoEND;
}
}else{
printf("Invalid ncap.\n");
exit_status=1;
gotoEND;
}
for(j=4;j<ncap+3;++j)
scanf("%lf",&(spline.lamda[j]));
for(r=0;r<m;++r){
if(wght==1){
scanf("%lf%lf",&x[r],&y[r]);
weights[r]=1.0;
}else
scanf("%lf%lf%lf",&x[r],&y[r],&weights[r]);
}
/* nag_fit_dim1_spline_knots (e02bac).
 * Least squares curve cubic spline fit (including
 * interpolation), one variable
 */
nag_fit_dim1_spline_knots(m,x,y,weights,&ss,&spline,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_fit_dim1_spline_knots (e02bac).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf("\nNumber of distinct knots = %"NAG_IFMT"\n\n",ncap+1);
printf("Distinct knots located at \n\n");
for(j=3;j<ncap+4;j++)
printf("%8.4f%s",spline.lamda[j],
(j-3)%6==5||j==ncap+3?"\n":" ");
printf("\n\n J B-spline coeff c\n\n");
for(j=0;j<ncap+3;++j)
printf(" %"NAG_IFMT" %13.4f\n",j+1,spline.c[j]);
printf("\nResidual sum of squares = ");
printf("%11.2e\n\n",ss);
printf("Cubic spline approximation and residuals\n");
printf(" r Abscissa Weight Ordinate"
" Spline Residual\n\n");
for(r=0;r<m;++r){
/* nag_fit_dim1_spline_eval (e02bbc).
 * Evaluation of fitted cubic spline, function only
 */
nag_fit_dim1_spline_eval(x[r],&fit,&spline,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_fit_dim1_spline_eval (e02bbc).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf("%3"NAG_IFMT" %11.4f %11.4f %11.4f %11.4f"
" %10.1e\n",
r+1,x[r],weights[r],y[r],fit,fit-y[r]);
if(r<m-1){
xarg=(x[r]+x[r+1])*0.5;
/* nag_fit_dim1_spline_eval (e02bbc), see above. */
nag_fit_dim1_spline_eval(xarg,&fit,&spline,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_fit_dim1_spline_eval (e02bbc).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf(" %14.4f %33.4f\n",xarg,fit);
}
}
/* Free memory used by spline */
NAG_FREE(spline.lamda);
NAG_FREE(spline.c);
END:
NAG_FREE(weights);
NAG_FREE(x);
NAG_FREE(y);
}
returnexit_status;
}

AltStyle によって変換されたページ (->オリジナル) /