3,881
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
#define N_POINTS 10
int main()
{
int n;
double yp1, ypn, x[N_POINTS], y[N_POINTS], y2[N_POINTS];
double input, output;
int i;
n = N_POINTS;
//Natural cubic spline
yp1 = 1.0e30;
ypn = 1.0e30;
//y = x*x
for(i=0;i<N_POINTS;++i)
{
x[i] = i;
y[i] = i*i;
}
spline(x, y, n, yp1, ypn, y2);
for(i=0;i<N_POINTS;++i)
{
input = (double) i;
output = splint(x, y, y2, n, input);
cout << "input output " << input << " " << output << "\n";
if(i != (N_POINTS - 1))
{
input = (double) i + 0.5;
output = splint(x, y, y2, n, input);
cout << "input output " << input << " " << output << "\n";
}
}
return 0;
}
[/quote]
这个是克里格插值吗?哪部分是网格划分啊?
#include <iostream>
using namespace std;
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
#define N_POINTS 10
int main()
{
int n;
double yp1, ypn, x[N_POINTS], y[N_POINTS], y2[N_POINTS];
double input, output;
int i;
n = N_POINTS;
//Natural cubic spline
yp1 = 1.0e30;
ypn = 1.0e30;
//y = x*x
for(i=0;i<N_POINTS;++i)
{
x[i] = i;
y[i] = i*i;
}
spline(x, y, n, yp1, ypn, y2);
for(i=0;i<N_POINTS;++i)
{
input = (double) i;
output = splint(x, y, y2, n, input);
cout << "input output " << input << " " << output << "\n";
if(i != (N_POINTS - 1))
{
input = (double) i + 0.5;
output = splint(x, y, y2, n, input);
cout << "input output " << input << " " << output << "\n";
}
}
return 0;
}
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
[/quote]
结合那本书看看,是怎么使用的。[/quote]
我没那本书啊 上面那串代码可以用吗?也没有main函数啊 只是计算部分吗[/quote]
代码可以用,正确性可以保证。 [/quote]
但是每一步都是做什么的呢 根本看不懂啊?哪个能用啊 [quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 yaoyunz 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] cubic spline interpolation c++ code
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
[/quote]
结合那本书看看,是怎么使用的。[/quote]
我没那本书啊 上面那串代码可以用吗?也没有main函数啊 只是计算部分吗[/quote]
代码可以用,正确性可以保证。 哪个能用啊 [quote=引用 2 楼 yaoyunz 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] cubic spline interpolation c++ code
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
[/quote]
结合那本书看看,是怎么使用的。[/quote]
我没那本书啊 上面那串代码可以用吗?也没有main函数啊 只是计算部分吗哪个能用啊 [quote=引用 1 楼 mujiok2003 的回复:] cubic spline interpolation c++ code
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}
[/quote]
结合那本书看看,是怎么使用的。哪个能用啊 cubic spline interpolation c++ code
//from the book "Numeric recipes"
void spline(double x[], double y[], int n, double yp1, double ypn, double y2[])
{
int i,k;
double p,qn,sig,un,*u;
u = (double *) malloc((size_t) (n*sizeof(double)));
if(yp1 > 0.99e30)
{
// "Natural" 1st derivative...
y2[0]=u[0]=0.0;
}else
{
// Specified 1st derivative...
y2[0] = -0.5;
u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0])/(x[1]-x[0]) - yp1);
}
for(i=1;i<=n-2;i++)
{
sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
p=sig*y2[i-1] + 2.0;
y2[i]=(sig-1.0)/p;
u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
u[i] = (6.0*u[i]/(x[i+1]-x[i-1]) - sig*u[i-1])/p;
}
if(ypn > 0.99e30)
{
qn = un = 0.0;
}else
{
qn = 0.5;
un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
}
y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2]+1.0);
for(k=n-2;k>=0;k--)
{
y2[k] = y2[k] * y2[k+1] + u[k];
}
free(u);
}
//from the book "Numeric recipes"
double splint(double xa[], double ya[], double y2a[], int n, double x)
{
int klo,khi,k;
double h,b,a,y;
klo = 0;
khi = n-1;
while((khi-klo) > 1)
{
k=(khi+klo) >> 1;
if(xa[k] > x)
{
khi = k;
}else
{
klo = k;
}
}
h = xa[khi] - xa[klo];
// if(h == 0.0) ERROR !!!
a = (xa[khi]-x)/h;
b = (x - xa[klo])/h;
y = a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
return (y);
}