牛顿插值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++实现
⽜顿插值法及其C++实现⽜顿插值法⼀、背景引⼊相信朋友们,开了拉格朗⽇插值法后会被数学家的思维所折服,但是我想说有了拉格朗⽇插值法还不够,因为我们每次增加⼀个点都得重算所有插值基底函数,这样会增加计算量,下⾯我们引⼊⽜顿插值法,这种插值法,添加⼀个插值结点我们只要做很⼩的变动便可以得到新的插值多项式。
⼆、理论推导-均差的定义:(⼀阶均差)⼆阶均差为⼀阶均差再求均差。
(显然是递推的)⼀般地,函数f 的k阶均差定义为:由均差的性质可以推导出:k+1阶均差:(具体性质看:《数值分析:第5版》 page:30)由均差的递推性,我们可以⽤以下表来求:求表的公式:table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);其中P(x) 为插值多项式,⽽R(x) 为插值余项。
所以p(x):(由于图⽚问题此处P(x) 同N(x))三、代码实现由以上推导可知,求⽜顿插值多项式⼦主要就是求均差。
均差可由上表递推求得:求表的公式:table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);#include <iostream>using namespace std;#include <vector>inline double newton_solution(double x[], double y[], int n, double num, int newton_time) {vector<vector<double> > table(n + 1);for (int i = 0; i <= n; i++) {table[i].resize(n + 1);}for (int i = 0; i <= n; i++) table[0][i] = y[i];for (int i = 1; i <= n; i++) {for (int j = i; j <= n; j++) {table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]); }}double res = 0.0;for (int i = 0; i <= newton_time; i++) {double temp = table[i][i];for (int j = 0; j < i; j++) {temp *= num - x[j];}res += temp;}return res;}int main(int argc, char const *argv[]){int n = 0;cout << "插值节点个数-1:";cin >> n;double x[n + 1], y[n + 1];cout << "\n请输⼊x[i]:";for (int i = 0; i <= n; i++) {cin >> x[i];}cout << "\n请输⼊y[i]:";for (int i = 0; i <= n; i++) {cin >> y[i];}double num = 0;cout << "\n请输⼊要求的点的x:";cin >> num;cout << "\n请输⼊所求的插值多项式次数:";double newton_time = 0;cin >> newton_time;cout << newton_solution(x, y, n, num, newton_time) << endl; return0;。
用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();}。
C语言复习---迭代法,牛顿迭代法,二分法求根
C语⾔复习---迭代法,⽜顿迭代法,⼆分法求根⼀:⽤迭代法求 x=√a。
求平⽅根的迭代公式为:X(n+1)= (Xn+a/Xn) /2。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){double x1, x2;float a;scanf("%f", &a);x2 = 1.0;do{x1 = x2;x2 = (x1 + a / x1) / 2;} while (fabs(x1-x2)>pow(10,-5));printf("value:%lf", x2);system("pause");return0;}⼆:⽤求⽅程在1.5附近的根(2x3-4x2+3x-6=0)例:⽅程求根⽜顿迭代法求⽅程 f(x)=x3+x2-3x-3=0在1.5附近的根f(x)=x^3+x^2-3x-3f'(x)=3x^2+2x-3x(n+1)=xn-f(xn)/f'(xn)令x1=1.5x2=1.777778x3=1.733361x4=1.732052x5=1.732051x6=1.732051如果精确到0.000001,则x=1.732051准确值=根号3重要公式#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){double x1=0, x2;double fx1, fx2;x2 = 1.5;while (fabs(x1 - x2)>=1e-6){x1 = x2;fx1 = 2 * x1*x1*x1 - 4 * x1*x1 + 3 * x1 - 6; //f(xn)fx2 = 6 * x1*x1 - 8 * x1 + 3; //f(xn)'x2 = x1 - fx1 / fx2;}printf("value:%lf", x2);system("pause");return0;}三:⼆分法求⽅程的根给定精确度ξ,⽤⼆分法求函数f(x)零点近似值的步骤如下:1确定区间[a,b],验证f(a)·f(b)<0(这是前提,选取的区间必须满⾜这个条件),给定精确度ξ. 2求区间(a,b)的中点c.3计算f(c).(1) 若f(c)=0,则c就是函数的零点;(2) 若f(a)·f(c)<0,则令b=c;(3) 若f(c)·f(b)<0,则令a=c.(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.#include <stdio.h>#include <stdlib.h>#include <math.h>double fx(double x){return2 * x*x*x - 4 * x*x + 3 * x - 6;}int main(){double x1 , x2;double fx1, fx2;double e = 1e-6;do{printf("enter (x1,x2):\n");scanf("%lf", &x1);scanf("%lf", &x2);if (x1>x2){double temp = x1;x1 = x2;x2 = temp;}fx1 = fx(x1);fx2 = fx(x2);} while (fx1*fx2>0);if (fabs(fx1) < e)printf("solution1:%lf\n", x1);else if (fabs(fx2) < e)printf("solution2:%lf\n", x2);else{while (fabs(x1 - x2) >= e){double mid = (x1 + x2) / 2;if (fx(mid)*fx2 < 0)x1 = mid;elsex2 = mid;}printf("solution3:%lf", x2);}system("pause");return0;}。
用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语言牛顿迭代法是一种常用的数值计算方法,其可以用来求解非线性方程的根。
本文将介绍牛顿迭代法的基本原理和实现方法,并提供一些使用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语言编程
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 方法实现(数值分析上机实验)
数值分析上机实验实验一一.上机题目:已知: 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语言实现牛顿法求方程的根的示例代码:```c#include <stdio.h>#include <math.h>// 要求解的方程double f(double x) {return x*x - 2; // 求解x^2 - 2 = 0的根}// 方程的导数double df(double x) {return 2*x; // 方程的导数为2x}// 牛顿法求根函数double newton(double x0, double epsilon) {double x = x0; // 初始值double delta; // 误差do {double fx = f(x);double dfx = df(x);delta = fx / dfx; // 迭代公式x = x - delta; // 迭代计算新的x} while (fabs(delta) > epsilon); // 判断误差是否小于给定的精度return x;}int main() {double x0 = 1; // 初始值double epsilon = 0.0001; // 精度double root = newton(x0, epsilon);printf("方程的根为:%lf\n", root);return 0;}```以上代码中,`f`函数表示要求解的方程,`df`函数表示方程的导数,`newton`函数是用牛顿法求方程的根的函数,`main`函数是主函数,用于测试求解结果。
在代码中,初始值`x0`和精度`epsilon`可以根据实际情况进行调整。
运行代码得到的输出结果为方程的根值。
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)=x^2-3为例,假设我们需要求解f(x)=0的近似解,那么我们可以利用初始值x0,通过f(x)在x0点的切线来近似零点所在的位置,并且以该点为起点再次迭代求解,例如:令x0=2,则f(x0)=1,切线的斜率为f'(x0)=4,切线方程为y=4(x-2)+1,令y=0,则可求出近似解为x1=2.25.以x1为新的起点,再次迭代即可求得更精确的近似解。
牛顿迭代法在计算中通常有以下步骤:1.选择初始值x0;2.计算函数f(x)在x0处的导数f'(x0);3.利用切线公式求出近似解x1,即x1=x0-f(x0)/f'(x0);4.以x1为新的起点,重复步骤2-3,直到达到精度要求为止。
下面是牛顿迭代法的经典算法:double NewtonIter(double x0, double epsilon){double x = x0;double y = x*x - 3;double dy;do {dy = 2 * x;x = x - y / dy;y = x*x - 3;} while (fabs(y) > epsilon);return x;}其中,x0为初始值,epsilon为精度要求。
下面是一个简单的应用,求解x^2-2=0的根:#include <stdio.h>#include <math.h>double NewtonIter(double x0, double epsilon); int main(){double x0 = 1.5;double epsilon = 1e-6;double res = NewtonIter(x0, epsilon);printf("The root of x^2-2=0 is: %.6f", res); return 0;}运行结果:The root of x^2-2=0 is: 1.414214通过以上例子,我们可以看到牛顿迭代法可以高效地求解一元方程的近似解。
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语言插值算法》课件
多维插值算法实现
多维拉格朗日插值
通过多维拉格朗日多项 式来逼近函数,并估计 一个值。
多维牛顿插值
使用多维牛顿多项式来 逼近函数,并估计一个 值。
多维样条插值
通过多维样条函数来逼 近函数,并估计一个值 。
03
C语言插值算法性能优化
BIG DATA EMPOWERS TO CREATE A NEW
图像处理
在图像处理中,插值算法用于 图像缩放、旋转等操作,实现 图像的平滑过渡和细节保留。
计算物理
在计算物理模拟中,插值算法 用于将离散的数据点转换为连 续的物理场,提高模拟精度和
可靠性。
02
C语言插值算法实现
BIG DATA EMPOWERS TO CREATE A NEW
ERA
一维插值算法实现
04
案例分析
BIG DATA EMPOWERS TO CREATE A NEW
ERA
一维插值算法案例
总结词
一维插值算法适用于单变量的插值问题,通过已知的离散数据点,估算出未知点的值。
详细描述
一维插值算法通常用于处理单变量的数据,如气温、降雨量等。通过已知的离散数据点 ,我们可以使用一维插值算法来估算出未知点的值。常用的方法包括线性插值、多项式
THANKS
感谢观看
减少循环次数
通过优化循环结构,减少不必要 的迭代次数,从而加快算法的执 行速度。
并行化处理
利用多核处理器
通过并行计算技术,将任务分配给多 个核心同时处理,可以显著提高计算 性能。
使用多线程编程
利用多线程编程技术,将计算任务划 分为多个线程,并由操作系统调度执 行,可以充分利用多核处理器的计算 能力。
拉格朗日插值和牛顿插值多项式的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引言插值法是一种古老的数学研究方法,他的产生来自与社会的生产实践活动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end
s=p*y0(k)+s;
end
y(i)=s;
end
②脚本文件cz.m
tic
x=[0.0 0.1 0.2 0.3 0.4];
y=[0.5000 0.5398 0.5793 0.6179 0.7554];
x0=[0.0:0.01:0.4];
y0=lagrange(x,y,x0)
toc
③输出结果:
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]
step 4输出[d0,d1,…dn]
Hale Waihona Puke 程序:(Matlab)①建立自定义函数Chashang.m
functionf=Chashang(x,y,X)
symst;%定义符号变量t,进行公式的化简和计算;
n=length(x);%测量向量x的长度,赋给n;
m=length(y);%测量向量y的长度,赋给m;
Columns 27 through 39
0.5984 0.6024 0.6069 0.6120 0.6179 0.6247 0.6325 0.6416 0.6521 0.6641 0.6780 0.6938 0.7118
Columns 40 through 41
0.7323 0.7554
时间已过0.003052秒。
ifm~=n%判断m和n是否相等,就是判断x与y是否一一对应;
error('样本数据中的x与y的对应个数不匹配');
end
A=zeros(n,n);%定义一个n行n列的零矩阵;
A(:,1)=y';%把向量y转置,赋给零矩阵的第一列;
forj=2:n%第一个循环,变量为j,用来表示第几行;
fori=1:(n-j+1)%第二个循环,变量为i,用来表示第几列;
A(i,j)=(A(i+1,j-1)-A(i,j-1))/(x(i+j-1)-x(i));%差商公式,A(i,j)表示零矩阵的第j行,第i列;
end
end
A
f=A(1,1);
forj=2:n
T=1;
fori=1:j-1
T=T*(t-x(i));
end
f=f+A(1,j)*T;%输出多项式;
end
f=vpa(f,2);%控制运算精度,不然结果的位数无法控制,或是输出分数;
2、㈠利用1中的求差商的算法,把求出的差商矩阵的提取对角线元素,利用秦九韶算法,得到牛顿插值多项式。
①首先建立自定义函数Newton.m
functionf=Newton(x,y,X)
symst;%定义符号变量t,进行公式的化简和计算;
n=length(x);%测量向量x的长度,赋给n;
m=length(y);%测量向量y的长度,赋给m;
《数值分析》实验报告
学号:20120921101姓名:孙腾班级:计算1201日期:2012/10/20
题目:Newton插值法
实验环境:MATLAB 2014Ra;
Win7旗舰版;
实验内容与完成情况:
1、编程实现求差商的算法。
2、设有函数 的函数表如下
x
0.0 0.1 0.2 0.3 0.4
0.5000 0.5398 0.5793 0.6179 0.7554
y=[0.5,0.5398,0.5793,0.6179,0.7554];
X=0.0:0.01:0.4;
f=Newton(x,y,X)
toc %第一遇到toc利用之间的插值,求出程序运行消耗时间;
㈡输出结果:
A=
0.5000 0.3980 -0.0150 -0.1000 41.8333
0.5398 0.3950 -0.0450 16.6333 0
f=simplify(f)%对表达式f进行化简;
f=subs(f,'t',X)%赋值函数,用数值替代符号,用X代替t,计算差值函数值并输出;
②然后编写脚本文件ndcz.m调用函数
clc
clear
tic %调用程序运行时间消耗函数,第一次遇到tic开始计时;
x=[0.0,0.1,0.2,0.3,0.4];
㈣牛顿差值与拉格朗日插值所得插值函数值对比
①程序:fND1=[0.5,0.50190188499956100034371407515916, 0.50458175999920145453262692962753, 0.5079034849989118200028083228222
0.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];