C语言实现牛顿插值法

合集下载

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

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

牛顿算法和拉格朗日插值算法的C语言实现悬赏分:200 - 解决时间:2009-1-8 07:47求如下两个算法的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);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;//输出最终结果}回答者:希声和寡-魔导师十一级1-7 23:18我来评论>>提问者对于答案的评价:你是第一个吧,谢谢了您觉得最佳答案好不好?目前有0 个人评价50% (0)50%(0)相关内容• 100分求高手帮我写下牛顿插值和样条插值的VB代码,急...• 拉格朗日插值工式是什么?• 拉格朗日插值里,什么是龙格现象?谢谢!• 5次拉格朗日插值多项式• 怎么用c++语言实现拉格朗日插值更多关于插值算法c的问题>>查看同主题问题:拉格朗日牛顿算法插值语言其他回答共 2 条我们做的实验课呵呵上面的是牛顿下面的是啦格朗日#include<iostream.h>void newton(){float x[100],y[100],c[100][100],x1,xp,wx;int n,i,j;cout<<"输入数据组的个数"<<endl;cin>>n;for(i=0;i<n;i++){cout<<"当前输入第"<<i<<"组数据"<<endl;cin>>x[i];cin>>y[i];}for(j=0;j<n;j++){if(j>0)for(i=0;i<n-j;i++)c[i][j]=((c[i+1][j-1]-c[i][j-1])/(x[i+j]-x[i]));elsefor(i=0;i<n;i++)c[i][0]=y[i];}xp=y[0];char m='y';while(m=='y'){cout<<"请输入你要求的点的X值:"<<endl;cin>>x1;for(i=1;i<n;i++){wx=1;for(j=0;j<=i-1;j++)wx=wx*(x1-x[j]);xp=xp+c[0][i]*wx;}cout<<"newton插值的结果为:"<<xp<<endl;cout<<"是否想继续计算(Y/N)"<<endl;cin>>m;}}void main(){newton();}-------------------------------------------------------#include "stdio.h"#include "iostream.h"#include "string.h"typedef struct{double x;double y;}point;int main(int argc, char* argv[]){double X,jg1,jg2;int i,j;int n;point point[100];cout<<"input n"<<endl;cin>>n;cout<<"input x"<<endl;for(i=0;i<n;i++)cin>>point[i].x;cout<<"input y"<<endl;for(i=0;i<n;i++)cin>>point[i].y;cout<<"input the number you want to compute:"<<endl;cin>>X;for(i=0;i<n;i++){jg1=1;for(j=0;j<n;j++){if(i!=j)jg1=jg1*((X-point[j].x)/(point[i].x-point[j].x));}jg2=jg2+(point[j].y)*jg1;}cout<<jg2;}回答者:a4321559 - 经理四级1-7 23:55分数给a4321559 吧。

用C语言实现牛顿向前插值计算

用C语言实现牛顿向前插值计算

用C语言实现牛顿向前插值计算,程序代码如下:#include "stdlib.h"#include "stdio.h"#include "conio.h"#include "string.h"#include "math.h"#define N 100typedef struct{float x;float y;}POINT;float CreTable(int n,POINT Table[N],float y[N][N]){int i,j,count=0;for(i=0;i<n;i++){printf("Input %dth point(x%d,y%d):",i+1,i+1,i+1);scanf("%f,%f",&Table[i].x,&Table[i].y);}for(i=0;i<n;i++)y[i][0]=Table[i].y;for(j=1;j<n;j++,count++){i=count;for(;i<n-1;i++)y[i+1][j]=y[i+1][j-1]-y[i][j-1];}}float ShowTable(int n,POINT Table[N],float y[N][N]){int i,j;printf("\nForward difference table:\n");printf(" x y\n");for(i=0;i<n;i++){printf("%10.5f",Table[i].x);for(j=0;j<=i;j++){printf("%10.5f",y[i][j]);if(j==i) printf("\n");}}}float Calculus(int n,POINT Table[N],float y[N][N]) {int i,j,k,count[N]={0};float tmp1,tmp2,tmp3,sum,a[N],h[N],x[N],t[N];printf("\nNumber of x:");scanf("%d",&k);for(j=0;j<k;j++){printf("Input x0[%d]:",j+1);scanf("%f",&a[j]);printf("Input x[%d]:",j+1);scanf("%f",&x[j]);printf("Input h[%d]:",j+1);scanf("%f",&h[j]);t[j]=(x[j]-a[j])/h[j];printf("t[%d]=%.5f\n",j+1,t[j]);for(i=0;i<n;i++)if(Table[i].x==a[j]){count[j]=i;break;}}printf("\nThe results:");for(j=0;j<k;j++){tmp1=1;tmp2=1;sum=y[count[j]][0];for(i=1;;i++){tmp1=tmp1*(t[j]-i+1);tmp2=tmp2*i;tmp3=tmp1*y[count[j]+i][i]/tmp2;sum=sum+tmp3;if(count[j]+i==n-1) break;}printf("\n N(%f)= %f",x[j],sum);}}int main(){int n;float y[N][N],x[N];POINT Table[N];printf("Number of points n=");scanf("%d",&n);CreTable(n,Table,y);ShowTable(n,Table,y);Calculus(n,Table,y);getch();}。

Newton插值的C++实现

Newton插值的C++实现

Newton插值的C++实现Newton(⽜顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗⽇)插值法。

其重点在于差商(Divided Difference)表的求解。

步骤1. 求解差商表,这⾥采⽤⾮递归法(看着挺复杂挺乱,这⾥就要⾃⼰动笔推⼀推了,闲了补上其思路),这样,其返回的数组(指针)就是差商表了,/** 根据插值节点及其函数值获得差商表* 根据公式⾮递归地求解差商表* x: 插值节点数组* y: 插值节点处的函数值数组* lenX: 插值节点的个数* return: double类型数组*/double * getDividedDifferenceTable(double x[], double y[], int lenX) {double *result = new double[lenX*(lenX - 1) / 2];for (int i = 0; i < lenX - 1; i++) {result[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);}int step = lenX - 1; // 增加步长int yindex = lenX - 1; // 分⼦的基准值,线性减速递增int xgap = 2; // 分母的间距,每次+1int xstep = 2;while (step >= 1) {for (int i = 0; i < step - 1; i++) {result[yindex + i] = (result[yindex - step + i + 1] - result[yindex - step + i]) / (x[xstep + i] - x[xstep + i - xgap]);}yindex += (step - 1);xstep++;step--;xgap++;}return result;}步骤 2. 取得差商表每⼀列的第⼀个作为基函数的系数/*** 从差商表中获取⼀定阶数的某个差商* dd: 差商表* len: 差商表的长度* rank: 所取差商的阶数* index: rank阶差商的第index个差商* return: 返回double类型所求差商*/double getDividedDifference(double dd[], int len, int rank, int index) {// 根据差商表的长度求解差商的最⾼阶数// 由于差商表是三⾓形的,因此有规律可循,解⽅程即可int rankNum = (int)(0.5 + sqrt(2 * len + 0.25) - 1);printf("%d 阶差商 \n", rank);int pos = 0;int r = 1;// 根据n+(n+1)+...+(n-rank)求得rank阶差商在差商表数组中的索引while (rank > 1){// printf("geting dd's index, waiting...\n");pos += rankNum;rank--;rankNum--;}pos += index; // 然后加上偏移量,意为rank阶差商的第index个差商return dd[pos];}步骤3. Newton 插值主流程/** Newton Interpolating ⽜顿插值主要代码* x: 插值节点数组* y: 插值节点处的函数值数组* lenX: 插值节点个数(数组x的长度)* newX: 待求节点的数组* lennx: 待求节点的个数(数组lenX的长度)*/double *newtonInterpolation(double x[], double y[], int lenX, double newX[], int lennx) {// 计算差商表double *dividedDifferences = getDividedDifferenceTable(x, y, lenX);//double *result = new double[lennx];// 求差商表长度int ddlength = 0;for (int i = 1; i < lenX; i++){ddlength += i;}// 打印差商表信息printf("=======================差商表的信息=======================\n");printf("差商个数有:%d, 待插值节点个数:%d\n =======================差商表=======================", ddlength, lennx); int ifnextrow = 0; // 控制打印换⾏for (int i = 0; i < ddlength; i++) {if (ifnextrow == (i)*(i + 1) / 2)printf("\n");printf("%lf, ", dividedDifferences[i]);ifnextrow++;}printf("\n");// 计算Newton Interpolating 插值double ddi = 0;double coef = 1;for (int i = 0; i < lennx; i += 2) {coef = (double)1;result[i] = y[i];printf("=============打印计算过程=============\n");for (int j = 1; j < lenX -1; j++) {coef *= (newX[i] - x[j - 1]);ddi = getDividedDifference(dividedDifferences, ddlength, j, 0);printf("取得差商: %lf\n", ddi);result[i] = result[i] + coef * ddi;printf("计算result[%d] + %lf * %lf", i, coef, ddi);printf("获得结果result %d: %lf\n", i, result[i]);}printf("result[%d] = %lf\n", i, result[i]);// =======================选做题:求误差==========================printf("求解截断误差所需差商:%lf\n", getDividedDifference(dividedDifferences, ddlength, lenX-1, 0));// printf("求解截断误差所需多项式:%lf\n", coef);printf("求解截断误差所需多项式的最后⼀项:%lf - %lf\n", newX[i] , x[lenX - 2]);result[i + 1] = getDividedDifference(dividedDifferences, ddlength, lenX - 1, 0)*coef*(newX[i] - x[lenX - 2]);// ===============================================================}if (dividedDifferences) {delete[] dividedDifferences;}return result;}步骤4. 主函数⽰例int main(){std::cout << "Hello World!\n";printf("Newton插值!\n");double x[] = {0.40, 0.55, 0.65, 0.80, 0.90, 1.05};//double x[] = { 1.5, 1.6, 1.7 };int lenX = sizeof(x) / sizeof(x[0]);double y[] = {0.41075, 0.57815, 0.69675, 0.88811, 1.02652, 1.25382};//double y[] = { 0.99749, 0.99957, 0.99166 };double newx[] = {0.596};//double newx[] = { 1.609 };// 计算⽜顿插值结果和截断误差double *result = newtonInterpolation(x, y, lenX, newx, 1);printf("=====================最终结果=====================\n");printf("求得sin(1.609)的近似值为:%lf\n", *result);printf("截断误差:%.10lf\n", *(result + 1));if (result) {delete[] result;}return0;}。

c++实现牛顿插值法实验报告概论

c++实现牛顿插值法实验报告概论

数值实验用Newton商差公式进行插值姓名:陈辉学号:13349006院系:数据科学与计算机学院专业:计算机科学与技术班级:计科一班日期:2015-10-11指导老师:纪庆革目录一、实验目的 (3)二、实验题目 (3)三、实验原理与基础理论 (3)四、实验内容 (6)五、实验结果 (10)六、心得体会 (14)七、参考资料 (14)八、附录(源代码) (14)一、实验目的编写一个程序,用牛顿差商公式进行插值。

二、实验题目编写一个程序,用牛顿差商公式进行插值。

三、实验原理与基础理论牛顿插值公式为:N n(x)=f(x0)+f[x0,x1](x−x0)+⋯+f[x0,…,x n](x−x0)…(x−x n−1)其中,f[x0,x1]=f(x1)−f(x0)x1−x0f[x0,…,x k]=f[x1,…x k]−f[x0,…,x k]k0我们将从键盘读入n阶牛顿插值的n+1个节点(x i,f i),i=0,1,…,n,以此得出牛顿插值多项式。

有了节点,我们只需要求f[x0,…,x k]即可。

我们记f[x m,x m−1,…,x m−k]为t[m][k],则t[m][k]在差商表表的位置为(m, k):由f[x0,…,x k]的公式可得t[m][k] = (t[m][k-1] - t[m-1][k-1]) / (x[i] – x[i-j]),直观上来看,表中的某格的差商值可由其左边和左上边的值求得,从而牛顿插值多项式变为N(x) = t[0][0] + t[1][1](x-x[0]) + … + t[n][n](x-x[0])…(x-x[n-1])做到这一步,我们已经可以通过上面的数据计算对于给出的x,f(x)的近似值。

为了更规范地表示,下面我把N(x)变换成标准的降幂多项式N(x) = a[n]x^n + a[n-1]x^(n-1) + … + a[2]x^2 + a[1]x + a[0]。

为了便于运算,不妨先把x-x[i]中的减号换成加号(在最后令y[i]=-x[i],在令x[i]=y[i],仍可以得到原本的结果),那么有:(x+x[0])(x+x[1])…(x+x[m−1])m−1=x m+x m−1∑x[i]i=0+x m−2∑x[i[0]]x[i[1]]+⋯0≤i[0]≠i[1]≤m−1+x0∑x[i[0]]x[i[1]]…x[i[m−1]]0≤i[0]≠⋯≠i[m−1]≤m−1为了便于表示,把∑x[i[0]]x[i[1]]…x[i[k−1]]0≤i[0]≠⋯≠i[k]≤m−1记为∑x[k]m那么(x+x[0])(x+x[1])…(x+x[m−1])=x m+x m−1∑x[1]+⋯+x0∑x[m]mm只要把N(x)中的每一项展开然后x次数相同的系数相加就可以得到数组a。

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

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

牛顿和拉格朗日插值算法源代码及流程图-报告流程图找站长要//编译平台: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;//输出最终结果}。

牛顿插值公式

牛顿插值公式

system("PAUSE");
return 0;
}//-----------------------------------------------
//计算插值函数,形参为插值节点(xi,yi)
void Compute(double *xp,double *yp)
{
int i,j,k; //循环增量
//主函数
int main(void)
{
//n=1; x=0; //设置默认值
printf("\n ***欢迎使用牛顿插值计算程序计算插值!***\n\n");
Input('X'); // 为 X 赋初值
Input('N'); //为 N 赋初值
InputArry(); //输入插值节点计算结果并输出
temp *= xp[k] - xp[j] ;
}
f += yp[k]/temp;
}
s *= x - xp[i-1];
result += f * s;
}
result += yp[0]; //加上f(x0)
free(xp); //释放 xi 所占内存
double f; //f临时存放N阶差商(初值为f(x0))
double temp;//临时存放(Xk-Xj)的值
double s=1; //存放(X-Xi)的值
double result =0; //计算结果
for(i=1;i<n;i++) //按低阶到高阶计算
{ //计算除f(x0)外的所有插值

牛顿-柯特斯公式C语言的实现

牛顿-柯特斯公式C语言的实现

实验四 .牛顿-柯特斯公式C 语言的实现1.实验目的:进一步熟悉牛顿-柯特斯公式。

掌握编程语言字符处理程序的设计和调试技术。

2.实验要求:输入:已知积分上下限以及想要得到的分段数 。

输出:根据牛顿-柯特斯公式求出积分值 。

3.程序流程:(1)输入积分上下限;(2)分别输入想要得到的分段数;(3)通过调用函数,求出积分值。

原理如下:设将积分区间[a , b ]划分成 n 等分,步长h=求积节点取为xk=a+kh (k = 0,1,……,n ),由此构造插值型求积公式则其求积系数为程序流程图:,b a n -()0(1)()d !()!n k n n n k j kC t j t nk n k -≠-=--∏⎰()n 0I ()()n n k k k b a C f x ==-∑↓程序如下:#include<iostream>#include<math.h>using namespace std;//设置全局数组——牛顿科特斯公式系数表double C[6][7]={{1.0/2,1.0/2},{1.0/6,4.0/6,1.0/6},{1.0/8,3.0/8,3.0/8,1.0/8}, {7.0/90,16.0/45,2.0/15,16.0/45,7.0/90},{19.0/288,25.0/96,25.0/144,25.0/144,25.0/96,19.0/188},{41.0/840,9.0/35,9.0/280,34.0/105,9.0/280,9.0/35,41.0/840}};int main(){double a=0.0,b=0.0,Cotes=0.0;int n=0;cout<<"请分别输入积分段的下届和上届:"<<endl;cin>>a>>b;cout<<"请输入您想设置的分段数(节点数-1):"<<endl;cin>>n;//检测输入while(!(n>=1&&n<=6)){cout<<"分段数最多为6,请重新输入"<<endl;cin>>n;}//计算科特斯公式的值for(int j=0;j<=n;j++)Cotes=Cotes+C[n-1][j]*log((j*(b-a)/n)+a); //函数f(x)为f(x)=ln x 这里可以改成想要的函数Cotes=(b-a)*Cotes;cout<<"牛顿—柯特斯公式计算积分的结果是"<<Cotes<<endl;return 0;}截图如下:。

用C++编程牛顿插和拟合

用C++编程牛顿插和拟合

2.5
实验体会
× × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × × ×
N n ( x) f ( x0 ) ( x x0 ) f x0 , x1 ( x x0 )( x x1 ) f x0 , x1 , x2 ( x x0 ) ( x x1 ) ( x xn 1 ) f x0 , x1 , xn
计算 N n ( x) 的值。 3. 输出 N n ( x) 。 2.2.3 最小二乘法基本思路 已知数据对 x j , y j

j 1, 2,
, n ,求多项式
p ( x) ai x i
i 0
m
( m n)
使得 (a0 , a1 ,
m , an ) ai x ij y j 为最小,这就是一个最小二乘问题。 j 1 i 0
n
2
2.2.4 最小二乘法计算步骤 用线性函数 p( x) a bx 为例,拟合给定数据 xi , yi , i 1, 2, 算法描述: 步骤 1:输入 m 值,及 xi , yi , i 1, 2, 步骤 2:建立法方程组 A AX AY 。 步骤 3:解法方程组。 步骤 4:输出 p( x) a bx 。
2.4.1 代码 #include <iostream.h> #include <math.h> void main() { int n,i,j; double A[50][50]; double x[50],y[50]; double K=1,X=0,N=0,P; cout<<"请输入所求均差阶数:"; cin>>n; for(i=0;i<=n;i++) {

牛顿插值法的C语言编程

牛顿插值法的C语言编程

Newton 插值Newton 插值函数 Newton 插值函数是用差商作为系数,对于01,,,n x x x …这1n +个点,其一般形式为:00100120101011()[][,]()[,,]()()[,,,]()()()n n n N x f x f x x x x f x x x x x x x f x x x x x x x x x −=+−+−−++−−−…………对于011,,,n x x x −…这n 个点,100100120101012()[][,]()[,,]()()[,,,]()()()n n n N x f x f x x x x f x x x x x x x f x x x x x x x x x −−=+−+−−++−−−…………差商的定义 若已知函数()f x 在点(0,1,2,,)i x i n =⋅⋅⋅处的函数值()i f x 。

则称:00[]()f x f x =为函数()f x 在点0x 的0阶差商;100110[][][,]f x f x f x x x x −=−为函数()f x 关于01,x x 的1阶差商;120101220[,][,][,,]f x x f x x f x x x x x −=−为函数()f x 过点012,,x x x 的2阶差商;依此类推,一般地称121012101210[,,,,][,,,,][,,,,,]k k k k k k k f x x x x f x x x x f x x x x x x x −−−−⋅⋅⋅−⋅⋅⋅⋅⋅⋅=−为函数()f x 关于01,,,k x x x ⋅⋅⋅的k 阶差商。

表1 差商表i x ()i f x 1阶差商 2阶差商3阶差商4阶差商0x 1x 2x 3x 4x……0()f x 1()f x 2()f x 3()f x 4()f x ……01[,]f x x12[,]f x x 23[,]f x x 34[,]f x x……012[,,]f x x x 123[,,]f x x x 234[,,]f x x x ……0123[,,,]f x x x x 1234[,,,]f x x x x ……01234[,,,,]f x x x x x……根据Newton 插值函数编写的C 语言编程根据Newton 插值函数并对照上面的差商表,可编写出Newton 插值法的C 语言程序如下: #include<stdio.h> #include<iostream.h> #include <stdlib.h>double NewtonInterpolation(double *x,double *y,int n,double xx,double *pyy) {double *f=(double *)malloc(n*sizeof(double));int i,k;for(i=1;i<=n-1;i++)f[i]=y[i];for(k=1;k<=n-1;k++)for(i=k;i<=n-1;i++){f[i]=(y[i]-y[i-1])/(x[i]-x[i-k]);if(i==n-1)for(i=k;i<n;i++)y[i]=f[i];}*pyy=y[n-1];for(i=n-2;i>=0;i--)*pyy=(*pyy)*(xx-x[i])+y[i];free(f);return 0;}void main(){int n=5;double x[5]={1.0,2.7,3.2,4.8,5.6},y[5]={14.2,17.8,22.0,38.3,51.7},xx=3,yy; NewtonInterpolation(x,y,n,xx,&yy);printf("%lf\n",yy);}。

拉格朗日和牛顿插值法的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语言程序实现

牛顿插值函数C语言程序实现牛顿插值的关键在于差商表的计算,差商表第一行是y值,为了配合计算,在该矩阵上方配上节点x0、x1、x2……xnf[x0,x1]=[f(x1)−f(x0)]/(x1−x0)f[x0,x1]=[f(x1)−f(x0)]/(x1−x0)f[x0,x1,x2]=[f[x1,x2]−f[x0,x1]]/(x2−x0)f[x0,x1,x2]=[f[x1,x2]−f[x0,x1]]/(x2−x0)……所以只要计算矩阵内上三角值即可。

#include <stdio.h>#include <stdlib.h>int main(){float table(int n,float a1[10],float a2[10],float a3[10][10]);float newton(int n,float a4[10][10],float a5[10]);float arrX[10],arrY[10],arrL[10][10];int num,i;printf("请输入插值节点的个数(个数应小于10):");scanf("%d",&num);printf("请输入各个插值节点的值:\n");for(i=0; i<num; i++){printf("请输入X%d值:",i+1);scanf("%f",&arrX[i]);printf("请输入Y%d值:",i+1);scanf("%f",&arrY[i]);}table(num,arrX,arrY,arrL);newton(num,arrL,arrX);return 0;}float table(int n,float a1[10],float a2[10],float a3[10][10]){int i,j;for(i=0; i<n; i++){a3[0][i]=a2[i];//第一行初始化为y值}for(i=0; i<n; i++)for(j=n-1; j>i; j--)//从一行最后往前循环,到i=j为止,即上三角全部计算赋值{a3[i+1][j]=(a3[i][j]-a3[i][j-1])/(a1[j]-a1[j-1*(i+1)]);//差商表计算,最后一项arrX[j-1*(i+1)]脚标是计算步长}for(i=1; i<n; i++)//下三角未计算赋值,系统会随机分配值给下三角的每一位,故赋值0会使差商表输出更整齐for(j=0; j<i; j++){a3[i][j]=0.0;}printf("差商表为:\n");printf("----------------------------------------------------------\n");for(i=0; i<n; i++){for(j=0; j<n; j++){if(j%n==0)//num个数一行输出printf("\n");printf("%f\t",a3[i][j]);}}printf("\n");printf("----------------------------------------------------------\n");return 0;}float newton(int n,float a4[10][10],float a5[10]){int i;float x,y,t1=1.0;while(1){printf("请输入要插入节点的X值:");scanf("%f",&x);y=a4[0][0];for(i=1; i<n; i++){t1=t1*(x-a5[i-1]);y=y+a4[i][i]*t1;//差商表对角线值依次乘以(x-x0)(x-x1)……}printf("插值结果为:%f",y);printf("\n");}return 0;}运行结果如下:。

牛顿插值C语言

牛顿插值C语言
f=[0.5,0.50190188499956100034371407515916,0.50458175999920145453262692962753,0.50790348499891182000280832282220.51174095999868315023677576806651,0.51597812499850709476349453259003,0.52050895999837589915837763752862,0.52523748499828240504328585792434,0.53007775999822005008652772272554,0.5349538849981828680028595147868,0.53979999999816548855348527086896,0.5445602849981631375460567816391,0.54918895999817163683467359167056,0.55365028499818740431988299944293,0.55791855999820745394868005734203,0.56197812499822939571450757165996,0.56582335999825143565725610259505,0.56945868499827237586326396425189,0.57289855999829161446531722464131,0.57616748499830914564264970568039,0.57929999999832555962094298319248,0.58234068499834204267232638690715,0.58534415999836037711537700046025,0.58837508499838294131511966139386,0.59150815999841270968302696115631,0.59482812499845325267701924510219,0.59842975999850873680146461249234,0.60241788499858392460717891649383,0.60690735999868417469142576418001,0.61202308499881544169791651653047,0.61789999999898427631681028843103,0.62468308499919782528471394867379,0.63252735999946383138468211995707,0.64159788499979063344621717888546,0.65206976000018716634526925596981,0.66412812500066296100423623562719,0.67796816000122814439196375618094,0.69379508500189343952374520986064,0.71182416000267016546132174280214,0.73228068500357023731288225504751,0.7554000000046061662330634005451]

C语言实现牛顿插值法

C语言实现牛顿插值法

C语言实现牛顿插值法预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制#include#includeusing namespace std;void main(){float x[20];float y[20][20];int i,j,k,p,T;float a,z;cout<<"牛顿插值多项式";cout<<"请输入结点个数:";cin>>T;cout<<endl;< bdsfid="79" p=""></endl;<>cout<<"请输入各个结点的数值:"<<endl;< bdsfid="81" p=""></endl;<>for(p=0;p<t;p++)< bdsfid="83" p=""></t;p++)<>{cout<<"x["<<p<<"]=";< bdsfid="85" p=""></p<<"]=";<> cin>>x[p];cout<<"y["<<p<<"]=";< bdsfid="88" p=""></p<<"]=";<> cin>>y[p][0];}cout<<endl;< bdsfid="91" p=""></endl;<>cout<<"请输入1以继续:";while(cin>>a){cout<<"请输入所要求函数值的X值:";cin>>a;for(j=1;j<t;i++)< bdsfid="97" p=""><t;i++)<>y[i][j]=(y[i][j-1]-y[i-1][j-1])/(x[i]-x[i-j]);k=T-1;z=y[k][k];for(;k>0;k--)z=(a-x[k-1])*z+y[k-1][k-1];cout<<"则所求得的近似值是:"<<z<<endl;< bdsfid="102" p=""></z<<endl;<>cout<<"继续请输入1,退出请按alt+z:";}}。

数值分析 实验三Newton插值多项式

数值分析 实验三Newton插值多项式

数学与软件科学学院实验报告学期:至第学期年月日课程名称:___计算机数值方法_ 专业:信心与计算科学 08 级 6班实验编号:3 实验项目Newton插值多项式指导教师__张莉_姓名:田文晓学号:2008060632 实验成绩:一、实验目的及要求实验目的:掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。

实验要求:1. 给出Newton插值算法2. 用C语言实现算法二、实验内容1. 用下列插值节点数据,构造Newton插值多项式,并计算2. 用下列插值节点数据,构造一个三次Newton插值多项式,并计算f(1.2)的值。

三、实验步骤(该部分不够填写.请填写附页)步骤1:算法描述:输入n值,及(x_i,y_i),i=0,1,2,…n;记f(x_i)=y_i;For i=0,1,2…n计算差商f[x0,x1,x2,…x_k]=(f[x1,x2,…x_k]-f[x0,x1,x_k-1])/(x_k-x0) 其中 f[x_i]=f(x_i);对给定的x ,由N_n(x)=f(x0)+(x-x0)f[x0,x1]+(x-x0)(x-x1)f[x0,x1.x2]+...(x-x0)(x-x 1)(x-x2)...(x-x_n-1)f[x0,x1,...x_n]计算出N_n(x)的值输出N_n(x)的值步骤2:程序代码如下:#include<stdio.h>#define MAX_N 30typedef struct tagPOINT /*the structer of point */{double x;double y;}POINT;int main(){int n,i,j;POINT points[MAX_N+1];double tmp,newton=0;double diff[MAX_N+1];double x;clrscr();printf("\nInput n value :"); /*the number of the points inserted*/scanf("%d",&n);if(n>MAX_N){printf("The input n is larger than MAX_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:"); /*the value of 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); }}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;}四,实验结果与分析:当输入x=0.9时,利用牛顿二次插值得到结果如下:Input n value :2Now input the (x_i,y_i),i=0,...2:0 11 22 19Now input the x value:0.9newton(0.900000)=1.180000当输入x=0.9时,利用牛顿三次插值得到结果如下:Input n value :3Now input the (x_i,y_i),i=0,...3:-2 170 12 191 2Now input the x value:0.9newton(0.900000)=1.303750输入当x=1.2时,得到结果如下:Input n value :3Now input the (x_i,y_i),i=0,...3:-1.00 3.002.00 5.003.00 7.004.005.00Now input the x value:1.2newton(1.200000)=2.401600注:实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。

拉格朗日插值和牛顿插值多项式的C程序算法毕业论文

拉格朗日插值和牛顿插值多项式的C程序算法毕业论文

本科生毕业论文题目: 拉格朗日插值和牛顿插值多项式的C程序算法原创性声明本人郑重声明: 所提交的学位论文是本人在导师指导下, 独立进行研究取得的成果. 除文中已经注明引用的内容外, 论文中不含其他人已经发表或撰写过的研究成果, 也不包含为获得**大学或其他教育机构的学位证书而使用过的材料. 对本文的研究做出重要贡献的个人和集体, 均已在文中以明确方式标明. 本人承担本声明的相应责任.学位论文作者签名: 日期指导教师签名: 日期目录拉格朗日插值多项式的C程序算法 (1)1引言 (1)1.1插值问题的提出 (1)1.2插值法 (2)1.3插值法思想 (2)2拉格朗日插值法 (3)2.1拉格朗日插值法的由来 (3)2.2n次插值基函数 (4)2.3拉格朗日插值多项式 (4)3牛顿插值法 (5)3.1均差: (5)3.2牛顿插值多项式: (6)4C程序设计 (7)4.1算法设计: (7)4.2程序源码编写 (8)5程序检测 (12)5.1对拉格朗日插值的检测 (12)5.2对牛顿插值的检测 (13)总结 (15)参考文献 (16)致谢 (17)摘要本论文着重研究了用C语言编写程序计算拉格朗日插值和牛顿插值的方法。

在前人已有的研究成果的基础上,首先介绍了拉格朗日插值和牛顿插值的思想和方法,通过添加可以循环计算功能和输入非法数值时的纠错功能,改进了已有文献的方法,对其进行了推广,使之更加的合理和完美,并且通过实际的例子进行了具体的验证。

最后,总结了一下本论文的主要研究成果和应用前景。

关键词:拉格朗日插值,牛顿插值,C算法,精确解AbstractThis article discuss the method to calculate Lagrange interpolation and Newton interpolation with C program. Base on the results of predecessors' research, firstly, this article introduces the thoughts and methods of Lagrange interpolation and Newton interpolation. Improving the old method by adding functions which can repeatedly computing interpolation and correct illegal data. Then spreading it and making it more reasonable and perfect, checking it with some examples. Finally, summing up the main results of this article and application prospect.Key words:Lagrange interpolation; Newton interpolation ; C program;拉格朗日插值多项式的C 程序算法1引言插值法是一种古老的数学研究方法,他的产生来自与社会的生产实践活动。

牛顿插值法的C语言实现

牛顿插值法的C语言实现

牛顿插值法的C 语言实现摘要:拉格朗日插值法具有明显的对称性,公式中的每一项与所有的插值节点有关。

因此,如果需要增加一个插值节点,则拉格朗日插值公式中的每一项都要改变,在有的应用中就显得不太方便。

因此,可以利用另外一种差值方法来弥补这种缺陷,就牛顿插值法。

本文通过对牛顿插值法的数学分析,主要给出其C 语言实现方法。

关键字:差商 差分 C 语言算法1差商及其牛顿插值公式1.1 差商及其主要性质定义 若已知函数()f x 在点(0,1,2,,)i x i n =⋅⋅⋅处的函数值()i f x 。

则称:00[]()f x f x =为函数()f x 在点0x 的0阶差商; 010101[][][,]f x f x f x x x x -=-为函数()f x 过点01,x x 的1阶差商;010201212[,][,][,,]f x x f x x f x x x x x -=-为函数()f x 过点012,,x x x 的2阶差商;以此类推,一般地称012101201211[,,,,][,,,,][,,,,,]k k k k k k k kf x x x x f x x x x f x x x x x x x -----⋅⋅⋅-⋅⋅⋅⋅⋅⋅=-为函数()f x 过点01,,x x ,⋅⋅⋅k x 的k 阶差商。

性质1 阶差商表示为函数值01(),(),,()k f x f x f x ⋅⋅⋅的线性组合。

即0120011()[,,,,]=()()()()kj k j j j j j j j k f x f x x x x x x x x x x x x =-+⋅⋅⋅-⋅⋅⋅--⋅⋅⋅-∑0()()kj kj ji i i jf x xx ==≠=-∑∏性质2 若函数()f x 在包含节点的区间[,]a b 上存在k 阶导数,则k 阶差商与导数的关系为()01()[,,,],[,]!k k f f x x x a b k ξξ⋅⋅⋅=∈ 1.2 牛顿插值公式通过1n +个互异点上的次数不超过n 的插值多项式()n P x 可以表示如下形式:0010101201()[][,]()[,,]()()n P x f x f x x x x f x x x x x x x =+-+--+⋅⋅⋅0101[,,,]()()n n f x x x x x x x -+⋅⋅⋅-⋅⋅⋅-这种形式的插值多项式称为牛顿插值多项式,一般记为0010101201()[][,]()[,,]()()n N x f x f x x x x f x x x x x x x =+-+--+⋅⋅⋅0101[,,,]()()n n f x x x x x x x -+⋅⋅⋅-⋅⋅⋅-由牛顿插值多项式可以看出,当增加一个插值点时,当前已有的各项不变,只需要在后面增加一项即可。

差分形式的牛顿插值法(c++)

差分形式的牛顿插值法(c++)

差分形式的⽜顿插值法(c++)本程序对cosx函数进⾏插值,取步长为0.1,因此x的值为0.00,0.10,0.20,0.30,对应的y值为cos(0.00),cos(0.10),cos(0.20),cos(0.30),其实本程序Horner⽅法(⼜称秦九韶算法)效率更⾼,计算更加准确#include <iostream>#include <cmath>using namespace std;int factorial(int n); //声明阶乘函数double average_deviation(double* function_value,double& h,int end); //声明均差函数int main(){double h=0.10; //计算的步长double x[4]={0.00,0.10,0.20,0.30}; //⽤来存储已知x的值double y[4]={cos(0.00),cos(0.10),cos(0.20),cos(0.30)}; //⽤来存储已知y的值double result=0; //⽤来保存最后的插值结果double input_x; //插值的x值double polynomial; //保存多项式的值cout<<"通过插值得到的函数为:"<<endl;for (int i=0;i<4;i++){cout<<average_deviation(y,h,i)/(factorial(i))/pow(h,i);for (int j=0;j<i;j++)cout<<"*"<<"("<<"x-"<<x[j]<<")";if (i<3&&((average_deviation(y,h,i+1)/(factorial(i+1))/pow(h,i+1))>0))cout<<"+";}cout<<endl;cout<<"请输⼊插值的x值:";cin>>input_x;for (int i=0;i<4;i++){polynomial=1;for (int j=0;j<i;j++){polynomial*=(input_x-x[j]);}result+=(average_deviation(y,h,i)/(factorial(i))/pow(h,i)*polynomial);}cout<<"插值得到的函数值为:"<<result<<endl;cout<<"函数的真实值为:"<<cos(input_x)<<endl;cout<<"误差为:"<<100*((result-cos(input_x))/cos(input_x))<<"%"<<endl; return 0;}int factorial(int n){if (n<0){cout<<"请输⼊正整数值"<<endl;exit(0);}else if (n==0)return 1;elsereturn n*factorial(n-1);}double average_deviation(double* function_value,double& h,int end){double* function_value_f; //function_value_f⽤来保存0到k-1的k阶差分 double* function_value_b; //function_value_f⽤来保存1到k的k阶差分 double value_f;double value_b;if (0==end){return function_value[end];}else{function_value_f=new double[end];function_value_b=new double[end];for (int i=1;i<=end;i++)function_value_f[i-1]=function_value[i];for (int i=0;i<=end-1;i++)function_value_b[i]=function_value[i];value_f = average_deviation(function_value_f,h,end - 1);value_b = average_deviation(function_value_b,h, end - 1);delete[] function_value_f; delete[] function_value_b;return value_f-value_b; }}。

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