刘盼计算方法实验
double u1,u2; double m1,l1,p1,m2,l2,p2; printf("请输入要计算的x的值:"); scanf("%lf",&u1); m1=1/(1+u1*u1); printf("x=%lf时的精确值为:%f\n",u1,m1); printf("x=%lf时的拉格朗日差值近似值为:%f\n",u1,Lagrange(x,y,u1));//拉格郎日插值 printf("x=%lf时的分段线性差值近似值为:%f\n",u1,PiecewiseLinear(x,y,u1)); //分段线性插值 l1=m1-Lagrange(x,y,u1); p1=m1-PiecewiseLinear(x,y,u1); printf("x=%lf时的拉格朗日误差为:%f\n",u1,l1); printf("x=%lf时的分段线性误差为:%f\n",u1,p1); printf("请再输入要计算的x的值:"); scanf("%lf",&u2); m2=1/(1+u2*u2); printf("x=%lf时的精确值为:%f\n",u2,m2); printf("x=%lf时的拉格朗日差值近似值为:%f\n",u2,Lagrange(x,y,u2));//拉格郎日插值 printf("x=%lf时的分段线性差值近似值为:%f\n",u2,PiecewiseLinear(x,y,u2)); //分段线性插值
所谓多项式插值即求 n 次多项式 Pn (x) a0 a1x anxn 使得 Pn ( xi ) f ( xi )
基于基函数的拉格朗日插值是构造多项式插值最基本方法。也是推导数值微积分和微分方程数
值解的公式的理论基础。
n
拉格朗日插值公式为: pn ( x) yk lk ( x) k0
ቤተ መጻሕፍቲ ባይዱ
其中 lk ( x)
n j0
x xj xk x j
jk
2. Lagrange 插值算法描述:(也可以是算法流程图)
步骤 1: 构造 x0 , x1, , xn 处的插值基函数 l0 (x), l1(x), , ln (x) ,其中,插值节点 xi 处的插值
计算机科学与工程学院
基函数 li (x) 为 li (x)
(x x0 ) (x (xi x0 ) (xi
}
2. Lagrange 插值子程序: double Lagrange(double *x, double *y, double xx) //拉格郎日插值 {
int i,j; double *a,yy=0.000; a=new double[11]; for(i=0;i<11;i++) {
a[i]=y[i]; for(j=0;j<11;j++)
插值节点 被插函数 f(x)在插值节点处的函数值 求插值函数 Ln (x)在 t 处的函数值 插值函数 Ln (x)在 t 处的函数值
1. 主程序 int main() {
double x[11] = {-5,-4,-3,-2,-1,0,1,2,3,4,5},y[11] = {0.038461,0.058823,0.100000,0.200000,0.500000,1.000000,0.500000,0.200000,0.100000,0.0588 23,0.038461};
《计算方法》实验报告
学号
实验项目名称 一、实验名称
201521677 2
刘盼
班级
插值与拟合
计算机一班
实验一 插值与拟合
二、实验目的:
1. 明确插值多项式和分段插值多项式各自的优缺点;
2. 编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象; 3. 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法 4. 运用常用的插值和拟合方法解决实际问题。
xi 1)(x xi 1) (x xn ) ; xi 1)(xi xi 1) (xi xn )
步骤 2:以 yi 作为 li (x) 的系数,使得 yili (x) 通过插值点 (xi , yi ) ;
步骤 3:把所有的 yili (x) 线性叠加,得到通过所有插值点 (xi , yi ), i 0,1, , n 的插值函数
三、实验内容及要求
(1)对于
f
(
x)
1
1 x2
,
5 x5
要求选取 11 个等距插值节点,分别采用拉格朗日插值和分段线性插值,计算 x 为 0.5, 4.5 处的函数
值并将结果与精确值进行比较。
输入:区间长度,n(即 n+1 个节点),预测点
输出:预测点的近似函数值,精确值,及误差
(2)已知 1 1,4 2,9 3,用牛顿插值公式求 5 的近似值。
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]); yy+=a[i];
输入:数据点集,预测点。
输出:预测点的近似函数值
四、实验原理及算法描述
1. Lagrange 插值法的基本原理: 当精确函数 y = f(x) 非常复杂或未知,在一系列节点 x0 … xn 处测得函数值 y0 = f(x0), … yn =
f(xn), 希望由此构造一个简单易算的近似函数 g(x) f(x),满足条件 g(xi) = f(xi) (i = 0, … n)。这 里的 g(x) 称为 f(x) 的插值函数,由插值函数可以去近似估计 f(x)在一些未知点处的函数值。最常 用的插值函数是多项式插值。
2
计算机科学与工程学院
l2=m2-Lagrange(x,y,u2); p2=m2-PiecewiseLinear(x,y,u2); printf("x=%lf时的拉格朗日误差为:%f\n",u2,l2); printf("x=%lf时的分段线性误差为:%f\n",u2,p2); newton(); return 0;
Ln (x)
n
yili (x) 。
i0
Lagrange 插值伪代码:
给定 n 个插值点 (x0 , y0 ), (x1, y1), , (xn , yn ) 的情况下,求插值函数 Ln (x) 在点 t 处的函数值。
/*输入参数 *x=(x0,x1,….,xn), *y=(y0,y1,…,yn); *t *返回值 */ 五、程序代码及实验结果