C语言实现拉格朗日插值法代码

合集下载

线性插值、抛物插值、拉格朗日、牛顿插值代码

线性插值、抛物插值、拉格朗日、牛顿插值代码

计算机数值计算方法及程序设计P63函数值为//拉格朗日插值P63#include <stdio.h>float czl(int n,float x1,float *px,float *py);int main(){float x1,y1;int n;float *p1,*p2;float x[10]={1,2,3,4,5,6,7};float y[10]={1,1.414214,1.732051,2,2.236068,2.449490,2.645751};printf("Input numbers:x1 n=\n");scanf("%f%d",&x1,&n);p1=x;p2=y;y1=czl(n,x1,p1,p2);printf("y1=%f\n",y1);getch();return 0;}float czl(int n,float x1,float *px,float *py){int i,j;float x[10],y[10],t,y1;y1=0.0;for(i=0;i<n;i++,px++,py++){x[i]=*px;y[i]=*py;}for(i=0;i<n;i++){t=1.0;for(j=0;j<n;j++)if(i!=j)t=t*(x1-x[j])/(x[i]-x[j]);y1=y1+t*y[i];}return(y1);}//输入为//2.5 4//输出为//y=1.582274//线性插值P58#include <stdio.h>float cz(float x0,float x1,float y0,float y1,float x); int main(void){float x0,x1,y0,y1,x,y;printf("Input numbers:x0,x1,y0,y1,x=?\n");scanf("%f%f%f%f%f",&x0,&x1,&y0,&y1,&x);y=cz(x0,x1,y0,y1,x);printf("y=%f\n",y);}float cz(float x0,float x1,float y0,float y1,float x) {float l0,l1,y;l0=(x-x1)/(x0-x1);l1=(x-x0)/(x1-x0);y=l0*y0+l1*y1;return (y);}/*输入:1 5 1 2.6.68 2.5输出y=1.463526 *////抛物插值P60#include<stdio.h>float cz(float x0,float x1,float x2,float y0,float y1,float y2,float x); float cz(float x0,float x1,float x2,float y0,float y1,float y2,float x) {float l0,l1,l2,y;l0=(x-x1)*(x-x2)/((x0-x1)*(x0-x2));l1=(x-x0)*(x-x2)/((x1-x0)*(x1-x2));l2=(x-x0)*(x-x1)/((x2-x0)*(x2-x1));y=l0*y0+l1*y1+l2*y2;return(y);}int main(void){float x0,x1,x2,y0,y1,y2,x,y;printf("Input numbers:x0 x1 x2 y0 y1 y2 x=?\n");freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);scanf("%f%f%f%f%f%f%f",&x0,&x1,&x2,&y0,&y1,&y2,&x);y=cz(x0,x1,x2,y0,y1,y2,x);printf("y=%f\n",y);getch();getch();return 0;}/*输入:1 3 5 1 1.732051 2.236068 2.5输出y=1.570416 *///牛顿插值P83#include<stdio.h>#include<math.h>#define N 6float sub(float a[],float b[],float x,float e); main(){float u[N]={100,121,122,169,196,225}; float v[N]={10,11,12,13,14,15};float x,y,e,*p1,*p2;printf("Input number x e= ");scanf("%f%e",&x,&e);p1=u;p2=v;y=sub(p1,p2,x,e);printf("y=%f\n",y);getch();getch();}float sub(float *pp1,float *pp2,float x,float e) {float a[N],b[N],t[N],y,y1,c;int i,k;for(i=0;i<N;i++,pp1++) {a[i]=*pp1;printf("%12.6",a[i]);}printf("\n");for(i=0;i<N;i++,*pp2++) {b[i]=*pp2;printf("%12.6f",b[i]);}printf("\n");y1=b[0];y=0;c=1.0;for(k=1;k<N;k++) {for(i=k;i<N;i++){t[i]=(b[i]-b[i-1])/(a[i]-a[i-k]);}c=c*(x-a[k-1]);y1=y1+c*t[k];if(fabs(y-y1)<e) y=y1;for(i=k;i<N;i++){b[i]=t[i];}}return(y);}。

拉格朗日插值牛顿插值C语言实验报告

拉格朗日插值牛顿插值C语言实验报告

实验报告:数学与统计学系信息与计算科学专业实验报告一、题目1、上机作业题程序12、上机作业题程序2二、算法1、Lagrange 插值//输入被插值点的数目POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:"); //输入计算Lagrange插值多项式的x值scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值//输入被插值点的数目POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);// getch(); return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");//输入计算Newton插值多项式的x值scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}//计算f(x_0,…,x_n)的差商}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}三、C程序1、Lagrange 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{double x;double y;}POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N); return 1;}printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:");scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{ double x;double y;} POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if (n<=0){printf("Please input a number between 1 and %d.\n",MAX_N);return 1;}//输入被插值点(x_i,y_i)printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}四、运行结果1、Lagrange 插值1910年Larange插值计算得到的人口数:1965年Larange插值计算得到的人口数:2002年Larange插值计算得到的人口数:从插值计算得出的结果1910年的人口数是31872000人,1965年的人口数约为193081511人,2002年的人口数约为26138748,而1910年的实际人口数为91772000人,1960年的实际人口数为179323000人,1970年的人口数为203212000人,所以拉格朗日插值计算得出的结果只有1965年的人口数与实际值相差较近,而1910年和2002年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。

拉格朗日插值法与牛顿插值法

拉格朗日插值法与牛顿插值法
}
printf("请输入y\n");
for(i=0;i<N;i++)
{
scanf("%f",&y[i]);
}
printf("请输入要计算的点\n");
scanf("%f",&n);
s=y[0];
p=1;
for(i=1;i<N;i++)
{
for(j=1;j<N-i;j++)
{
y[j-1]=(y[j]-y[j-1])/(x[j+i-1]-x[j-1]);
}
p=p*(n-x[i-1]);
s=s+y[0]*p;
}
printf("%f\n",s);
}
变成中关键是要计算出插商,才能使计算结果准确无误。
程序代码
#include <stdio.h>
#define N 3
void main()
{
float x[N],y[N],s,p,n;
int i,j;
printf("请输入x\n");
for(i=0;i<N;i++)
{
scanf("%f",&x[i]);
程序代码:
#include <stdio.h>
#define N 3
void main()
{
float x[N],y[N],l[N],m,s,t,n;
int i,j,k;
printf("请输入x\n");
for(i=0;i<N;i++)

拉格朗日插值

拉格朗日插值

/* 拉格朗日插值*/# include <stdio.h>void main ( ){float li (float z,float x[100],int n,int i); /* 函数声明*/ void input (float a[100],int n);int n; /* 插值多项式的次数n */printf ("请输入插值多项式的次数n:\n");scanf ("%d",&n);float x[100]; /* 存储x */printf ("请输入数据x(插值节点):\n");input (x,n+1); /* 调用一维数组输入函数*/float y[100]; /* 存储y */printf ("请输入数据y(插值节点对应的函数值):\n");input (y,n+1); /* 调用一维数组输入函数*/float z; /* 存储插值点*/printf ("请输入插值点:\n");scanf ("%f",&z);float s=0,t; /* 计算插值点对应的函数值*/int i;for (i=0;i<=n;i++){t=y[i]*li(z,x,n,i);s=s+t;}printf ("L%d(%f)=%f\n",n,z,s); /* 输出结果*/}float li (float z,float x[100],int n,int i) /* 定义基函数*/ {float a=1,b=1,c=1,d=1,t;int j;for (j=0;j<i;j++){t=z-x[j];a=a*t;}for (j=i+1;j<=n;j++){t=z-x[j];b=b*t;}a=a*b;for (j=0;j<i;j++){t=x[i]-x[j];c=c*t;}for (j=i+1;j<=n;j++){t=x[i]-x[j];d=d*t;}c=c*d;return (a/c);}void input (float a[100],int n) /* 定义数组输入函数*/ {int i;for (i=0;i<n;i++)scanf ("%f",&a[i]);}。

Lagrange插值的C语言编程

Lagrange插值的C语言编程

} } for(ii=0;ii<nn;ii++) *(pyy+ii)=*(result+ii); free(result); return 0; } void main() { //用 Lagrange 高次插值、分段线性插值、分段抛物插值对数据进行插值 int n=8,nn=15; double *x=(double *)malloc(n*sizeof(double)); x[0]=0; for(int i=1;i<n;i++) x[i]=x[i-1]+2; double *y=(double *)malloc(n*sizeof(double)); y[0]=0; for(i=1;i<n;i++) y[i]=y[i-1]+0.005; double *xx=(double *)malloc(nn*sizeof(double)); xx[0]=0; for(i=1;i<nn;i++) xx[i]=xx[i-1]+1; double *yy=(double *)malloc(nn*sizeof(double)); printf("插值前:\n"); printf("x= "); for(i=0;i<=n-1;i++) printf("%lf ",x[i]); printf("\n"); printf("y= "); for(i=0;i<=n-1;i++) printf("%lf ",y[i]); printf("\n"); //LInterp(x,y,n,xx,yy,nn); //PLInterp(x,y,n,xx,yy,nn); PPInterp(x,y,n,xx,yy,nn); printf("插值后:\n"); printf("x= "); for(i=0;i<=n-1;i++) printf("%lf ",x[i]); printf("\n"); printf("y= "); for(i=0;i<=n-1;i++) printf("%lf ",y[i]); printf("\n"); printf("xx= "); for(i=0;i<=nn-1;i++) printf("%lf ",xx[i]); printf("\n"); printf("yy= "); for(i=0;i<=nn-1;i++)

拉格朗日(Lagrange)插值算法

拉格朗日(Lagrange)插值算法

拉格朗⽇(Lagrange)插值算法拉格朗⽇插值(Lagrange interpolation)是⼀种多项式插值⽅法,指插值条件中不出现被插函数导数值,过n+1个样点,满⾜如下图的插值条件的多项式。

也叫做拉格朗⽇公式。

这⾥以拉格朗⽇3次插值为例,利⽤C++进⾏实现:1//利⽤lagrange插值公式2 #include<iostream>3using namespace std;45double Lx(int i,double x,double* Arr)6 {7double fenzi=1,fenmu=1;8for (int k=0;k<4;k++)9 {10if (k==i)11continue;12 fenzi*=x-Arr[k];13 fenmu*=Arr[i]-Arr[k];14 }15return fenzi/fenmu;16 }1718int main()19 {20double xArr[4]={};21double yArr[4]={};22//输⼊4个节点坐标23 cout<<"请依次输⼊4个节点的坐标:"<<endl;24for (int i=0;i<4;i++)25 cin>>xArr[i]>>yArr[i];2627//输⼊要求解的节点的横坐标28 cout<<"请输⼊要求解的节点的横坐标:";29double x;30 cin>>x;31double y=0;32for (int i=0;i<4;i++)33 y+=Lx(i,x,xArr)*yArr[i];34 printf("x=%lf时,y=%lf\n",x,y);3536//分界,下⾯为已知y求x37 cout<<"请输⼊要求解的节点的纵坐标:";38 cin>>y;39 x=0;40for (int i=0;i<4;i++)41 x+=Lx(i,y,yArr)*xArr[i];42 printf("y=%lf时,x=%lf\n",y,x);4344 system("pause");45return0;46 }作者:耑新新,发布于转载请注明出处,欢迎邮件交流:zhuanxinxin@。

拉格朗日插值法(c++)

拉格朗日插值法(c++)

拉格朗⽇插值法(c++)已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,计算sin0.3367的值#include <iostream>#include<iomanip>#include <cmath>using namespace std;int main(){double numerator_cofficient; //⽤来记录插值分⼦的乘积结果double denominator_coefficient; //⽤来记录插值分母乘积的结果double input_x; //需要输⼊的x的值double x[3]={0.32,0.34,0.36}; //已知x的值double y[3]={0.314567,0.333487,0.352274}; //已知y的值double result=0; //⽤来记录插值结果cout<<"通过拟合得到的拉格朗⽇多项式为:"<<endl;for (int i=0;i<3;i++){denominator_coefficient=1;cout<<y[i]<<"*";for (int j=0;j<3;j++){if (i==j)continue;cout<<"("<<"x-"<<x[j]<<")";}cout<<"/";for (int j=0;j<3;j++){if (i==j)continue;denominator_coefficient*=(x[i]-x[j]);}cout<<denominator_coefficient<<"*"<<"("<<"x-"<<x[i]<<")";if (i<3){cout<<"+";}}cout<<endl;cout<<"请输⼊需要插值的x:";cin>>input_x;for (int i=0;i<3;i++){numerator_cofficient=1;denominator_coefficient=1;for (int j=0;j<3;j++){if (i==j)continue;numerator_cofficient*=(input_x-x[j]);}for (int j=0;j<3;j++){if (i==j)continue;denominator_coefficient*=(x[i]-x[j]);}result+=(y[i]*numerator_cofficient/denominator_coefficient);}cout<<"插值结果为:"<<setiosflags(ios::fixed)<<setprecision(10)<<result<<endl;cout<<"函数的真实值:"<<sin(0.3367)<<endl;cout<<"计算误差为:"<<100*(abs(result-sin(0.3367))/sin(0.3367))<<"%"<<endl; return 0;}。

拉格朗日和牛顿插值法的C 方法实现(数值分析上机实验)

拉格朗日和牛顿插值法的C  方法实现(数值分析上机实验)

数值分析上机实验实验一一.上机题目:已知: 4 =2,9 =3,16 =4分别用二次Lagrange和Newton插值法求7 的近似值。

二.解题方法:1.lagrange方法:设x0=4,y0=2,x1=9,y1=3,x2=16,y2=4代入方程:(x1-X)(x2-X)/(x1-x0)(x2-x0)*y0+(x0-X)(x2-X)/(x0-x1)(x2-x1)*y1+(x1-X)(x0-X)/(x1-x2)(x0-x2)*y2令X=7代入方程得 Y=2.628572.Newton方法:设x0=4,y0=2,x1=9,y1=3,x2=16,y2=4建表4 29 3 0.216 4 0.14286 -0.00476f(x)=f(x0)+f[x0,x1](X-x0)+f[x0,x1,x2](X-x0)(X-x1)(X-x2)令X=7代入方程得Y=2.62857三.算法公式步骤:grange方法:通过公式写出算法并得出最后的值Y:for(b=0;b<m;b++)//完成公式f(Xn)外层嵌套循环f[b]=i//{double l=1;//保证每次跳出内层循环将L置1 不会将第一项的值带入下一项//for(a=0;a<m;a++)//完成公式f(Xn)内层嵌套循环f[a]=j//{if(a!=b)//完成定义i=1,i!=j//l=(f[a]-F)/(f[a]-f[b])*l;//完成(j-m)/(j-i)//la=l*g[b];//完成公式的F(X0)=f(X0)*Y0并累乘输出结果// }Y=la+Y;//累加x0y0+x1y1+...得最后结果//}2.Newton方法:先建表,通过二维数组的思想建表for(l=2;l<m+2;l++)//外层循环控制y阶数//{for(k=1;k<m+1;k++)//内层循环控制x个数//{a[k][l]=(a[k][l-1]-a[k-1][l-1])/(a[k][0]-a[k-l+1][0]);//完成f(x0,x1,...,xn)并存表//}}填表。

拉格朗日插值法c语言

拉格朗日插值法c语言

实验报告实验课程名称数值计算方法实验项目名称 Lagrange插值公式年级专业学生姓名学号理学院实验时间:201 年月日学生实验室守则一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。

二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。

三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。

四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。

五、实验中要节约水、电、气及其它消耗材料。

六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。

七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。

仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。

八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。

九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。

十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。

十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。

学生所在学院:专业:班级:韩非子名言名句大全,韩非子寓言故事,不需要的朋友可以下载后编辑删除!!1、千里之堤,毁于蚁穴。

——《韩非子·喻老》2、华而不实,虚而无用。

——《韩非子·难言》3、欲速则不达。

拉格朗日插值--C语言实现

拉格朗日插值--C语言实现
附 页
1.源程序
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "graphics.h"
#include "math.h"
typedef struct
{
float x;
float y;
{
int i;
int Max_y;
Max_y = 0.0;
for(i=0;i<n;++i)
if(Max_y<fabs(Table[i].y))
Max_y=fabs(Table[i].y);
return(Max_y);
}
void DrawCoordinate(int X1,int Y1,int X2,int Y2,float x1,float y1,float x2,float y2)
{
char String[20];
setcolor(color);
gcvt(RealNumber,Length,String);
outtextxy(x,y,String);
}
void ShowTable(POINT Table[],int n)
{
int i;
char String_x[20],String_y[20];
line1(0,20,639,20,7);
line(30,0,30,40);
outtextxy1(10,8,"x",14);
outtextxy1(10,28,"y",14);

拉格朗日插值法程序设计

拉格朗日插值法程序设计

拉格朗日插值法程序设计下面是一个使用拉格朗日插值法进行插值的程序设计:```python#导入所需库import numpy as npdef lagrange_interpolation(x, y, xi):""":param x: 已知数据点的横坐标,为一个列表或一维数组:param y: 已知数据点的纵坐标,为一个列表或一维数组:param xi: 插值点的横坐标,为一个数值或一维数组:return: 插值点对应的纵坐标"""n = len(x)ni = len(xi)yi = np.zeros(ni)#计算拉格朗日插值多项式的各个项for i in range(n):p=1for j in range(n):if j != i:p *= (xi - x[j]) / (x[i] - x[j])yi += y[i] * preturn yi#测试x = np.array([0, 1, 2, 3, 4, 5]) # 已知数据点的横坐标y = np.array([1, 2, 3, 4, 5, 6]) # 已知数据点的纵坐标xi = np.array([0.5, 1.5, 2.5, 3.5, 4.5]) # 插值点的横坐标yi = lagrange_interpolation(x, y, xi) # 调用拉格朗日插值函数print("插值点的纵坐标:", yi)```在这个程序中,我们首先导入了所需的库,然后定义了一个名为`lagrange_interpolation`的函数,它接受三个参数:已知数据点的横坐标`x`、纵坐标`y`,以及插值点的横坐标`xi`。

函数内部,我们首先初始化了一些变量,然后使用了两个嵌套的循环,计算了拉格朗日插值多项式的各个项,最后将结果保存到`yi`数组中并返回。

在程序的主体部分,我们定义了一个测试用例,`x`和`y`分别表示已知数据点的横纵坐标,`xi`表示要插值的点的横坐标。

牛顿和拉格朗日插值算法源代码及流程图-报告

牛顿和拉格朗日插值算法源代码及流程图-报告

牛顿和拉格朗日插值算法源代码及流程图-报告流程图找站长要//编译平台:2000+vc6.0//实验一//作者:计算机科学与技术#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);elsereturn (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;elsesystem("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;//初始化pfor(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;//输出最终结果}。

拉格朗日插值编程实现

拉格朗日插值编程实现

拉格朗⽇插值编程实现拉格朗⽇插值原理:拉格朗⽇插值的具体介绍⽹址:https:///wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95翻译成⼈话就是,该曲线是由多个n次多项式的和构成的,n是参与插值的点的个数。

每个n次多项式的计算⽅法如上图所⽰。

转化成程序的话,就是要保存每个多项式中(x-xi)中的每⼀项xi。

然后就是系数yi/(xj-x0)(xj-x1)...(xj-xk)程序实现:#include <iostream>#include <opencv2/opencv.hpp>using namespace cv;template<class T>struct Point{T x;T y;Point(){x=0;y=0;}Point(T a,T b){x=a;y=b;}Point operator+(Point p){return Point(x+p.x,y+p.y);}};/*拉格朗⽇曲线,包含多个拉格朗⽇多项式和曲线的x坐标最⼤最⼩值*/struct LagrangeCurve{vector<double>factor;vector<double>minuend;int minX;int maxX;};void calLagrangePolynomial(LagrangeCurve&curve,Point<int>*curvePoints,int pointNum){int i,j;curve.maxX=curvePoints[0].x;curve.minX=curvePoints[0].x;for(i=0;i<pointNum;++i){curve.minuend.push_back(curvePoints[i].x);curve.factor.push_back(curvePoints[i].y);//获取曲线两端的x值if(curvePoints[i].x<curve.minX)curve.minX=curvePoints[i].x;if(curvePoints[i].x>curve.maxX)curve.maxX=curvePoints[i].x;//计算(xi-x0)*...(xi-x5),并且把x0...x5保存for(j=0;j<pointNum;++j){if(j!=i){curve.factor[i]/=(curvePoints[i].x-curvePoints[j].x+1e-8);}}}}double getInterpolation(int x,LagrangeCurve& lagrangeCurve) {int i,j;double y=0;for(i=0;i<lagrangeCurve.minuend.size();++i){double temp=lagrangeCurve.factor[i];for(j=0;j<lagrangeCurve.minuend.size();++j){if(j!=i){temp*=(x-lagrangeCurve.minuend[j]);}}y+=temp;}return y;}int main(int argc, const char * argv[]){Mat img(256,256,CV_8UC3);img=Scalar::all(255);Point<int>*points=new Point<int>[3];points[0].x=10;points[0].y=30;points[1].x=100;points[1].y=70;;points[2].x=250;points[2].y=210;circle(img, cvPoint(points[0].x,points[0].y),5,Scalar::all(0),-1); circle(img, cvPoint(points[1].x,points[1].y),5,Scalar::all(0),-1); circle(img, cvPoint(points[2].x,points[2].y),5,Scalar::all(0),-1); LagrangeCurve lagrangeCurve;calLagrangePolynomial(lagrangeCurve,points,3);for(int i=lagrangeCurve.minX;i<lagrangeCurve.maxX;++i){double y=getInterpolation(i,lagrangeCurve);img.at<Vec3b>(static_cast<int>(y+0.5),i)=Vec3b(0,0,0); }imshow("img", img);waitKey(-1);return0;}上述代码使⽤到了opencv画图,运⾏结果图如下:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档