求用c语言编写牛顿插值法

Python017

求用c语言编写牛顿插值法,第1张

牛顿插值法:

#include<stdio.h>

#include<alloc.h>

float Language(float *x,float *y,float xx,int n)

{

int i,j

float *a,yy=0.0

a=(float *)malloc(n*sizeof(float))

for(i=0i<=n-1i++)

{

a[i]=y[i]

for(j=0j<=n-1j++)

if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j])

yy+=a[i]

}

free(a)

return yy

}

void main()

{

float x[4]={0.56160,0.5628,0.56401,0.56521}

float y[4]={0.82741,0.82659,0.82577,0.82495}

float xx=0.5635,yy

float Language(float *,float *,float,int)

yy=Language(x,y,xx,4)

printf("x=%f,y=%f\n",xx,yy)

getchar()

}

‍2.牛顿插值法#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 *)y,N)

b=y[N]

for(i=N-1i>=0i--)b=b*(varx-x[i])+y[i]

printf("Nn(%f)=%f",varx,b)

getchar()

}

留下个邮箱,我发给你:牛顿插值法的程序设计与应用

程序代码如下。

希望能帮助到你!

牛顿插值法

#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

*

#include<stdio.h>

#include<stdlib.h>

#include<iostream.h>

typedef struct data

{

float x

float y

}Data//变量x和函数值y的结构

Data d[20]//最多二十组数据

float f(int s,int t)//牛顿插值法,用以返回插商

{

if(t==s+1)

return (d[t].y-d[s].y)/(d[t].x-d[s].x)

else

return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x)

}

float Newton(float x,int count)

{

int n

while(1)

{

cout<<"请输入n值(即n次插值):"//获得插值次数

cin>>n

if(n<=count-1)// 插值次数不得大于count-1次

break

else

system("cls")

}

//初始化t,y,yt。

float t=1.0

float y=d[0].y

float yt=0.0

//计算y值

for(int j=1j<=nj++)

{

t=(x-d[j-1].x)*t

yt=f(0,j)*t

//cout<<f(0,j)<<endl

y=y+yt

}

return y

}

float lagrange(float x,int count)

{

float y=0.0

for(int k=0k<countk++)//这儿默认为count-1次插值

{

float p=1.0//初始化p

for(int j=0j<countj++)

{//计算p的值

if(k==j)continue//判断是否为同一个数

p=p*(x-d[j].x)/(d[k].x-d[j].x)

}

y=y+p*d[k].y//求和

}

return y//返回y的值

}

void main()

{

float x,y

int count

while(1)

{

cout<<"请输入x[i],y[i]的组数,不得超过20组:"//要求用户输入数据组数

cin>>count

if(count<=20)

break//检查输入的是否合法

system("cls")

}

//获得各组数据

for(int i=0i<counti++)

{

cout<<"请输入第"<<i+1<<"组x的值:"

cin>>d[i].x

cout<<"请输入第"<<i+1<<"组y的值:"

cin>>d[i].y

system("cls")

}

cout<<"请输入x的值:"//获得变量x的值

cin>>x

while(1)

{

int choice=3

cout<<"请您选择使用哪种插值法计算:"<<endl

cout<<" (0):退出"<<endl

cout<<" (1):Lagrange"<<endl

cout<<" (2):Newton"<<endl

cout<<"输入你的选择:"

cin>>choice//取得用户的选择项

if(choice==2)

{

cout<<"你选择了牛顿插值计算方法,其结果为:"

y=Newton(x,count)break//调用相应的处理函数

}

if(choice==1)

{

cout<<"你选择了拉格朗日插值计算方法,其结果为:"

y=lagrange(x,count)break//调用相应的处理函数

}

if(choice==0)

break

system("cls")

cout<<"输入错误!!!!"<<endl

}

cout<<x<<" , "<<y<<endl//输出最终结果

}