⑴ 牛顿算法和拉格朗日插值算法的c语言实现

已经编译运行确认:

#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=1;j<=n;j++)
{
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=0;k<count;k++)//这儿默认为count-1次插值
{
float p=1.0;//初始化p
for(int j=0;j<count;j++)
{//计算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=0;i<count;i++)
{
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;//输出最终结果

}

⑵ 牛顿的插值法用C语言怎么编写怎么编啊

程序代码如下。
希望能帮助到你!
牛顿插值法
#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=1;k<=n;k
)
{
f[0]=y[k];
for(i=0;i<k;i
)
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
*

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

程序代码如下。
希望能帮助到你!

牛顿内插容值法
#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=1;k<=n;k++)
{
f[0]=y[k];
for(i=0;i<k;i++)
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-1;i>=0;i--)b=b*(varx-x[i])+y[i];
printf("Nn(%f)=%f",varx,b);
getchar();
}

⑷ 牛顿插值计算的c++代码

double newton(double *x, double *y, int n, double num, int cur, int pointNum, double answer)
{
//计算均差
for(int i = pointNum -1; i>cur; i--)
{
y[i] = ( y[i] - y[i-1] ) / ( x[i] - x[i-1] );
}

//已经计算完cur自加
cur++;

//temp进行临时计算
double temp = y[cur];
for(int i= 0; i<cur; i++)
{
temp *= ( num - x[i] );
}

//将临时计算的结果加到answer
answer += temp;

//如果得到想要的结果就返回答案 否则继续计算
if(cur==n)
return answer;
else
return newton(x,y,n,num,cur,pointNum,answer); /// 少了 return
}

⑸ 用C语言实现拉格朗日插值、牛顿插值、等距结点插值算法

#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=1;j<=n;j++)
{
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=0;k<count;k++)//这儿默认为count-1次插值
{
float p=1.0;//初始化p
for(int j=0;j<count;j++)
{//计算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=0;i<count;i++)
{
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;//输出最终结果

}

⑹ 拉格朗日插值法用C语言表示

我的程序是牛顿插值和拉格朗日插值合起来,你自己看下,用的是C++
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
#define N 100
void lagrange()
{
int n,k,m,q=1;
float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;
cout<<"请输入X的个数:";
cin>>n;
for(k=0;k<=n-1;k++)
{
cout<<"请输入X"<<k<<"的值:";
cin>>x[k];
cout<<"请输入Y"<<k<<"的值:";
cin>>y[k];
}
system("cls");
cout<<"则Xi与Yi表格如下:"<<endl;
cout<<"Xi"<<" ";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k];
cout<<endl;
cout<<"Yi"<<" ";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k];
cout<<endl;
while(q)
{
cout<<"请输入所求x的值:";
cin>>xx;
while(xx>x[k-1]||xx<x[0])
{
cout<<"输入错误,请重新输入:";
cin>>xx;
}
for(k=0;k<=n-1;k++)
{
if(xx<x[k])
{
m=k-1;
k=n-1;
}
}
yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m]));
cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl;
for(k=0;k<=n-1;k++)
{
if(xx<x[k])
{
m=k-1;
k=n-1;
}
}
if((xx-x[m])>(x[m+1]-xx))m=m+1;
else m=m;
yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1]));
yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1]));
yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m]));
yyy2=yy1+yy2+yy3;
cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl;
cout<<"是否输入其余要求x的值[是(1),否(0)]:";
cin>>q;
}
system("cls");
}
void main()
{
lagrange();
}

⑺ 编写牛顿均差插值多项式的程序用fortran语言

去年学的Fortran语言,许多算法都忘了。给你一个去年写的牛顿插值程序,需要改动的地方自己改,貌似循环计算(多层计算)那块处理得不错。

real*8 x(0:5),y(0:5),c(0:5),u1,u2,ci
data y/0.796,0.773,0.744,0.704,0.656,0.602/
open(1,file='7-2.dat')
write(*,*)'input u1=?,u2=?'
read(*,*)u1,u2
do i=0,5
x(i)=(i+1)*0.125
enddo
c(0)=y(0)
do i=1,5
call chashang(x,5,i,ci)
c(i)=ci
write(*,*)'c(i)=,i=',c(i),i
write(1,*)'c(i)=,i=',c(i),i
enddo
call newcha(u1,c,x,5)
call newcha(u2,c,x,5)
end
subroutine newcha(u,c,x,m)
real*8 c(0:m),x(0:m),u,N
S=c(0)
do i=1,5
N=c(i)
do j=0,i-1
N=N*(u-x(j))
enddo
S=S+N
enddo
write(*,*)u,s
write(1,*)u,s
end
subroutine chashang(x,m,i,ci)
real*8 y(0:5),x(0:m),f(1:i),ci
y(0)=0.796
y(1)=0.773
y(2)=0.744
y(3)=0.704
y(4)=0.656
y(5)=0.602
k=0
10 do j=1,i-k
f(j)=(y(j)-y(j-1))/(x(j+k)-x(j-1))
enddo
if(j==1) then
goto 5
else
do j=1,i-k
y(j-1)=f(j)
enddo
k=k+1
goto 10
endif
5 ci=f(j)
return
end

⑻ 数值分析计算实习题关于插值法,用C语言编程

①/*拉格朗日差值*/
#include<stdio.h>
#include<conio.h>
#define N 4
void main()
{int checkvalid(double x[],int n);
double Largrange(double x[],double y[],double varx,int n);
double x[N+1]={0.4,0.55,0.8,0.9,1};
double y[N+1]={0.41075,0.57815,0.88811,1.02652,1.17520};
double varx=0.5;
if(checkvalid(x,N)==1)
printf("\n\n插值结果:P(%f)=%f\n",varx,Largrange(x,y,varx,N));
else
printf("输入的插值节点的x值必须互异!");
getch();
}
int checkvalid(double x[],int n)
{int i,j;
for(i=0;i<n+1;i++)
for(j=i+1;j<n+1;j++)
if(x[i]==x[j])
return -1;
else
return 1;
}
double Largrange(double x[],double y[],double varx,int n)
{int k,j;
double A,B,C=1,D=0;
for(k=0;k<=n;k++)
{
C=1;
for(j=0;j<=n;j++)
{if(j!=k)
{
A=(varx-x[j]);
B=(x[k]-x[j]);
C=C*A/B;
}
}
D=D+C*y[k];
}
return D;
}
②/*牛顿插值*/
#include<stdio.h>
#include<conio.h>
#define N 4
int checkvalid(double x[],int n)
{
int i,j;
for(i=0;i<N;i++)
for(j=i+1;j<=N;j++)
{
if(x[i]==x[j])
return(-1);
}
return(1);
}

void chashang(double x[N],double y[N],double f[N][N])
{
int i,j,h;
for(j=0;j<=N;j++)
{
f[j][j]=y[j];
}
for(h=1;h<=N;h++)
{
for(i=0;i<=N-h;i++)
{
f[i][i+h]=(f[i+1][i+h]-f[i][i+h-1])/(x[i+h]-x[i]);
}
}
}

double compvalue(double f[N][N],double x[N],double y[N],double varx)
{
int i;
double t=1.000000,n=y[0];
chashang(x,y,f);
for(i=1;i<=N;i++)
{
t=t*(varx-x[i-1]);
n=n+f[0][i]*t;
}
return n;
printf("the result is %f.",n);
}

void main()
{
int i,j;double varx,x[N],y[N],f[N][N];
printf("input the value of x:");
for(i=0;i<N;i++)
scanf("%f",&x[i]);
if(checkvalid(x,N)==1)
{
printf("input the value of y:");
for(j=0;j<N;j++)
scanf("%f",&y[j]);
printf("input the value of varx:");
scanf("%f",&varx);
compvalue(f,x,y,varx);
}
else
printf("the value of x must be different!\n");
}

⑼ c语言程序翻译解释,这是一段程序中关于牛顿插值的程序,请帮忙把每句解释一下,printf不用解释。

{
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=0;i<=n-1;i++) //接收各个点的值
{
printf("x%d f(%d)分别为:",i,i);
scanf("%lf%lf",&x[i],&fx[i]); //循环接收各个点的x、y的值并存入
}
for(i=0;i<=n-1;i++)
f[i][0]=fx[i]; //把f[20][20]看成一个表,表的第一列按顺序存入因变量的各个值
for(j=1;j<=n-1;j++)
for(i=j;i<=n-1;i++)
f[i][j]=(f[i][j-1]-f[i-1][j-1])/(x[i]-x[i-j]); //公式,结合书上的图和上面一句话。。
for(k=0;k<20;k++)
{
printf("x=");
scanf("%lf",&xx); //用户输入的要求解的自变量值
if(xx==9999)
break; //如果自变量值太大了 就跳出去
Nx=f[0][0];
for(i=1;i<=n-1;i++)
{ t=1.0;
for(j=0;j<=i-1;j++) 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;
大概这样

⑽ 求一个牛顿插值C++代码

#include <iostream>
#include<iomanip>
using namespace std;
#define N 100
void main()
{
int i,k,n,hh;
double f[N][N],x[N];
//double ff;
cout<<"输入插值点的个数"<<endl;
cin>>n;
bb://cout<<"请输入插值点与插值点的值:"<<endl;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
f[k][i]=0;
}
}
for(i=0;i<n;i++)
{
//cout<<"请输入第"<<i+1<<"个插值点:"<<endl;
cin>>x[i];
//cout<<"请输入第"<<i+1<<"个插值点对应的值:"<<endl;
cin>>f[i][0];
}
cout<<" Xi ";
cout<<" f(Xi) ";
for(i=1;i<n;i++)
{
cout<<i<<"阶差商"<<" ";
}
cout<<endl;
for(k=1;k<n;k++)
{
for(i=k;i<n;i++)
{
f[i][k]=(f[i][k-1]-f[i-1][k-1])/(x[i]-x[i-k]);
}
}
for(k=0;k<n;k++)
{
cout<<setiosflags(ios::fixed);
cout<<x[k]<<" ";
for(i=0;i<n;i++)
{
cout<<setiosflags(ios::fixed);
if(f[k][i]!=0)
cout<<f[k][i]<<" ";
}
cout<<endl;
}
cout<<"插值多项式为:"<<endl;
cout<<"f(x)="<<f[0][0];
for(i=1;i<n;i++)
{
cout<<"+";
for(k=0;k<i;k++)
{
cout<<"[x-("<<x[k]<<")]*";
}
cout<<"("<<f[i][i]<<")\n";
}
double xx;
cout<<"输入插值点"<<endl;
cin>>xx;
double a=0;
cout<<"f(x)=";
for(i=1;i<n;i++)
{
double b=1;
for(int j=0;j<i;j++)
{
b=b*(xx-x[j]);
}
a+=b*f[i][i];
}
a=a+f[0][0];
cout<<a<<endl;
//**************************
double kk=0;
for(i=0;i<n;i++)
{
double m=1;
for(int j=0;j<n;j++)
{
if(i!=j)
m=m*((xx-x[j])/(x[i]-x[j]));
}
kk=kk+m*f[i][0];
}
cout<<kk;
cout<<"是否继续?是(0),否(1)"<<endl;
cin>>hh;
if(hh!=1)
goto bb;
else exit(1);
}
//验证数据:0.5236 0.5 0.7854 0.7071 1.0472 0.8660 1.5708 1

李小龙!