我是编程新手。我有一个问题,如果你知道,请你帮我。我的程序是关于寻找多项式插值的系数。我在代码中使用了数字配方子程序。可能是什么错误?
#include<stdio.h>
#include<math.h>
#include "nrutil.h"
#include <stdlib.h>
void polint(float xa[], float ya[], int n, float x, float *y, float *dy)
{
int i,m,ns=1;
float den,dif,dift,ho,hp,w;
float *c,*d;
dif=fabs(x-xa[1]);
c=vector(1,n);
d=vector(1,n);
for (i=1;i<=n;i++) {
if ( (dift=fabs(x-xa[i])) < dif) {
ns=i;
dif=dift;
}
c[i]=ya[i];
d[i]=ya[i];
}
*y=ya[ns--];
for (m=1;m<n;m++) {
for (i=1;i<=n-m;i++) {
ho=xa[i]-x;
hp=xa[i+m]-x;
w=c[i+1]-d[i];
if ( (den=ho-hp) == 0.0) nrerror("Error in routine polint");
den=w/den;
d[i]=hp*den;
c[i]=ho*den;
}
*y += (*dy=(2*ns < (n-m) ? c[ns+1] : d[ns--]));
}
free_vector(d,1,n);
free_vector(c,1,n);
}
void polcof(float xa[], float ya[], int n, float cof[])
{
void polint(float xa[], float ya[], int n, float x, float *y, float *dy);
int k,j,i;
float xmin,dy,*x,*y;
x=vector(0,n);
y=vector(0,n);
for (j=0;j<=n;j++) {
x[j]=xa[j];
y[j]=ya[j];
}
for (j=0;j<=n;j++) {
polint(x-1,y-1,n+1-j,0.0,&cof[j],&dy);
xmin=1.0e38;
k = -1;
for (i=0;i<=n-j;i++) {
if (fabs(x[i]) < xmin) {
xmin=fabs(x[i]);
k=i;
}
if (x[i]) y[i]=(y[i]-cof[j])/x[i];
}
for (i=k+1;i<=n-j;i++) {
y[i-1]=y[i];
x[i-1]=x[i];
}
}
free_vector(y,0,n);
free_vector(x,0,n);
}
int main () {
FILE * fp;
fp = fopen("q1.dat", "w+");
int i, j, n=41;
float x[41], f[41], cof[i];
for (i=0; i<=40; i++) {
x[i]=0.05*i-1;
f[i]=(1+tanh(2*10*x[i]))/2;
printf("%f\t%f\n", x[i], f[i]);
fprintf(fp, "%f\n", f[i]); }
for (j=0; j<=40; j++) {
polcof(x, f, n, cof);
printf("%f\n", cof[j]); }
fclose(fp);
return 0; }
-1.000000 0.000000
-0.950000 0.000000
-0.900000 0.000000
-0.850000 0.000000
-0.800000 0.000000
-0.750000 0.000000
-0.700000 0.000000
-0.650000 0.000000
-0.600000 0.000000
-0.550000 0.000000
-0.500000 0.000000
-0.450000 0.000000
-0.400000 0.000000
-0.350000 0.000001
-0.300000 0.000006
-0.250000 0.000045
-0.200000 0.000335
-0.150000 0.002473
-0.100000 0.017986
-0.050000 0.119203
0.000000 0.500000
0.050000 0.880797
0.100000 0.982014
0.150000 0.997527
0.200000 0.999665
0.250000 0.999955
0.300000 0.999994
0.350000 0.999999
0.400000 1.000000
0.450000 1.000000
0.500000 1.000000
0.550000 1.000000
0.600000 1.000000
0.650000 1.000000
0.700000 1.000000
0.750000 1.000000
0.800000 1.000000
0.850000 1.000000
0.900000 1.000000
0.950000 1.000000
1.000000 1.000000
答案 0 :(得分:2)
int i;
float x[41], f[41], cof[i];
这是一个问题。在声明cof时我没有初始化。我应该初始化为你想要保持的浮动数量。由于你的for循环从0迭代到39,你可能希望cof有40个浮点数。
或者(为了符合C99之前的要求),您可以使用malloc:
float * cof = (float *) malloc(sizeof(float)*40);
除了符合C99之前的要求外,还可以根据需要重新分配更大的尺寸。但是,如果你不想要内存泄漏,它将需要通过free()重新分配。
您的代码中可能存在其他问题,但这肯定是其中之一。