希望能帮助到你!
牛顿插值法
#include<stdio.h>
#include<math.h>
#define
n
4
void
difference(float
*x,float
*y,int
n)
{
float
*f
int
k,i
f=(float
*)malloc(n*sizeof(float))
for(k=1k<=nk
)
{
f[0]=y[k]
for(i=0i<ki
)
f[i
1]=(f[i]-y[i])/蠢胡陪做郑(x[k]-x[i])
y[k]=f[k]
}
return
}
main()
{
int
i
float
varx=0.895,b
float
x[n
1]={0.4,0.55,0.65,0.8,0.9}
float
y[n
1]={0.41075,0.57815,0.69675,0.88811,1.02652}
difference(x,(float
*
好2处数组下标溢出迟信1、g数组只有N个元素,下标可访问区间为[0 , N-1],码纯轮下面这个代码相当于访问了g[N]了
for(j=Nj>ij--)
{
g[j]=(g[j]-g[j-1])/(x[j]-x[j-i-1])
}
2、g数组最大不裤弯能到达N,当i=N的时候,tmp*g[i]这里会访问溢出
for(i=1i<=Ni++)
{
tmp*=(u-x[i-1])
newton=newton+tmp*g[i]
}
{double x[20],fx[20],f[20][20],xx,Nx,t //定义双精度的3个一维数组、一个二维数组、3个变量
int i,j,k,n //定义4个整型变桐旅宏量
printf(" 请输入插值点的个数n:")
scanf("%d",&n) //点的个数存入n
printf(" 请输入插值节点值和插值点函数值:\n")
for(i=0i<=n-1i++) //接收各个局册点的值
{
printf("x%d f(%d)分别为:",i,i)
scanf("%lf%lf",&x[i],&fx[i]) /镇孙/循环接收各个点的x、y的值并存入
}
for(i=0i<=n-1i++)
f[i][0]=fx[i] //把f[20][20]看成一个表,表的第一列按顺序存入因变量的各个值
for(j=1j<=n-1j++)
for(i=ji<=n-1i++)
f[i][j]=(f[i][j-1]-f[i-1][j-1])/(x[i]-x[i-j]) //公式,结合书上的图和上面一句话。。
for(k=0k<20k++)
{
printf("x=")
scanf("%lf",&xx) //用户输入的要求解的自变量值
if(xx==9999)
break //如果自变量值太大了 就跳出去
Nx=f[0][0]
for(i=1i<=n-1i++)
{ t=1.0
for(j=0j<=i-1j++) t=t*(xx-x[j]) //又是公式,就是(x-x0)*(x-x1)*...(x-xn)
Nx=Nx+t*f[i][i] //公式的尽头
}
printf("N(%f)=%f\n",xx,Nx) //输出用户输入的自变量对应的因变量的值()
}
}
break
大概这样
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)