《计算方法》实验报告
目录(按住 ctrl 鼠标左键即可跳转)
《计算方法》实验报告 .................................................................................................................... 1
实验一 插值与拟合 ...................................................................................................................... 1
实验目的:................................................................................................................................ 1
实验内容及要求........................................................................................................................ 2
实验原理及算法描述................................................................................................................ 2
程序代码及实验结果................................................................................................................ 2
实验总结 .................................................................................................................................... 9
实验二 数值积分 .......................................................................................................................... 9
实验目的:................................................................................................................................ 9
实验内容及要求........................................................................................................................ 9
实验原理及算法描述.............................................................................................................. 10
程序代码及实验结果.............................................................................................................. 12
实验总结 .................................................................................................................................. 17
实验三 数值微分 ........................................................................................................................ 18
实验目的:.............................................................................................................................. 18
实验内容及要求: .................................................................................................................. 18
实验原理及算法描述: .......................................................................................................... 18
程序代码及实验结果.............................................................................................................. 19
实验总结 .................................................................................................................................. 22
实验四 非线性方程求根迭代法 ................................................................................................ 22
实验目的:.............................................................................................................................. 23
实验内容及要求: .................................................................................................................. 23
实验原理及算法描述: .......................................................................................................... 23
实验总结 .................................................................................................................................. 26
学号
姓名
班级
实验项目名称
一、实验名称
求利用插值算法函数值
实验一 插值与拟合
实验目的:
(1) 明确插值多项式和分段插值多项式各自的优缺点;
(2) 编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;
(3) 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法
(4) 运用常用的插值和拟合方法解决实际问题。
计算机科学与技术
实验内容及要求
(1) 对于 f(x)=1/(1+x2),-5<=x<=5
要求选取 11 个等距插值节点,分别采用拉格朗日插值和分段线性插值,计算 x 为 0.5, 4.5
处的函数值并将结果与精确值进行比较。
输入:区间长度,n(即 n+1 个节点),预测点
输出:预测点的近似函数值,精确值,及误差
(2)已知 1 =1,√4= 2,√9= 3,用牛顿插值公式求√5 的近似值。
输入:数据点集,预测点。
输出:预测点的近似函数值
实验原理及算法描述
1. Lagrange 插值法的基本原理:
拉格朗日插值公式:
(
xp
n
)
n
k
0
(
xly
kk
)
(
xl
k
)
x
x
k
x
j
x
j
n
0
j
kj
2. Lagrange 插值算法描述:(也可以是算法流程图)
( ),
l x l x
,
xL
( ),
,
1,
x x
处的插值基函数 0
步骤 1: 构造 0
1
n
L
,
( )
l x
n
,其中,插值节点 ix 处的插值基函数
( )
il x 为
( )
l x
i
=
x
-
-
(
x
i
)
x
L
0
)
x
L
0
(
(
x
(
x
i
-
-
x
i
x
i
-
1
-
1
)(
)(
x
x
i
-
-
+
x
i
x
i
+
1
1
)
L
)
L
(
)
x
x
-
n
(
x
x
-
i
n
)
;
步骤 2:以 iy 作为 ( )
il x 的系数,使得 ( )
i iy l x 通过插值点 (
,
x y ;
)
i
i
步 骤 3 : 把 所 有 的 ( )
i iy l x 线 性 叠 加 , 得 到 通 过 所 有 插 值 点 (
,
x y
i
i
),
i
=
0,1,
( )
L x
n
n
= å
i
=
0
( )
y l x
i i
。
L 的 插 值 函 数
,
n
),(
0
(
,
x y
Lagrange 插值伪代码:
给定 n 个插值点 0
/*输入参数
*x=(x0,x1,….,xn),
*y=(y0,y1,…,yn);
*t
*返回值
*/
,
x y
1
1
),
L
,(
,
x y
n
)
n
的情况下,求插值函数 ( )
nL x 在点t 处的函数值。
插值节点
被插函数 f(x)在插值节点处的函数值
求插值函数 Ln (x)在 t 处的函数值
插值函数 Ln (x)在 t 处的函数值
程序代码及实验结果
2
计算机科学与技术
1. 主程序
int main(){
int n;
cout<<"请输入插入结点个数 ";
cin>>n;
vectorxi(n);
vectoryi(n);
cout<<"请输入 xi 以及对应的 yi "<>xi[i]>>yi[i];
}
int nn;
cout<<"请输入求解个数 nn";
cin>>nn;
vectorxx(nn);
vectorresult(nn);
vectorresult_p(nn);
cout<<"输入变量值";
for(int j=0;j>xx[j];
}
cout<yy(nn);
yy[0]=0.8;
yy[1]=0.047059;
cout<>new_n;
3
计算机科学与技术
vectornew_xi(new_n);
vectornew_yi(new_n);
cout<<"输入 xi 以及对应的 yi"<>new_xi[i]>>new_yi[i];
}
double new_number;
cout<<"请输入变量 x 的值 ";
cin>>new_number;
cout<<"牛顿插值所求结果为="<&xi,vector&yi,int
}
2. Lagrange 插值子程序:
void
nn,vector&xx,vector&result){
lagrange(int
double temp_result=0;
for(int i=0;i&xx,vector&result_p){
partinter(int
n,vector&xi,vector&yi,int
double temp_result;
for(int i=0;ixx[i]){
temp=j;
break;
4
计算机科学与技术
}
}
temp_result=yi[temp-1]*(1-(xx[i]-xi[temp-1])/(xi[temp]-xi[temp-1]))+yi[temp]*(xx[i]-xi[temp-1])/(xi[
temp]-xi[temp-1]);
result_p[i]=temp_result;
}
}
3. 牛顿插值子程序
double newton(int n,vector&xi,vector&yi,double number){
vector >diff(n);
for(int i=0;i
#include
#include
#include
using namespace std;
void
lagrange(int
n,vector&xi,vector&yi,int
5
计算机科学与技术
//变量解释 n 代表插值点数量 xi yi 分别为 x y 对
n,vector
&xi,vector&yi,int
// result_p 为分段插值结果
partinter(int
nn,vector&xx,vector&result);
应值 nn 求解个数 xx 为存储求解 x 的数组 result 为拉格朗日插值结果
void
nn,vector&xx,vector&result_p);
double newton(int n,vector&xi,vector&yi,double number);
int main(){
int n;
cout<<"请输入插入结点个数 ";
cin>>n;
vectorxi(n);
vectoryi(n);
cout<<"请输入 xi 以及对应的 yi "<>xi[i]>>yi[i];
}
int nn;
cout<<"请输入求解个数 nn";
cin>>nn;
vectorxx(nn);
vectorresult(nn);
vectorresult_p(nn);
cout<<"输入变量值";
for(int j=0;j>xx[j];
}
cout<yy(nn);
yy[0]=0.8;
yy[1]=0.047059;
cout<计算机科学与技术
cout<<"输入插入解点个数 ";
cin>>new_n;
vectornew_xi(new_n);
vectornew_yi(new_n);
cout<<"输入 xi 以及对应的 yi"<>new_xi[i]>>new_yi[i];
}
double new_number;
cout<<"请输入变量 x 的值 ";
cin>>new_number;
cout<<"牛顿插值所求结果为="<&xx,vector&result){
lagrange(int
double temp_result=0;
for(int i=0;i&xx,vector&result_p){
partinter(int
double temp_result;
for(int i=0;ixx[i]){
temp=j;
break;
}
n,vector&xi,vector&yi,int
n,vector&xi,vector&yi,int
7
计算机科学与技术
}
temp_result=yi[temp-1]*(1-(xx[i]-xi[temp-1])/(xi[temp]-xi[temp-1]))+yi[temp]*(xx[i]-xi[temp-1])/(xi[
temp]-xi[temp-1]);
result_p[i]=temp_result;
}
}
double newton(int n,vector&xi,vector&yi,double number){
vector >diff(n);
for(int i=0;i