牛顿插值法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;//输出最终结果}《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年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。
C语言编程 牛顿迭代法求方程1
牛顿迭代公式设r 是f(x) = 0的根,选取x0作为r 初始近似值,过点(x0,f(x0))的切线L ,L 的方程为y = f(x0)+f'(x0)(x-x0),求出L 与x 轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r 的一次近似值。
过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x 轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r 的二次近似值。
重复以上过程,得r 的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r 的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0似方法。
把f(x)在x0 f(x) = f(x0)+(x -x0)f'(x0)+(x -x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x -x0)-f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。
牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x 0作为第一个近似根,由x 0求出f(x 0),过(x 0,f(x 0))点做f(x)的切线,交x 轴于x 1,把它作为第二次近似根,再由x 1求出f(x 1),再过(x 1,f(x 1))点做f(x)的切线,交x 轴于x 2,再求出f(x 2),再作切线……如此继续下去,直到足够接近真正的x *为止。
)()()()(0'0010100'x f x f x x x x x f x f -=-=因此, 就是牛顿迭代公式。
例1 用牛顿迭代法求方程2x 3-4x 2+3x-6=0在1.5附近的根。
Newton法、一般迭代法Steffensen法、弦截法C语言代码
一、Newton法:#include<math.h>#include<stdio.h>double f(double x){return (3*x*x-exp(x));}double f1(double x){return (6*x-exp(x));}void main(){double x1=1,x;do{x=x1;x1=x-f(x)/f1(x);printf("x=%.9lf\n",x1);}while(fabs(x1-x)>0.000005);}说明:f 为原函数,f1为f的导函数,x1为初始值,通过"x=%.9lf“控制输入输出格式二、一般迭代法#include <stdio.h>#include <math.h>int main(){double x=1,x1;while(1){x1=pow(3*x+1,0.2);printf("x=%.6lf\n",x1);if(fabs(x1-x)<0.000005 )break;x=x1;}return 0;}说明:x1为初始值,x1=pow(3*x+1,0.2);为迭代格式,0.000005为允许误差,通过"x=%.6lf“控制输入输出格式三、Steffensen法:#include"stdio.h"#include"math.h"#define phi(x) pow(3*(x)+1,0.2);void main(){double x,x0,del,y,z;printf("x0="); scanf("%lf",&x0);printf("\ndel=:"); scanf("%lf",&del);while(1){y=phi(x0); z=phi(y);x=x0-(y-x0)*(y-x0)/(z-2*y+x0);printf("\n%.6lf",x);if(fabs(x-x0)<del) break;x0=x;}}说明:x0为初始值,pow(3*(x)+1,0.2);为φ(x)的格式,del为允许误差,通过"x=%.6lf“控制输入输出格式四、弦截法:#include<math.h>#include<stdio.h>double f(double x){ //计算f(x)的值return pow(2,x)+pow(3,x)-pow(4,x);}double point(double x1,double x2){//计算与x轴交点的x值printf("x=%.5f\n",(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)));return (x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));}int main(){//输入两个数x1,x2double x1,x2,x;do{printf("输入两个数x1,x2:");scanf("%lf%lf",&x1,&x2);}while (f(x1)*f(x2)>= 0); // 当输入两个数大于0为真时,继续重新输入//关键循环步骤:do{x=point(x1,x2);//得到交点的值if(f(x)*f(x1)>0)x1=x;//新的x1elsex2=x;}while (fabs(f(x)) > 0.000005); }。
牛顿迭代法求根c语言
牛顿迭代法求根c语言牛顿迭代法是一种常用的数值计算方法,其可以用来求解非线性方程的根。
本文将介绍牛顿迭代法的基本原理和实现方法,并提供一些使用C语言实现牛顿迭代法求根的示例代码。
一、牛顿迭代法的原理在介绍牛顿迭代法的原理之前,我们先来看一个简单的例子。
假设我们要求解方程f(x) = 0的近似根,其中f(x)是一个可导函数。
我们可以通过利用切线来逼近方程f(x) = 0的根。
具体地,我们可以选择一个起始点x0,然后在x0处取得f(x0)的切线,将其延长到x轴上的交点x1,那么x1就是f(x) = 0的一个近似根。
可以通过数学方法得到x1的表达式:x1 = x0 - f(x0) / f'(x0)其中f'(x0)表示函数f(x)在x0处的导数。
换句话说,我们使用f(x)在x0处的切线来近似替代f(x)的图形,直到得到f(x) = 0的一个近似根为止。
这就是牛顿迭代法的基本思想。
牛顿迭代法的具体步骤如下:1. 选择一个起始点x0;2. 使用f(x)在x0处的切线来近似替代f(x)的图形;3. 在切线上取得x轴的交点x1; 4. 将x1作为新的起始点,重复步骤2和3,直到得到近似根。
二、牛顿迭代法的实现牛顿迭代法的实现过程比较简单,但需要注意一些细节。
具体实现可以分为以下几个步骤:1. 定义一个函数f(x),表示待求解的方程;2. 定义一个函数f_prime(x),表示函数f(x)在x处的导数;3. 定义一个起始点x0;4. 通过牛顿迭代公式计算出x1; 5. 将x1作为新的起始点,重复步骤4,直到满足精度要求为止。
下面,我们提供一段使用C语言实现牛顿迭代法求根的代码示例:```c #include<stdio.h> #include<math.h>#define EPSILON 0.0001double f(double x) { // 表示待求解的非线性方程 return x*x*x - x*x + 2; }double f_prime(double x) { // 表示f(x)在x 处的导数 return 3*x*x - 2*x; }double newton_raphson(double x) { // 牛顿迭代法求根 double x0 = x;while (1) { double x1 = x0 - f(x0) / f_prime(x0);if (fabs(x1 - x0) < EPSILON) return x1;x0 = x1; } }int main() { double x = 0;printf("The root is: %lf\n",newton_raphson(x));return 0; } ```代码中,定义了非线性方程f(x)和它在x处的导数f_prime(x),然后利用牛顿迭代法计算出方程的近似根。
拉格朗日和牛顿插值法的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)并存表//}}填表。
10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格
10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格~~关键字: 拉格朗日,牛顿插值,高斯,龙贝格1.拉格朗日插值多项式,用于离散数据的拟合C/C++ code#include <stdio.h>#include <conio.h>#include <alloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/{ int i,j;float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/ a=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++){ a[i]=y[i];for(j=0;j<=n-1;j++)if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;}if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;}for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");printf("Input xx:");scanf("%f",&xx);yy=lagrange(x,y,xx,n);printf("x=%f,y=%f\n",xx,yy);getch();}2.牛顿插值多项式,用于离散数据的拟合C/C++ code#include <stdio.h>#include <conio.h>#include <alloc.h>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,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;}if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;}for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");difference(x,(float *)y,n);printf("Input xx:");scanf("%f",&xx);yy=y[20];for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i]; printf("NewtonInter(%f)=%f",xx,yy);getch();}3.高斯列主元消去法,求解奇次线性方程组C/C++ code#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1); for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;}}for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;}}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];}for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return 0;}#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER];int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter.");printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:");for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]); }for(k=1;k<=n-1;k++){ark=max(k);if(ark==0){printf("\n\nIt's wrong!");message();}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k){int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k){int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message(){printf("\n\n Go on Enter ,Exit press Esc!");switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\nInput error!");message();} }}4.龙贝格求积公式,求解定积分C/C++ code#include<stdio.h>#include<math.h>#define f(x) (sin(x)/x)#define N 20#define MAX 20#define a 2#define b 4#define e 0.00001float LBG(float p,float q,int n){ int i;float sum=0,h=(q-p)/n;for (i=1;i<n;i++)sum+=f(p+i*h);sum+=(f(p)+f(q))/2;return(h*sum);}void main(){ int i;int n=N,m=0;float T[MAX+1][2];T[0][1]=LBG(a,b,n);n*=2;for(m=1;m<MAX;m++){ for(i=0;i<m;i++)T[i][0]=T[i][1];T[0][1]=LBG(a,b,n);n*=2;for(i=1;i<=m;i++)T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e)){ printf("Answer=%f\n",T[m][1]); getch();return ;}}}C/C++ code5.牛顿迭代公式,求方程的近似解C/C++ code#include<stdio.h>#include<math.h>#include<conio.h>#define N 100#define PS 1e-5#define TA 1e-5float Newton(float (*f)(float),float(*f1)(float),float x0 ) { float x1,d=0;int k=0;do{ x1= x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<PS)){ printf("\nFailed!");getch();exit();}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\n",k,x0);}while((fabs(d))>PS&&fabs(f(x1))>TA) ;return x1;}float f(float x){ return x*x*x+x*x-3*x-3; }float f1(float x){ return 3.0*x*x+2*x-3; }void main(){ float f(float);float f1(float);float x0,y0;printf("Input x0: ");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("\nThe root is x=%f\n",y0);getch();}6. 牛顿-科特斯求积公式,求定积分C/C++ code#include<stdio.h>#include<math.h>int NC(a,h,n,r,f)float (*a)[];float h;int n,f;float *r;{ int nn,i;float ds;if(n>1000||n<2){ if (f)printf("\n Faild! Check if 1<n<1000!\n",n);return(-1);}if(n==2){ *r=0.5*((*a)[0]+(*a)[1])*(h);return(0);}if (n-4==0){ *r=0;*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]); return(0);}if(n/2-(n-1)/2<=0)nn=n;elsenn=n-3;ds=(*a)[0]-(*a)[nn-1];for(i=2;i<=nn;i=i+2)ds=ds+4*(*a)[i-1]+2*(*a)[i];*r=ds*(h)/3;if(n>nn)*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]); return(0);}main(){float h,r;int n,ntf,f;int i;float a[16];printf("Input the x[i](16):\n");for(i=0;i<=15;i++)scanf("%d",&a[i]);h=0.2;f=0;ntf=NC(a,h,n,&r,f);if(ntf==0)printf("\nR=%f\n",r);elseprintf("\n Wrong!Return code=%d\n",ntf);getch();}7.雅克比迭代,求解方程近似解C/C++ code#include <stdio.h>#include <math.h>#define N 20#define MAX 100#define e 0.00001int main(){ int n;int i,j,k;float t;float a[N][N],b[N][N],c[N],g[N],x[N],h[N];printf("\nInput dim of n:"); scanf("%d",&n);if(n>N){ printf("Faild! Check if 0<n<N!\n"); getch(); return 1; } if(n<=0){printf("Faild! Check if 0<n<N!\n"); getch(); return 1;} printf("Input a[i,j],i,j=0…%d:\n",n-1);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("Input c[i],i=0…%d:\n",n-1);for(i=0;i<n;i++)scanf("%f",&c[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){ b[i][j]=-a[i][j]/a[i][i]; g[i]=c[i]/a[i][i]; } for(i=0;i<MAX;i++){ for(j=0;j<n;j++)h[j]=g[j];{ for(k=0;k<n;k++){ if(j==k) continue; h[j]+=b[j][k]*x[k]; } }t=0;for(j=0;j<n;j++)if(t<fabs(h[j]-x[j])) t=fabs(h[j]-x[j]);for(j=0;j<n;j++)x[j]=h[j];if(t<e){ printf("x_i=\n");for(i=0;i<n;i++)printf("x[%d]=%f\n",i,x[i]);getch();return 0;}printf("after %d repeat , return\n",MAX);getch();return 1;}getch();}8.秦九昭算法C/C++ code#include <math.h>float qin(float a[],int n,float x){ float r=0;int i;for(i=n;i>=0;i--)r=r*x+a[i];return r;}main(){ float a[50],x,r=0;int n,i;do{ printf("Input frequency:");scanf("%d",&n);}while(n<1);printf("Input value:");for(i=0;i<=n;i++)scanf("%f",&a[i]);printf("Input frequency:");scanf("%f",&x);r=qin(a,n,x);printf("Answer:%f",r);getch();}9.幂法C/C++ code#include<stdio.h>#include<math.h>#define N 100#define e 0.00001#define n 3float x[n]={0,0,1};float a[n][n]={{2,3,2},{10,3,4},{3,6,1}};float y[n];main(){ int i,j,k;float xm,oxm;oxm=0;for(k=0;k<N;k++){ for(j=0;j<n;j++){ y[j]=0;for(i=0;i<n;i++)y[j]+=a[j][i]*x[i];}xm=0;for(j=0;j<n;j++)if(fabs(y[j])>xm) xm=fabs(y[j]);for(j=0;j<n;j++)y[j]/=xm;for(j=0;j<n;j++)x[j]=y[j];if(fabs(xm-oxm)<e){ printf("max:%f\n\n",xm);printf("v[i]:\n");for(k=0;k<n;k++) printf("%f\n",y[k]);break;}oxm=xm;}getch();}10.高斯塞德尔C/C++ code#include<math.h>#include<stdio.h>#define N 20#define M 99float a[N][N];float b[N];int main(){ int i,j,k,n;float sum,no,d,s,x[N];printf("\nInput dim of n:");scanf("%d",&n);if(n>N){ printf("Faild! Check if 0<n<N!\n "); getch();return 1;}if(n<=0){ printf("Faild! Check if 0<n<N!\n ");getch();return 1;} printf("Input a[i,j],i,j=0…%d:\n",n-1);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("Input b[i],i=0…%d:\n",n-1);for(i=0;i<n;i++) scanf("%f",&b[i]);for(i=0;i<n;i++) x[i]=0;k=0;printf("\nk=%dx=",k);for(i=0;i<n;i++) printf("%12.8f",x[i]);do{ k++;if(k>M){printf("\nError!\n”);getch();}break;}no=0.0;for(i=0;i<n;i++){ s=x[i];sum=0.0;for(j=0;j<n;j++)if (j!=i) sum=sum+a[i][j]*x[j];x[i]=(b[i]-sum)/a[i][i];d=fabs(x[i]-s);if (no<d) no=d;}printf("\nk=%2dx=",k);for(i=0;i<n;i++) printf("%f",x[i]); }while (no>=0.1e-6);if(no<0.1e-6){ printf("\n\n answer=\n");printf("\nk=%d",k);for (i=0;i<n;i++)printf("\n x[%d]=%12.8f",i,x[i]);}getch();}。
用c语言实现牛顿拉夫逊迭代法
用c语言实现牛顿拉夫逊迭代法如何用C语言实现牛顿拉弗森迭代法[引言]牛顿拉弗森迭代法(Newton-Raphson method),又称为牛顿迭代法,是一种求解方程根的数值方法。
它是由17世纪英国物理学家伊萨克·牛顿和法国数学家约瑟夫·拉弗森独立提出的。
牛顿拉弗森迭代法通过不断逼近方程根,可以实现高精度的方程求解。
[原理]牛顿拉弗森迭代法的原理很简单,基于方程根附近的切线逼近曲线,通过不断迭代的方式逼近方程的根。
设方程的根为x0,代入方程得到曲线上的一个点(x0, f(x0))。
假设方程在x0附近可导,那么我们可以得到曲线在点(x0, f(x0))处的切线方程,即通过(x0, f(x0))和斜率f'(x0)得到切线的方程。
切线与x轴的交点即为新的近似根x1。
依此类推,我们可以采用迭代的方式不断逼近更精确的解。
具体迭代公式为:x_(n+1) = x_n - f(x_n) / f'(x_n)其中,x_n是第n次迭代得到的近似解,f(x_n)是方程在x_n处的函数值,f'(x_n)是方程在x_n处的导数值。
通过不断迭代,当两次迭代解的差值小于预设的误差范围时,我们可以认为得到了方程的近似根。
[步骤]接下来,让我们一步一步的使用C语言实现牛顿拉弗森迭代法。
步骤1:导入所需的头文件和函数声明c#include <stdio.h>#include <math.h>double f(double x); 定义方程的函数表达式double f_derivative(double x); 定义方程的导数函数表达式步骤2:实现方程和导数函数cdouble f(double x) {实现方程的函数表达式return x * x - 9;}double f_derivative(double x) {实现方程的导数函数表达式return 2 * x;}步骤3:实现牛顿拉弗森迭代法cdouble newton_raphson_method(double x0, double epsilon) { double x = x0;double difference = epsilon + 1; 初始化差值,使其大于预设的误差范围while (difference > epsilon) {double f_x = f(x);double f_derivative_x = f_derivative(x);x = x - f_x / f_derivative_x;difference = fabs(f(x));}return x;}步骤4:调用牛顿拉弗森迭代法求解方程cint main() {double x0 = 4; 初始值double epsilon = 0.0001; 误差范围double root = newton_raphson_method(x0, epsilon);printf("方程的近似根为:%lf\n", root);return 0;}[总结]通过以上步骤,我们可以使用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 语言算法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 -+⋅⋅⋅-⋅⋅⋅-由牛顿插值多项式可以看出,当增加一个插值点时,当前已有的各项不变,只需要在后面增加一项即可。
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;}。
拉格朗日和牛顿插值代码
1.拉格朗日插值多项式,用于离散数据的拟合C/C++ code#include <stdio.h> #include <conio.h> #include <alloc.h> floatlagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/ { int i,j; float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/ a=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++) { a[i]=y[i]; for(j=0;j<=n-1;j++) if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i]; } free(a); return yy; }main() { int i,n; float x[20],y[20],xx,yy; printf("Input n:");scanf("%d",&n); if(n>=20) {printf("Error!The value of n must in(0,20)."); getch();return1;} if(n<=0) {printf("Error! Thevalue of n must in (0,20)."); getch(); return1;}for(i=0;i<=n-1;i++) { printf("x[%d]:",i); scanf("%f",&x[i]); }printf("/n"); for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);} printf("/n");printf("Input xx:"); scanf("%f",&xx); yy=lagrange(x,y,xx,n);printf("x=%f,y=%f/n",xx,yy); getch(); }2.牛顿插值多项式,用于离散数据的拟合C/C++ code#include <stdio.h> #include <conio.h> #include <alloc.h> voiddifference(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,n; float x[20],y[20],xx,yy;printf("Input n:"); scanf("%d",&n); if(n>=20) {printf("Error!The value of n must in (0,20)."); getch(); return1;} if(n<=0){printf("Error! The value of n must in (0,20).");getch(); return1;} for(i=0;i<=n-1;i++) { printf("x[%d]:",i);scanf("%f",&x[i]); } printf("/n"); for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);} printf("/n");difference(x,(float *)y,n); printf("Input xx:");scanf("%f",&xx); yy=y[20]; for(i=n-1;i>=0;i--)yy=yy*(xx-x[i])+y[i]; printf("NewtonInter(%f)=%f",xx,yy); getch(); }。
Newton插值和三次样条插值的程序代码
(){}21()(11),5,10,20:12521()1,(0,1,2,,)()2,(0,1,2,,)()()235,20:1100(),i i i i n n k k k Newton f x x n x f x x i i n f x n x y i n Newton N x S x n x k y f x N =-≤≤=+=-+====-+=插值多项式和三次样条插值多项式。
已知对作、计算函数在点处的值;、求插值数据点的插值多项式和三次样条插值多项式;、对计算和相应的函数值()() (1,2,,99)4:()max()()max ()n k n k n k n k n k n k k k x S x k E N y N x E S y S x ==-=-和;、计算,;解释你所得到的结果。
Newton 插值的程序代码:%求Newton 插值多项式function new=newton(m,y)n=length(m);b=1;new=[zeros(1,n-1),y(1)];for i=2:n y(i:n)=(y(i:n)-y(i-1:n-1))./(m(i:n)-m(1:n-i+1)); %求差商b=conv(b,[1,-m(i-1)]);a=[zeros(1,n-length(b)),b];new=new+y(i)*a;end三次样条插值的程序代码:%求三次样条插值多项式function s=myspline(m,y)syms x;n=length(m);M=y;M(2:n)=(M(2:n)-M(1:n-1))./(m(2:n)-m(1:n-1));M(3:n)=(M(3:n)-M(2:n-1))./(m(3:n)-m(1:n-2));M=[0,M(3:n),0];h=m(2:n)-m(1:n-1);c=h(2:n-1)./(h(2:n-1)+h(1:n-2));a=1-c;b=2+zeros(1,n);M=6*M;c=[0,c];a=[a,0];M=chase(a,b,c,M); %用追赶法解方程组for i=1:n-1 %分区间计算插值多项式s(i)=M(i)*(m(i+1)-x)^3+M(i+1)*(x-m(i))^3+(6*y(i)-M(i)*h(i)^2)*(m(i+1)-x)+(6*y(i+1)-M(i+1)*h(i)^2 )*(x-m(i));s(i)=s(i)/(6*h(i));end主程序为:clear;clc;n=5; %指定n的值syms x %符号数xf=1./(1+25*x^2); %定义函数f(x)i=0:n;m=-1+2*i/n;y=subs(f,m); %计算函数值f(x)disp(['When n=',num2str(n),',the values of f(x) at the points of x(i) are:']);disp(y);%求Newton插值多项式new=newton(m,y);new=round(10000*new)/10000;nout=poly2sym(new);nout=vpa(nout,4); %整理多项式并输出disp(['When n=',num2str(n),',N(x)=']);disp(nout);%求三次样条插值多项式s=myspline(m,y);for i=1:n %分区间计算插值多项式a=sym2poly(s(i));b=poly2sym(a);b=vpa(b,4); %整理多项式并输出disp(['In the range of [',num2str(m(i)),',',num2str(m(i+1)),'],S(x)=']);disp(b);endk=0:100;xk=-1+0.02*k; %计算xk的值ll1=subs(f,xk);ll2=polyval(new,xk); %计算f(xk),N(xk)for i=1:length(xk)r=find(m(2:n+1)>=xk(i),1,'first');ll3(i)=subs(s(r),xk(i)); %计算S(xk)enden=max(abs(ll1-ll2));es=max(abs(ll1-ll3)); %计算E(Nn),E(Sn),并输出disp(['E(Nn)=',num2str(en)]);disp(['E(Sn)=',num2str(es)]);plot(xk,ll1,xk,ll2,'r',xk,ll3,'g');axis([-1,1,-0.1,1.1]);title('Interpolation');legend('Original function','Newton Interpolation','Spline')grid; %将原函数,Newton插值函数,三次样条插值函数画成图形。
牛顿差值函数程序代码
牛顿差值函数程序代码
牛顿差值函数是数值分析中常用的一种方法,用于在给定一组数据点的情况下,拟合出一个多项式函数,从而实现数据的插值和近似,下面是牛顿差值函数的程序代码:
```python
def newton_interpolation(x,y):
n = len(x)
b = []
for i in range(n):
b.append([y[i]])
for j in range(1,n):
for i in range(n-j):
b[i].append((b[i+1][j-1]-b[i][j-1])/(x[i+j]-x[i]))
a = [b[0][i] for i in range(n)]
def f(t):
res = a[-1]
for i in range(n-2,-1,-1):
res = a[i] + (t-x[i])*res
return res
return f
```
其中,x和y分别表示数据点的横纵坐标,函数返回一个插值函
数f,可以将任意x值代入f中,得到对应的y值。
该代码实现了牛顿差值的主要逻辑,采用了递推的思路,先计算出差商表b,再根据b计算出多项式系数a,最后构造出插值函数f。
在实际使用中,只需要调用newton_interpolation函数,传入数据点的坐标,即可得到插值函数。
newton 算法 数值计算方法
数学与软件科学学院实验报告学期:至第学期年月日课程名称:___计算机数值方法___ 专业:数学与应用数学级班实验编号:3 实验项目Newton插值多项式指导教师__张莉_姓名:林海学号: 2009060619 实验成绩:一、实验目的及要求实验目的:掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。
实验要求:1. 给出Newton插值算法2. 用C语言实现算法二、实验内容1. 用下列插值节点数据,构造Newton插值多项式,并计算2. 用下列插值节点数据,构造一个三次Newton插值多项式,并计算f(1.2)的值。
三、实验步骤(该部分不够填写.请填写附页)程序代码如下:#include"stdio.h"#include"math.h"#define N 20void main(){/*------------step 1-------------------*/int i,j,n,k;double Fx,x,X[N],Y[N],G[N],temp1,temp2;clrscr();/*--------------input-------------------*/printf("Please input how many interpolation points(n)....::"); scanf("%d",&n);printf("Please input the X point::");scanf("%lf",&x);printf("Please input the interpolation points::\n");for(i=0;i<n;i++){printf("X[%d]=",i);scanf("%lf",&X[i]);printf("Y[%d]=",i);scanf("%lf",&Y[i]);printf("\n");}/*----------------G[N]-------------------------*/for(i=1;i<n;i++){G[i]=0;for(j=0;j<=i;j++){temp1=1;for(k=0;k<=i;k++){if(j!=k){temp1=temp1/(X[j]-X[k]);}}G[i]=G[i]+temp1*Y[j];}}/*------------------newton----------------*/Fx=Y[0];for(i=1;i<n;i++){printf("\nG[%d]=%lf",i,G[i]);temp2=1;for(j=0;j<i;j++){temp2=temp2*(x-X[j]);}Fx=Fx+G[i]*temp2;}printf("\n newton interpolation.. Fx=%lf",Fx);getch();为插值节点数;输入相关函数值。
牛顿插值法的c++程序
简介:本程序用牛顿插值法对函数表,X值选取为1.5测试本程序。
源程序:#include <iostream.h>#include <math.h>void main(){int I;char L;do{double M[100][100];double x[100],y[100];double X=1,xx=0,w=1,N=0,P,R=1;int n;cout<<"请输入所求均差阶数:";cin>>n;for(int i=0;i<=n;i++){cout<<"请输入x"<<i<<"的值:"<<endl; cin>>x[i];cout<<"请输入y"<<i<<"的值:"<<endl; cin>>y[i];M[i][0]=x[i];M[i][1]=y[i];}for( int j=2;j<=n+1;j++){for( i=1;i<=n;i++){M[i][j]=(M[i][j-1]-M[i-1][j-1])/(M[i][0]-M[i-j+1][0]);}}for(i=1;i<=n;i++){cout<<"其"<<i<<"阶均差为:"<<M[i][i+1]<<endl;}cout<<"请输入x的值:x=";cin>>xx;for(i=0;i<n;i++){X*=xx-x[i];N+=M[i+1][i+2]*X;P=M[0][1]+N;}cout<<"其函数值:y="<<P<<endl;cout<<endl<<"如还想算其它插值请按'y'否则按'n'"<<endl; cin>>L;}while(L=='y');}测试结果:。