数值分析实验误差分析.docx
《数值分析实验误差分析.docx》由会员分享,可在线阅读,更多相关《数值分析实验误差分析.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析实验误差分析
实验报告
课程名称数值分析实验
实验项目误差分析
专业班级姓名学号
指导教师成绩日期
、实验目的
1•了解误差分析对数值计算的重要性。
2•掌握避免或减小误差的基本方法。
、实验设备
安装有C、C++或MATLAB的计算机。
三、实验原理
根据不同的算法,得到的结果的精度是不一样的。
四、实验内容步骤
求方程ax2+bx+c=0的根,其中a=1,b=-(5x108+1),c=5x108
采用如下两种计算方案,在计算机上编程计算,将计算结果记录下来,并分析产生误差的原因。
方案一:
.bWb2-4ac
x1-
2a
万案一:
bsgn(b)b2-4ac
2a
要求:
编写程序实现该算法;调试程序,检查输出结果。
五、实验结果及分析
x2=(-b-sqrt(q))/2;
x3=-(b-sqrt(q))/2;x4=c/x1;
printf("%f\n",x1);
printf("%f\n",x2);
printf("%f\n",x3);
printf("%f\n",x4);
}
佛山科学技术学院
实验报告
课程名称数值分析实验
实验项目Lagrange插值
专业班级09计算机科学与技术2班姓名张国烽学号2009314215指导教师成绩日期
一、实验目的
1.掌握利用Lagrange插值法及Newton插值法求函数值并编程实现。
2•程序具有一定的通用性,程序运行时先输入节点的个数n,然后输入各节点的值(xi,yi),最后输
入要求的自变量x的值,输出对应的函数值。
二、实验设备
安装有C、C++或MATLAB的计算机。
三、实验原理
1.插值的基本原理(求解插值问题的基本思路)
构造一个函数y=f(x)通过全部节点,即f(x」二%(i=0、仁…n)再用f(x)计算插值,即y*=f(x*)
2.拉格朗日(Lagrange)多项式插值
Lagrange插值多项式:
Ln(x)=anxn-an1xn丄讦’"理
n
7yh(x)
i卫
](X)=(x—Xo)…(X—Xi」)(X—XiJ…(X—Xn)
(xi—x0)■…(xi—xi」)(xi—Xi申)…(xi—Xn)
3.牛顿(Newton)插值公式
Nn(X)-f(Xo)flXo’xKX-X。
)flXo^xKX-XoXX-Xj
flXo’Xj‘XnKX—XoXX—Xj(X—Xn」)
四、实验内容步骤
1•给定sin1T=0.190809,sin12-0.207912.sin13‘=0.224951,构造Lagrange插值函数计
算sinll30'。
2.已知4个点的函数值如下表,用Newton插值法求x=0.596时的函数值。
i
0
1
2
3
Xi
0.40
0.55
0.65
0.80
yi
0.41075
0.57815
0.69675
0.88811
五、实验结果及分析
1.拉格朗日插值
2
110A90809
12阿.207912
130-224951fll.5
resuit=0-199369
请按任意键继续…・
2.牛顿插值
3.596
P.40R.41075
0.57815
h.650.&9G75
0.800.B8911result^0・631914
请按任意键继续•■・
六、思考题
(无)
七、心得体会及实验改进建议
明白了跟多编写
通过这次实验我对拉格朗日插值和牛顿插值的原理的认识变得更加的深刻,此程序时要注意的问题。
八、实验代码
#include
#include
#include
#defineMax100
usingnamespacestd;
floatxi[Max],yi[Max],value_x;
intn;
floatfenzi[Max],fenmu[Max][Max];
voidgetdata()
{
cin»n;
for(inti=0;i{
cin>>xi[i]>>yi[i];
}
cin>>value_x;
}
voidinit(),
{
inti,j;
for(i=0;i{
fenzi[i]=value_x-xi[i];
}
for(i=0;i{
for(j=0;j{
fenmu[i][j]=xi[i]-xi[j];
}
voidresult()
{
floatsum=1,result=0;
for(intk=0;k{
sum=1;
for(intj=0;j{
if(j==k)continue;sum*=fenzi[j]/fenmu[k][j];
}
sum*=yi[k];
result+=sum;
}
//printf("result=%lf\n",result);
cout<<"result="<}
intmain()
{
getdata();
init();
result();
system("pause");
return0;
}
佛山科学技术学院
实验报告
课程名称数值分析实验
实验项目高斯消去法解方程
专业班级09计算机科学与技术2班姓名张国烽学号2009314215指导教师成绩日期
、实验目的
1•掌握求解线性方程组的高斯消去法---列选主元在计算机上的算法实现。
2•程序具有一定的通用性,程序运行时先输入一个数n表示方程含有的未知数个数,然后输入每个线性方
程的系数和常数,求出线性方程组的解。
二、实验设备
安装有C、C++或MATLAB的计算机。
三、实验原理
1.高斯消去法基本思路
设有方程组Ax=b,设A是可逆矩阵。
高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增
广矩阵B-lA;b1,将其中的A变换成一个上三角矩阵,然后求解这个三角形方程组。
2•列主元高斯消去法计算步骤
将方程组用增广矩阵B丄“⑴彳)表示。
步骤1:
消元过程,对k=1,2川|,n-1
(1)选主元,找iklk,k1,川,n?
使得
(2)如果aik,k=0,则矩阵A奇异,程序结束;否则执行(3)。
(3)如果ik=k,则交换第k行与第ik行对应元素位置,akj「aikj,j-k^l,nJ。
(4)消元,对i=k,|||,n,计算lik二ak/akk,对j=k1川,n1,计算
aij-aij-likakj.
步骤2:
回代过程:
(1)若ann=°,则矩阵奇异,程序结束;否则执行
(2)。
小fn〕
(2)xn=an,n+/ann;对i=n-1」|1,2,1,计算X=’耳,佔一Ea^Xj/Qi
Ij#丿
四、实验内容步骤
利用列选主元高斯消去法求解线性方程组
0.101X,2.304x23.555x^1.183
’—1.347X,+3.712x2+4.623x3=2.137
—2.835X!
+1.072x2+5.643x3=3.035
五、实验结果及分析
'C:
\Us?
rs\Adminittrator\Deskto叭刚新建丈'牛夹■{M)\Debug'^us^i.e^e'
0=0.333333x1=7.33333x2=2.33333
0—M.39823丐)cL二匹.0137?
51x2-0.335丄44ressa.nykeptoCioratinue_
第一组数据为:
x0=0.333333x1=7.33333x2=2.33333
第二组数据为:
x0=0.398234x1=0.0137951x2=0.335144
六、思考题
七、心得体会及实验改进建议
本次实验因为对高斯消去法基本思路的认识不够深刻,使我在实验中遇到了非常多的小错误,所
以修改程序占用了很多的时间。
经过和同学的讨论,知道实验步骤一的消元过程存在着错误。
八、实验代码
#include
#include
#inelude
usingnamespacestd;
//高斯消去法
voidGauss(floata[3][4]);
voidshowarray(floata[3][4]);
constintn=3;
voidmain()
{
inti,j;
intn;〃行数
//printf("请输入行数\n");
//printf("n=");
//scanf("%d",&n);
floata[3][4]={{2,1,-3,1},{4,1,-2,4},{3,1,-1,6}};
float
b[3][4]={{0.101,2.304,3.555,1.183},{-1.347,3.712,4.623,2.137},{-2.835,1.072,5.643,3.035}};
Gauss(a);
Gauss(b);
}
voidGauss(floata[n][n+1])
{
intmax=0;
inti,j,k;
floatb[n+1];〃临时
floatc[n+1];//
floatx[n];〃求解的x集合
floattemp;
intcouts=0;
//showarray(a);
for(j=0;j{
max=j;
i=j;
//选主元素
for(;i{if(abs(a[i][j])>abs(a[max][j])){max=i;}
}
//交换
i=j;
for(;i{
temp=a[max][i];a[max][i]=a[j][i];a[j][i]=temp;
c[i]=temp;〃保存首行信息
}
//消去l=aik/akk
k=j;
while(ki=j;
b[0]=a[k+1][j];//保留第一个系数防止后面破坏
for(;i{
//b[1]=b[0]*c[i]/a[j][j];a[k+1][i]=b[0]*c[i]/a[j][j]-a[k+1][i];
}
k=k+1;
}
}
//求解
for(i=0;i{
x[i]=0;
}
floatsum=0;
for(i=n-1;i>=0;i--)
{
for(j=i+1;jLsum=sum+a[i][j]*x[j];
}
x[i]=(a[i][n]-sum)/(a[i][i]);sum=0;
}
//showarray(a);
for(i=0;i{
cout}cout«endl;
}
voidshowarray(floata[n][n+1])
{
inti,j;
for(i=0;ifor(j=0;j{
cout{
cout«endl;
}
}
}