合肥工业大学计算机专业计算方法实验报告.docx
《合肥工业大学计算机专业计算方法实验报告.docx》由会员分享,可在线阅读,更多相关《合肥工业大学计算机专业计算方法实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
合肥工业大学计算机专业计算方法实验报告
合肥工业大学
计算机与信息学院
实验报告
课程:
计算方法
专业班级:
学号:
姓名:
函數憐値数値积分常ISl分方程求解迭代法求方程根线性方程组求解
蚩数输入提示
e⅛fi⅛Λ∣κ
处理结果
⅞s⅛
JaVa界面
其实都不难按照程序流程图就可以完成了
实验一插值与拟合
一、实验目的
(1)明确插值多项式和分段插值多项式各自的优缺点;
(2)编程实现三次样条插值算法,分析实验结果体会高次插值产生的龙格现象;
(3)理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法
(4)运用常用的插值和拟合方法解决实际问题。
二、实验内容
(1)对于f(x)=1∕(1+x*x)实现三次样条插值
(2)实现最小二乘法的直线拟合
数据如下:
Xj
165
123
150
123
141
yj
187
126
172
125
148
三、基本原理(计算公式)
(1)三次样条插值在每个内节点上具有2阶导数。
⑵最小二乘法拟合直线为y=a+bx,而a,b有如下等式(N为给出的数据点的总个数)
aNb^^yi;a'Xib'x27Xiyi
四、算法设计与实现(流程图,关键点)
a,b。
用得到的拟合直线计算预测点的
最小二乘法直线拟合:
输入数据后,按照公式计算近似函数值。
五、输入与输出
(1)三次样条插值
输入:
区间长度,n+1个数据点,预测点输出:
预测点的近似函数值,精确值,及误差
(2)最小二乘法直线拟合
输入:
n个数据点,预测点
输出:
预测点的近似函数值
六、结果讨论和分析
■E:
\计算右⅛∖屋小二祠苗直戋拟⅛),exe
1.5138U⅛⅛S⅛⅛⅛y--60^392*t-51381x睛输入插値节点略112⅛×=ιi2.y=108-θ08请输入插值节点X=134
⅛x=134,y=141.912蒂输入插值节点壮152⅛χ-lS3,⅛=1691lt请输人J⅛紅节点×≈13?
⅛x=137,y=146.453请诙入皤值节点K=咛
⅛x=77f⅛=85.9006*輪入插值节点
代码
三次样条插值
#inClUdeVioStream>
#include
#defineN10
USingnamespacestd;
doubleu0(doublex){
return(x-1)*(x-1)*(2*x+1);
}
doubleu1(doublex){
returnx*x*(3-2*x);
}
doublev0(doublex){
returnx*(x-1)*(x-1);
}
doublev1(doublex){
returnx*x*(x-1);
}
doubles3(doublex,doubley,doubley1,doublem,doublem1,doubleh){returnuθ(x)*y+u1(x)*y1+h*vθ(x)*m+h*v1(x)*m1;
}
doublef(doublex){
return1∕(1+x*x);
}
intmain(){
ifstreamfin;
fin.open("E:
\\t.txt");
if(!
fin){
cout<<"erroropeninginPUtStream"<SyStem("pause");
return0;
}
doublex[N+1],y[N+1],m[N+1],A[N],B[N],C[N];
doubleh[N];
doublea[N],b[N];
doublef0,fn;
doubletemp;
inti;
for(i=0;i<=N;i++){
fin>>x[i]>>y[i];
}
fin>>fθ>>fn;
h[0]=x[1]-x[0];
for(i=1;ih[i]=x[i+1]-x[i];
a[i]=h[i-1]∕(h[i-1]+h[i]);b[i]=3*((1-a[i])*(y[i]-y[i-1])∕h[i-1]+a[i]*(y[i+1]-y[i])∕h[i]);
}
m[1]=b[1]-(1-a[1])*f0;
m[N-1]=b[N-1]-a[N-1]*fn;
for(i=2;im[i]=b[i];
}
for(i=1;iB[i]=2;
C[i]=a[i];
}
for(i=2;iA[i]=1-a[i];
}
C[1]=C[1]∕B[1];
m[1]=m[1]∕B[1];
doublet;
for(i=2;i!
=N-2;i++){
t=B[i]-C[i-1]*A[i];
C[i]=C[i]∕t;
m[i]=(m[i]-m[i-1]*A[i])∕t;
}
m[N-1]=(m[N-1]-m[N-2]*A[N-1])∕(B[N-1]-C[N-2]*A[N-1]);
for(i=N-2;i>0;i--){
m[i]=m[i]-C[i]*m[i+1];
}
cout<<"please:
(输入插值节点在"<WhiIe(Cin>>temp){
doublett=temp;
if(tempx[N]){
cout<<"插值节点为"<
Continue;
}
for(i=1;i<=N;i++){
if(temp}
temp=(temp-x[i-1])∕h[i-1];
temp=s3(temp,y[i-1],y[i],m[i-1],m[i],h[i-1]);
cout<<"插值节点为"<
"<}
SyStem("pause");
fin.close();
return0;
}
最小二乘法的直线拟合
#include
#include
#definen5
USingnamespacestd;
doublesum(doublex[],intk){
inti;
doublesum=0;
for(i=0;iSUm=SUm+x[i];
returnsum;
}
doublesum2(doublex[],intk){
inti;
doublesum=0;
for(i=0;iSUm=SUm+x[i]*x[i];
returnsum;
}
doublesumxy(doublex[],doubley[],intk){
inti;
doublesum=0;
for(i=0;iSUm=SUm+x[i]*y[i];
returnsum;
}
intmain(){
ifstreamfin;
fin.open("E:
\\t.txt");
if(!
fin){
cout<<"erroropeninginPUtStream"<SyStem("pause");
return0;
}
doublex[n],y[n],a,b;
doublex0,y0;
inti;
for(i=0;ifin>>x[i]>>y[i];
}
b=(n*sumxy(x,y,n)-sum(x,n)*sum(y,n))∕(n*sum2(x,n)-sum(x,n)*sum(x,n));
a=(sum(y,n)-b*sum(x,n))/n;
cout<<"最小二乘法直线拟合得到a:
"<"<
y="<cout<<"请输入插值节点x:
";
WhiIe(Cin>>xθ){
y0=a+b*x0;
cout<<"当x="<cout<<"请输入插值节点x:
";
}
SyStem("pause");
fin.close();
return0;
}
实验二数值积分
、实验目的
(1)熟悉复化梯形方法、复化SimPSOn方法、梯形递推算法、龙贝格算法;
(2)能编程实现龙贝格算法和中点加速;
(3)理解并掌握自适应算法和收敛加速算法的基本思想;
(4)分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识
二、实验内容
(1)用龙贝格算法计算ISin^dX
LOX
⑵用中点加速方法计算ex的一阶导数
三、基本原理(计算公式)
(1)龙贝格算法
梯形递推公式
hnj
2lf(χkI)
22k卫
加权平均公式:
4T2n-Tn
4-1
4S2n-Sn
42-1
40U
43-1
IfriA-StIaf
bfHT.
*■h2*(Γ∣igftbl
U'-∖r-tTl—
hi≠(hA}+fr¼))k-1
图2.3龙贝格算法流程图
⑵中点加速
中点公式:
G(h)=(f(a+h)-f(a-h))∕2∕h加权平均:
G1(h)=4*G(h∕2)∕3-G(h)∕3
G2(h)=16*G1(h∕2)∕15-G1(h)∕15
G3(h)=64*G2(h∕2)∕63-G2(h)∕63
四、算法设计与实现(流程图,关键点)
中点加速:
输入数据后根据公式计算导数值
图2.2梯形递推算法流程图
五、输入与输出
1SinX
(1)用龙贝格算法计算fdx
0X
输入:
积分区间,误差限
输出:
序列Tn,Sn,Cn,Rn及积分结果⑵用中点加速方法计算ex的一阶导数输入:
求导节点,步长
输出:
求得的导数值,精确值
六、结果讨论和分析
E⅛+≡⅛i⅛∖中点;]口速.exE
代码
龙贝格算法
#inClUdeVioStream>
#include
#include
USingnamespacestd;
doublef(doublex){
if(x==O)return1;
returnSin(x)/x;
}
intmain(){
ifstreamfin;
fin.open("E:
\\t.txt");
if(!
fin){
cout<<"erroropeninginPUtStream"<SyStem("pause");
return0;
}
doublea,b,e,t1,t2,s1,s2,c1,c2,r1,r2;
doublex,h,s;
fin>>a>>b>>e;
cout<<"积分区间为["<cout<<"kT2S2C2R2"<h=b-a;
t1=(f(a)+f(b))*h∕2;
cout<<0<<""<