克劳德迭代法 #include"stdio.h" #include"math.h" int main() { float a[3][4]={{2,3,4,6}, {3,5,2,5}, {4,3,30,32}}; float u[3][4]; float l[3][4]; u[0][0]=u[1][1]=u[2][2]=1; l[0][0]=a[0][0]/u[0][0]; u[0][1]=a[0][1]/l[0][0]; u[0][2]=a[0][2]/l[0][0]; u[0][3]=a[0][3]/l[0][0]; l[1][0]=a[1][0]/u[0][0]; l[1][1]=a[1][1]-l[1][0]*u[0][1]; u[1][2]=(a[1][2]-l[1][0]*u[0][2])/l[1][1]; u[1][3]=(a[1][3]-l[1][0]*u[0][3])/l[1][1]; l[2][0]=a[2][0]/u[0][0]; l[2][1]=a[2][1]-l[2][0]*u[0][1] l[2][2]=a[2][2]-l[2][0]*
数值分析实验一——拉格朗日插值算法报告
拉格朗日插值算法的实现 实验报告 姓名:** 年级:****专业:计算机科学与技术科目:数值分析题目:拉格朗日插值算法的实现 实验时间: 2014年5月27日实验成绩: 实验教师: 一、实验名称:拉格朗日插值算法的实现 二、实验目的: a. 验证拉格朗日插值算法对于不同函数的插值 b. 验证随着插值结点的增多插值曲线的变化情况。 三、实验内容: 拉格朗日插值基函数的一般形式: 也即是: 所以可以得出拉格朗日插值公式的一般形式: 其中, n=1时,称为线性插值,P1(x) = y0*l0(x) + y1*l1(x) n=2时,称为二次插值或抛物插值,精度相对高些,P2(x) = y0*l0(x) + y1*l1(x) + y2*l2(x) 四、程序关键语句描写 double Lagrange(int n,double X[],double Y[],double x) { double result=0; for (int i=0;ifor(int j=0;j #include using namespace std; int main() { double Lagrange(int n,double X[],double Y[],double x); //插值函数double x;//要求插值的x的值 double result;//插值的结果 char a='n'; double X[20],Y[20]; do { cout<<"请输入插值次数n的值:"<>n; cout<<"请输入插值点对应的值及函数值(xi,yi):"<>X[k]>>Y[k]; } cout<<"请输入要求值x的值:"<>x; result=Lagrange(n,X,Y,x); cout<<"由拉格朗日插值法得出结果:"<>a; }while(a=='yes'); return 0; }
数值计算方法编程作业(C语言版)
1:第二章 (1)二分法求解非线性方程: #include #include #define f(x) ((x*x-1)*x-1) void main() { float a,b,x,eps; int k=0; printf("intput eps\n");/* 容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f, %f",&a ,&b); if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do { x=(a+b)/2; k++; if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x;
else if(f(a)*f(x)>0) /* 否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2; /* 取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f, k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721, k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x) /* 定义函数f(x) */ { return((-3*x+4)*x-5)*x+6; }
拉格朗日插值法1
拉格朗日抛物线插值法 1、定义若多项式l j (j=0,1,2...n )在n+1个节点x 0end end S=t*y(k)+s; end; yi=s; 3、例题 1)计算115 解: L 2(x)=0201021))(())((y x x x x x x x x ----+ 1201020) )(())((y x x x x x x x x ---- + 2201010) )(())((y x x x x x x x x ---- = 10)44(21)144)(121(?-?---x x + 11) 23(21)144)(100(?-?--x x + 1223 44)144)(100(??--x x L 2(115)= 10)44(21)29(6?-?--?-x + 11) 23(21)29(15?-?-? + 1223 44)6(15??-? ≈10.7228 在Matlab 窗口输入
编程实现拉格朗日(lagrange)插值法(C语言)
编程实现拉格朗日(lagrange)插值法(C语言) 程序如下: #include #include <> #include <> float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/ { int i,j; float *a,yy=; /*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; } int main() { int i; int 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]);
计算方法实验四拉格朗日插值实验报告
实验报告 学院:电子信息工程 实验课程:计算方法 学生姓名: 学号: 专业班级:通信工程17-3班级
实验四 Lagrange 插值 1 目的与要求 (1)进一步理解和掌握Lagrange 插值的数值算法。 (2)能够根据给定的函数值表求出插值多项式和函数在某一点的近似值以解决实际问题 2 实验内容 已知函数表如下,通过编制程序,试用拉格朗日插值多项式求0.5,0.7,0.85三点处的近似函数值。 3 实验原理 拉格朗日插值多项式: 4 程序设计 (1)流程图 拉格朗日插值程序流程图 ∑=== n i 0 i i i ) x (l y y ) x x ()x x )(x x ()x x () x x ()x x )(x x ()x x ()x (l n i 1i i 1i i 0i n 1i 1i 0i --------= +-+-ΛΛΛΛ
(2)程序代码 #include #include #define n 5 double lagrange(long double a[n],long double b[n],double x) { int k,l; long double y1,m; y1=0.0; for(k=0;k{ m=1.0; for(l=0;l拉格朗日插值法理论及误差分析
目录: 一、 引言 二、 插值及多项式插值的介绍 三、 拉格朗日插值的理论及实验 四、 拉格朗日插值多项式的截断误差及实用估计式 五、 参考文献 一、引言 插值在数学发展史上是个古老问题。插值是和拉格朗日(Lagrange )、牛顿(Newton )、高斯(Gauss )等著名数学家的名字连在一起的。在科学研究和日常生活中,常常会遇到计算函数值等一类问题。插值法有很丰富的历史渊源,它最初来源人们对天体研究——有若干观测点(我们称为节点)计算任意时刻星球的位置(插值点和插值)。现在,人们在诸如机械加工等工程技术和数据处理等科研都有很好的应用,最常见的应用就是气象预报。插值理论和方法能解决在实际中当许多函数表达式未知或形式复杂,如何去构造近似表达式及求得在其他节点处的值的问题。 二、插值及多项式插值 1、插值问题的描述 设已知某函数关系()y f x =在某些离散点上的函数值: 插值问题:根据这些已知数据来构造函数()y f x =的一种简单的近似表达式,以便于计算点,0,1,,i x x i n ≠=的函数值()f x ,或计算函数的一阶、二阶导数 值。 2、插值的几何意义 x x 0 y y 1 y 1 n y -n y 1 x 1 n x -n x
插值的几何意义如图1所示: 图1 3、多项式插值 基本概念 假设()y f x =是定义在区间,a b ????上的未知或复杂函数,但一直该函数在点01n a x x x b ≤<< <≤处的函数值01,,n y y y 。找一个简单的函数,例如函数 ()P x ,使之满足条件 (),0,1,2, ,,i P x y i n == () 通常把上述01n x x x << < 称为插值节点,把()P x 称为()f x 的插值多项 式,条件()称为插值条件,并把求()P x 的过程称为插值法。 插值多项式的存在性和唯一性 如果插值函数是如下m 次的多项式: 1011()m m m m m P x a x a x a x a --=++ + 那么插值函数的构造就是要确定()m P x 表达式中的m+1个系数 011,, ,m m a a a a -。由于插值条件包含n+1独立式,只要m=n 就可证明插值函数多 项式是唯一存在。 实际上,由n+1个插值条件可得
对拉格朗日插值法与牛顿插值法的学习和比较
对拉格朗日插值法与牛顿插值法的学习和比较 摘要:根据对拉格朗日插值法和牛顿插值法的理解,本文主要介绍了拉格朗日插值法和牛顿插值法的相关内容以及它们的区别。 关键词:拉格朗日插值法;牛顿插值法 The leaning and comparison of the Lagrange interpolation and Newton interpolation Abstract: Based on the understanding of the Lagrange interpolation and Newton interpolation ,this paper mainly describes some related knowledge as well as the difference between these two methods. Keywords: Lagrange interpolation ; Newton interpolation 前言 在工程和科学研究中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际问题中,虽然可以断定所考虑的函数)(x f 在区间],[b a 上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到在有限个点上的函数值(即一张函数表)。显然,要利用这张函数表来分析函数)(x f 的性态,甚至直接求出其他一些点上的函数值可能是非常困难的。面对这些情况,总希望根据所得函数表(或结构复杂的解析表达式),构造某个简单函数)(x P 作为)(x f 的近似。这样就有了插值法,插值法是解决此类问题目前常用的方法。 如设函数)(x f y =在区间],[b a 上连续,且在1+n 个不同的点b x x x a n ≤≤,,,10 上分别取值n y y y ,,,10 。 插值的目的就是要在一个性质优良、便于计算的函数类Φ中,求一简单函数)(x P ,使 ),,1,0()(n i y x P i i == 而在其他点i x x ≠上,作为)(x f 的近似。 通常,称区间],[b a 为插值区间,称点n x x x ,,,10 为插值节点,称式i i y x P =)(为插值条件,称函数类Φ为插值函数类,称)(x P 为函数)(x f 在节点n x x x ,,,10 处的插值函数。求插值函数)(x P 的方法称为插值法。 插值函数类Φ的取法不同,所求得的插值函数)(x P 逼近)(x f 的效果就不同。它的选择取决于使用上的需要,常用的有代数多项式、三角多项式和有理函数等。当选用代数多项式作为插值函数时,相应的插值问题就称为多项式插值。本文讨论的拉格朗日插值法与牛顿插值法就是这类插值问题。 在多项式插值中,最常见、最基本的问题是:求一次数不超过n 的代数多项式 n n x a x a a x P +++= 10)( 使),,1,0()(n i y x P i i n ==,其中,n a a a ,,,10 为实数。
数值分析 算法C语言程序
一、拉格朗日插值 #include #include #include void Lagrange(float s) { double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},f,L=0; int i,j; for (i=0;i<5;i++) { f=1; for (j=0;j<5;j++) if(j!=i) f=(s-x[j])/(x[i]-x[j])*f; L+=f*y[i]; } printf("输出:%f\n",L); } void main() { float x; printf("输入插值点:"); scanf("%f",&x); Lagrange(x); } 二、牛顿插值 #include #include #include int ND(float s) { double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},p=0,g,f; int i,j,k; for (i=0;i<5;i++) { for (j=4;j>i;j--) { f=x[j]-x[j-i-1];y[j]=(y[j]-y[j-1])/f;} g=y[i+1]; for (k=0;k<=i;k++) g=g*(s-x[k]); p=p+g; } printf("输出插值点函数值:%f\n",p+y[0]); return 1; }
拉格朗日插值公式的证明及其应用
拉格朗日插值公式的证明及其应用
拉格朗日插值公式的证明及其应用 摘要: 拉格朗日(Lagrange)插值公式是多项式中的重要公式之一,在理论和实践中都有着广泛的应用.本文阐述了Lagrange插值的基本理论,譬如:线形插值,抛物插值,Lagrange多项式等.然后将线形插值,抛物插值,Lagrange多项式插值分别应用到高中知识中,并且学会用计算机程序来编写.插值法的思想与中国剩余定理一脉相承, 体现了代数中"线性化" (即表示为求和和数乘的形式) 这一基本思路, 大巧若拙.本文的目的是通过介绍拉格朗日插值公式的推导,唯一性,证明过程及其在解题与实际生活问题中的应用来寻找该公式的优点,并且引人思考它在物理,化学等领域的应用.通过实际鉴定过程,利用插值公式计算生活中的成本问题,可以了解它的计算精度高,方法快捷. 关键词:拉格朗日插值公式唯一性证明解题应用资产评估 曲线插值问题,直观地说,认为已知的一批数
3 据点()n k k k f x 0 ,=是准确的,这些数据点所表现的准确函 数关系()x f 是未知的,在这种情况下要作一条近似曲线()x P 且点点通过这些点,插值问题不仅要讨论这种近似曲线()x P 的构造方法,还要讨论点增多时这种近似曲线()x P 是否稳定地收敛于未知函数()x f ,我们先研究一种简单常用的插值——拉格朗日插值. 一.定义,推导及其在解题中的应用 1.线性插值 1.1. 线性插值的定义 假定已知区间[]1 ,+k k x x 的端 点处的函数值() k k x f y =, () 11++=k k x f y , 要求线性插值多项式()x L 1 使它满 足()k k y x L =1 , ()1 11++=k k y x L . () x L y 1=的几何意义:通过两点() k k y x ,和() 11 ,++k k y x 的直线,如图1所示,()x L 1 的表达式由几何 意义直接给出,即 ()()k k k k k k x x x x y y y x L ---+ =++111 (点斜式), 图1 ()1 1111++++--+--= k k k k k k k k y x x x x y x x x x x L (两点式). 由两点式方程看出,()x L 1 由两个线性函数 ()1 1 ++--= k k k k x x x x x l ,()k k k k x x x x x l --= ++11的线性组合得到,其系数分别 y=L 1x () y=f x () y k+1 k x k+1 x k o y
拉格朗日插值算法C语言程序
#include float lagrange(float * x,float * y,float xx,int n) //拉格朗日插值算法 //指向浮点型的指针变量x,y { 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]=a[i]*((xx-x[j])/(x[i]-x[j])); yy=yy+a[i]; } free(a); return yy; } main() {int i,n; float x[20],y[20],xx,yy; printf("请输入插值点个数n:"); scanf("%d",&n); if(n>=20) {printf("Error!"); } if(n<=0) {printf("Error!"); } printf("\n请输入插值点\n"); for(i=0;i<=n-1;i++) { printf("x[%d]:",i); scanf("%f",&x[i]); } printf("\n请输入对应函数值\n"); for(i=0;i<=n-1;i++) {printf("y[%d]:",i); scanf("%f",&y[i]); } printf("\n请输入插值点xx:"); scanf("%f",&xx); yy=lagrange(x,y,xx,n); printf("\n"); printf("x=%f,L(x)=%f\n",xx,yy);