计算数值方法实验报告材料太原理工大学.docx
- 文档编号:4836583
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:29
- 大小:357.18KB
计算数值方法实验报告材料太原理工大学.docx
《计算数值方法实验报告材料太原理工大学.docx》由会员分享,可在线阅读,更多相关《计算数值方法实验报告材料太原理工大学.docx(29页珍藏版)》请在冰豆网上搜索。
计算数值方法实验报告材料太原理工大学
计算数值方法
实验报告
学院:
软件学院
专业:
软件工程
班级:
软件1012班
学号:
2010004719
姓名:
乔婧峰
太原理工大学学生实验报告
学院名称
软件学院
专业班级
软件1012班
学号
2010004719
学生姓名
乔婧峰
实验日期
2012.4
成绩
课程名称
数值计算方法
实验题目
实验一二分法
一、课题名称
方程求根:
熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。
选择上述方法中的两种方法求方程:
二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5
迭代法:
用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|<0.5×10-5为止。
割线法:
x=x-f(x)/g(x),其中f(x)为给定的函数,g(x)为给定函数的导数,直到满足|x*-xn|<0.5×10-5为止。
二、目的和意义
(1)了解非线性方程求根的常见方法,如二分法、牛顿法、割线法。
(2)加深对方程求根方法的认识,掌握算法。
(3)会进行误差分析,并能对不同方法进行比较。
三、计算公式
f(x)在区间(x,y)上连续
先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
现在假设f(a)<0,f(b)>0,a
①如果f[(a+b)/2]=0,该点就是零点,
如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
中点函数值判断。
如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继续使用
中点函数值判断。
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值
四、主要仪器设备
Vc2008,hp
五、结构程序设计
迭代法:
#include"stdafx.h"
#include"stdio.h"
#include"math.h"
#include"iostream"
usingnamespacestd;
floatmain()
{
floata;
cin>>a;
floatt,x;
x=a;
do{
x=sqrt((10-x*x*x)/4);
t=a;
a=x;
}while(fabs(a-t)>0.5*1e-5);
printf("x=%f",a);
system("pause");
}
割线法:
#include"stdafx.h"
#include"stdio.h"
#include"math.h"
#include"iostream"
usingnamespacestd;
floatmain()
{
floatc,a=1.0,b=2.0;
//cin>>a>>b;
while
(1)
{
c=b-(b*b*b+4*b*b-10)*(b-a)/(b*b*b+4*b*b-(a*a*a+4*a*a));
if(fabs(b-c)<0.5*0.000001)break;
b=c;
}
cout< } 六、结果讨论和分析 割线法: 迭代法: 分析: 使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。 实验地点 ZSA401 指导教师 李志 学院名称 软件学院 专业班级 软件1012班 学号 2010004719 学生姓名 乔婧峰 实验日期 2012.4 成绩 课程名称 数值计算方法 实验题目 实验二线性方程组的直接解法 一、课题名称 线性方程组的直接解法 合理利用Gauss消元法、LU分解法、追赶法求解下列方程组: ① ② ③ ④ (n=5,10,100………) 二、目的和意义 (1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。 (2)加深对线性方程组求解方法的认识,掌握算法。 (3)会进行误差分析,并能对不同方法进行比较。 三、计算公式 高斯分解法: 将原方程组化为三角形方阵的方程组: lik=aik/akk aij=aij-lik*akjk=1,2,…,n-1 i=k+1,k+2,…,nj=k+1,k+2,…,n+1 由回代过程求得原方程组的解: xn=ann+1/ann xk=(akn+1-∑akjxj)/akk(k=n-1,n-2,…,2,1) LU分解法: 将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x. 追赶法: 用来求对角方程组;将系数矩阵A转化为A=L*U,L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x. 四、主要仪器设备 Vc2008,hp 五、结构程序设计 Gauss消元法: #include"stdafx.h" #include"stdio.h" #include"iostream" usingnamespacestd; floatmain() {floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}}; floatx[3]; floatsum=0; intk,i,j; for(k=0;k<2;k++) for(i=k+1;i<3;i++) for(j=k+1;j<4;j++) a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j]; for(i=0;i<3;i++) for(j=0;j<4;j++) printf("a[%d][%d]=%f,",i,j,a[i][j]); cout< x[2]=a[2][3]/a[2][2]; for(k=1;k>=0;k--) {sum=0; for(j=k+1;j<3;j++) { sum+=a[k][j]*x[j]; } x[k]=(a[k][3]-sum)/a[k][k]; } for(i=0;i<3;i++) printf("x[%d]=%f,",i+1,x[i]); } LU分解法: #include"stdafx.h" #include #include #defineL30 doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L]; intmain(){ intn,i,j,k,r; scanf("%d",&n); for(i=1;i<=n;++i){ for(j=1;j<=n;++j){ scanf("%lf",&a[i][j]); } } for(i=1;i<=n;++i){ scanf("%lf",&b[i]); } for(i=1;i<=n;++i) { for(j=1;j<=n;++j) { l[i][j]=0; u[i][j]=0.0; } } for(k=1;k<=n;++k){ for(j=k;j<=n;++j) { u[k][j]=a[k][j]; for(r=1;r { u[k][j]-=l[k][r]*u[r][j]; } } for(i=k+1;i<=n;++i){ l[i][k]=a[i][k]; for(r=1;r l[i][k]-=l[i][r]*u[r][k]; } l[i][k]/=u[k][k];} l[k][k]=1.0; } for(i=1;i<=n;++i){ y[i]=b[i]; for(j=1;j y[i]-=l[i][j]*y[j]; } } for(i=n;i>0;--i){ x[i]=y[i]; for(j=i+1;j<=n;++j){ x[i]-=u[i][j]*x[j]; }x[i]/=u[i][i]; } for(i=1;i<=n;++i){ printf("%0.2lf\n",x[i]); } return0; } 追赶法: #include"stdafx.h" #include"stdio.h" voidmain() { FILE*f; doublea[15],b[15],c[15],d[15]; doublet; inti,n; f=fopen("zgf.txt","r"); fscanf(f,"%d",&n); fscanf(f,"%lf%lf%lf",&b[1],&c[1],&d[1]); for(i=2;i<=n-1;i++) { fscanf(f,"%lf%lf%lf%lf",&a[i],&b[i],&c[i],&d[i]); } fscanf(f,"%lf%lf%lf",&a[n],&b[n],&d[n]); fclose(f); c[1]=c[1]/b[1]; d[1]=d[1]/b[1]; For(i=2;i<=n-1;i++) { t=b[i]-c[i-1]*a[i]; c[i]=c[i]/t; d[i]=(d[i]-d[i-1]*a[i])/t; } d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]); for(i=n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1]; printf("\n********************************\n"); for(i=1;i<=n;i++) printf("d[%2d]=%lf\n",i,d[i]); Zgf.txt文件中的内容是: 5 21-7 121-5 121-5 121-5 12-5 六、结果讨论和分析 Gauss消元法: LU分解法: 追赶法: 分析 从消元过程可以看出,对于n阶线性方程组,只要各步主元素不为零,经过n-1步消元,就可以得到一个等价的系数矩阵为上三角形阵的方程组,然后再利用回代过程可求得原方程组的解. 消元过程相当于分解A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b 回代过程就是解方程组Ux=y。 其中的L为n阶单位下三角阵、U为上三角阵. 在A的LU分解中,L取下三角阵,U取单位上三角阵,这样求解方程组Ax=d的方法称为追赶法. 实验地点 ZSA401 指导教师 李志 学院名称 软件学院 专业班级 软件1012 学号 2010004719 学生姓名 乔婧峰 实验日期 2011.4 成绩 课程名称 数值计算方法 实验题目 实验三线性方程组的迭代解法 一、课题名称 线性方程组的迭代解法 使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。 二、目的和意义 学习使用雅可比迭代法或高斯-赛德尔迭代法 三、计算公式 雅克比迭代法: 设线性方程组 Ax=b 的系数矩阵A可逆且主对角元素a11,a22,…,ann均不为零,令 D=diag(a11,a22,…,ann) 并将A分解成 A=(A-D)+D 从而线性方程组可写成 Dx=(D-A)x+b 则有迭代公式 x(k+1)=B1x(k)+f1 其中,B1=I-D-1A,f1=D-1b。 四、主要仪器设备 Vc2008,hp 五、结构程序设计 高斯-赛德尔迭代法: #include"stdafx.h" #include #include voidmain() { floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2}; floatx[3]={0,0,0},sum1,sum2; inti,j,k,n=3; for(k=0;k<10;k++) {for(i=0;i { sum1=0; sum2=0; for(j=0;j { sum1=sum1+a[i][j]*x[j];} for(j=i+1;j<3;j++) { sum2=sum2+a[i][j]*x[j]; } x[i]=(b[i]-sum1-sum2)/a[i][i]; for(i=0;i {printf("x[%d]=%f,",i+1,x[i]); printf("\n"); } } } 雅克比迭代: #include"stdafx.h" #include #include voidmain() { floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2}; floatx[3]={0,0,0},sum1; inti,j,k,n=3; for(k=0;k<10;k++) { for(i=0;i<3;i++) { sum1=0; for(j=0;j {if(i==j)continue; sum1=sum1+a[i][j]*x[j]; } x[i]=(b[i]-sum1)/a[i][i]; } for(i=0;i {printf("x[%d]=%f,",i+1,x[i]);} printf("\n"); } } 六、实验结果与分析: 高斯-赛德尔迭代法: 雅克比迭代: 分析: 使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。 实验地点 ZSA401 指导教师 李志 学院名称 软件学院 专业班级 软件1012班 学号 2010004719 学生姓名 乔婧峰 实验日期 2011.4 成绩 课程名称 数值计算方法 实验题目 实验四最小二乘法拟合多项式 一、课题名称 (1)了解矩阵特征值与特征向量问题解法,掌握幂法。 (2)加深对矩阵特征值与特征向量问题求解方法的认识,掌握算法。 (3)会进行误差分析。 二、目的和意义 学习使用最小二乘法拟合多项式 三、计算公式 幂法: 由已知的非零向量x0和矩阵A的乘幂构造向量序列{xn}以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。 迭代公式: 结果可取 四、主要仪器设备 Vc2008,hp 五、结构程序设计 五、结果讨论和分析 分析: 幂法是一种求任意矩阵A的按模最大特征值及其对应特征向量的迭代算法。 该方法的最大优点是计算简单,容易在计算机上实现,对稀疏矩阵较为适合,但有时收敛速度很慢。 实验地点 综合楼六层606室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 1111111111 学生姓名 某某 实验日期 2011-6-20 成绩 课程名称 数值计算方法 实验题目 实验五代数插值 一、课题名称 使用拉格朗日插值法或牛顿插值法求解: 已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。 x 0.40 0.55 0.65 0.80 0.90 1.05 f(x) 0.41075 0.57815 0.69675 0.88811 1.02652 1.25386 二、目的和意义 学习使用拉格朗日插值法或牛顿插值法求解 三、计算公式 设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件 Pn(xj)=yj,j=0,1,…,n 令 Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x) 其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足 Ln(xj)=yj,L=0,1,…,n 再由插值多项式的唯一性,得 Pn(x)≡Ln(x) 四、结构程序设计 #include #include #include typedefstructdata { floatx; floaty; }Data;//变量x和函数值y的结构 Datad[20];//最多二十组数据 floatf(ints,intt)//牛顿插值法,用以返回插商 { if(t==s+1) return(d[t].y-d[s].y)/(d[t].x-d[s].x); else return(f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x); } floatNewton(floatx,intcount) { intn; while (1) { cout<<"请输入n值(即n次插值): ";//获得插值次数 cin>>n; if(n<=count-1)//插值次数不得大于count-1次 break; else system("cls"); } floatt=1.0; floaty=d[0].y; floatyt=0.0; for(intj=1;j<=n;j++) { t=(x-d[j-1].x)*t; yt=f(0,j)*t; y=y+yt; } returny; } floatlagrange(floatx,intcount) { floaty=0.0; for(intk=0;k { floatp=1.0;//初始化p for(intj=0;j {//计算p的值 if(k==j)continue;//判定是否为同一个数 p=p*(x-d[j].x)/(d[k].x-d[j].x); } y=y+p*d[k].y;//求和 } returny;//返回y的值 } voidmain() { floatx,y; intcount; while (1) { cout<<"请输入x[i],y[i]的组数,不得超过20组: ";//要求用户输入数据组数 cin>>count; if(count<=20) break;//检查输入的是否合法 system("cls"); } //获得各组数据 for(inti=0;i { cout<<"请输入第"< "; cin>>d[i].x; cout<<"请输入第"< "; cin>>d[i].y; system("cls"); } cout<<"请输入x的值: ";//获得变量x的值 cin>>x; while (1) { intchoice=3; cout<<"请您选择使用哪种插值法计算: "< cout<<"(0): 退出"< cout<<" (1): Lagrange"< cout<<" (2): Newton"< cout<<"输入你的选择: "; cin>>choice;//取得用户的选择项 if(choice==2) { cout<<"你选择了牛顿插值计算方法,其结果为: "; y=Newton(x,count);break;//调用相应的处理函数 } if(choice==1) { cout<<"你选择了拉格朗日插值计算方法,其结果为: "; y=lagrange(x,count);break;//调用相应的处理函数 } if(choice==0) break; system("cls"); cout<<"输入错误! ! ! ! "< } cout< } 五、结果讨论和分析 分析: 拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。 实验地点 综合楼六层606室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 1111111111 学生姓名 某某 实验日期 2011-6-20 成绩 课程名称 数值计算方法 实验题目 实验六最小二乘法拟合多项式 一、课题名称 给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。 xi 0 0.5 0.6 0.7 0.8 0.9 1.0 yi 1 1.75 1.96 2.19 2.44 2.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 数值 方法 实验 报告 材料 太原 理工大学