计算数值方法实验报告太原理工大学.docx
- 文档编号:11885101
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:22
- 大小:194.70KB
计算数值方法实验报告太原理工大学.docx
《计算数值方法实验报告太原理工大学.docx》由会员分享,可在线阅读,更多相关《计算数值方法实验报告太原理工大学.docx(22页珍藏版)》请在冰豆网上搜索。
计算数值方法实验报告太原理工大学
计算数值方法
实验报告
学院:
计算机与软件学院
专业:
计算机与科学技术
班级:
计算机
学号:
11
姓名:
某某
太原理工大学学生实验报告
学院名称
计算机科学与技术
专业班级
计算机
学号
11
学生姓名
某某
实验日期
2011-6-13
成绩
课程名称
数值计算方法
实验题目
实验一二分法
一、课题名称
方程求根:
熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。
选择上述方法中的两种方法求方程:
二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<×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)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值
四、结构程序设计
#include
#include
usingnamespacestd;
doublef(doublex)
{
returnx*x*x+4*x*x-10;
}
intmain()
{
doublet1=1,t2=2;
doublet=(t1+t2)/2;
while(fabs(f(t))>=2/1000)
{
if(f(t1)*f(t)<=0)
{
t2=t;
t=(t1+t2)/2;
}
elseif(f(t)*f(t2)<=0)
{
t1=t;
t=(t1+t2)/2;
}
}
cout< return1; } 结果: 五、结果讨论和分析 在编写这个程序的时候我感觉到了在编写的过程中的不易,在编写的过程中我改变初值然后运行,发现在初值的改变对运行时间的影响不大,结果没有影响。 在调试的过程中发现自己还是很粗心,容易犯很简单的错误。 在今后的学习中应该做编写程序。 实验地点 综合楼六层606室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 11 学生姓名 某某 实验日期 2011-6-13 成绩 课程名称 数值计算方法 实验题目 实验二线性方程组的直接解法 一、课题名称 线性方程组的直接解法 合理利用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) 五、结构程序设计 #include"" doublea[15][15],a0[15][15]; doubleb[15],b0[15],l[15]; intn; voiddisplayA() { printf("\n"); for(intj=1;j<=n;j++) { for(inti=1;i<=n;i++) printf("a[%d][%d]=%f",j,i,a[j][i]); printf("b[%d]=%f\n",j,b[j]); } for(intm=1;m<=n;m++) printf("l[%d]=%f",m,l[m]); printf("\n"); } intmain() { FILE*f; inti,j,k; f=fopen("","r"); fscanf(f,"%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { fscanf(f,"%lf",&a[i][j]); a0[i][j]=a[i][j]; } fscanf(f,"%lf",&b[i]); b0[i]=b[i]; } displayA(); fclose(f); k=1; do { for(i=1;i<=n;i++) { if(i==k)continue; l[i]=a0[i][k]/a0[k][k]; } for(j=k+1;j<=n;j++)a[k][j]=a0[k][j]/a0[k][k]; b[k]=b0[k]/a0[k][k]; for(i=1;i<=n;i++) { if(i==k)continue; for(j=k+1;j<=n;j++) a[i][j]=a0[i][j]-l[i]*a0[k][j]; b[i]=b0[i]-l[i]*b0[k]; } displayA(); for(i=1;i<=n;i++) { for(j=k+1;j<=n;j++) a0[i][j]=a[i][j]; b0[i]=b[i]; } if(k==n)break; k++; }while (1); for(i=1;i<=n;i++) printf("b[%2d]=%lf\n",i,b[i]); getchar(); } 六、结果讨论和分析 第一题答案: 第二题答案: 第三题答案: 在编写这个程序的时候我感觉到了在编写的过程中的不易,在编写的过程中我改变初值然后运行,发现在初值的改变对运行时间的影响不大,结果没有影响。 在调试的过程中发现自己还是很粗心,容易犯很简单的错误。 在今后的学习中应该做编写程序。 实验地点 综合楼六层606室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 11 学生姓名 某某 实验日期 2011-6-13 成绩 课程名称 数值计算方法 实验题目 实验三线性方程组的迭代解法 一、 课题名称 线性方程组的迭代解法 使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。 二、目的和意义 学习使用雅可比迭代法或高斯-赛德尔迭代法 三、计算公式 雅克比迭代法: 设线性方程组 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。 四、结构程序设计 /雅可比 #include #include #include usingnamespacestd; #defineM100/*最大允许的迭代次数*/ doublefanshu(double*p,intn)/*求向量无穷范数的函数*/ { doublen1; inti; n1=fabs(p[0]); for(i=1;i { if(fabs(p[i])>n1) n1=fabs(p[i]); } return(n1); } voidjac(double**s,double*g,intsize,doubleeps)/*雅可比迭代函数*/ { inti,j,k; double**b,*x0,*x1,*x1_x0,n2,t;/*b用来表示迭代矩阵,x1_x0表示迭代前后向量x0与x1的差向量*/ b=newdouble*[size];/*动态分配二维数组*/ for(i=0;i b[i]=newdouble[size]; for(i=0;i for(j=0;j b[i][j]=0; x0=newdouble[size];/*动态分配一维数组*/ x1=newdouble[size]; x1_x0=newdouble[size]; for(i=0;i { g[i]=g[i]/s[i][i]; for(j=0;j { if(i==j) continue; b[i][j]=-s[i][j]/s[i][i]; } } for(i=0;i { x0[i]=0; x1[i]=1; x1_x0[i]=x1[i]-x0[i]; } k=0; n2=fanshu(x1_x0,size);/*求差向量的无穷范数*/ while((n2>=eps)&&(k { for(i=0;i x0[i]=x1[i]; for(i=0;i { t=0; for(j=0;j t=t+b[i][j]*x0[j]; x1[i]=t+g[i]; x1_x0[i]=x1[i]-x0[i]; } n2=fanshu(x1_x0,size);/*求差向量的无穷范数*/ k++;/*k用于记录累加的次数*/ } for(i=0;i cout< cout<<"迭代了"< } intmain() { double**s,*a,eps; intsize,m,l; cout<<"输入精度: "< cin>>eps; cout<<"输入方程解数: "< cin>>size; a=newdouble[size];/*动态分配二维数组*/ s=newdouble*[size]; for(l=0;l s[l]=newdouble[size]; cout<<"输入要矩阵"< for(l=0;l for(m=0;m cin>>s[l][m]; cout<<"输入系数矩阵"< for(l=0;l cin>>a[l]; cout<<"diaoyongyakebihanshu"< jac(s,a,size,eps); return0; } 五、结果讨论和分析 分析: 雅克比迭代公式简单,每迭代一次只须计算一次矩阵和向量的乘法。 在计算机运算时需要两组存储单元,以存放x(k)及x(k+1)。 实验地点 综合楼六层606室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 11 学生姓名 某某 实验日期 2011-6-20 成绩 课程名称 数值计算方法 实验题目 实验四最小二乘法拟合多项式 一、课题名称 (1)了解矩阵特征值与特征向量问题解法,掌握幂法。 (2)加深对矩阵特征值与特征向量问题求解方法的认识,掌握算法。 (3)会进行误差分析。 二、目的和意义 学习使用最小二乘法拟合多项式 三、计算公式 幂法: 由已知的非零向量x0和矩阵A的乘幂构造向量序列{xn}以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。 迭代公式: 结果可取 四、结构程序设计 #include #include constintN(3); usingnamespacestd; voidmatrixx(doubleA[N][N],doublex[N],doubley[N]) { 2011-6-20 0l1l-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次插值): ";; floatyt=; 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=; for(intk=0;k } y=y+p*d[k].y;; 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室 指导教师 王峥 学院名称 计算机科学与技术 专业班级 计算机 学号 11 学生姓名 某某 实验日期 2011-6-20 成绩 课程名称 数值计算方法 实验题目 实验六最小二乘法拟合多项式 一、课题名称 给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。 xi 0 yi 1 二、目的和意义 1.熟练运用已学计算方法求解方程组 2.加深对计算方法技巧,选择正确的计算方法来求解各种方程组 3.培养使用电子计算机进行科学计算和解决问题的能力 三、计算公式 建立正规方程组: ∑(∑xij+k)ak=∑xijyi,j=0,1,…,n 平方误差: I=∑(∑akxik-yi)2 四、结构程序设计 #include<> #include<> #defineN15 doublepower(double&a,intn) { doubleb=1; for(inti=0;i b*=a; returnb; } voidGauss(); doubleX[N],Y[N],sumX[N],sumY[N],a[N][N],b[N],l[N][N],x[N]; voidmain() { ofstreamoutdata; ifstreamindata; doubles; inti,j,k,n,index; cout<<"请输入已知点的个数n="; cin>>n; cout< cout<<"请输入X和Y: "< for(i=0;i { cout<<"X["< cin>>X[i]; sumX[1]+=X[i]; cout<<"Y["< cin>>Y[i]; sumY[1]+=Y[i]; cout< } cout<<"sumX[1]="< cout<<"请输入拟合次数index="; cin>>index; cout< i=n; sumX[0]=i; for(i=2;i<=2*index;i++) { sumX[i]=0; for(j=0;j sumX[i]+=power(X[j],i); cout<<"sumX["< } for(i=2;i<=index+1;i++) { sumY[i]=0; for(j=0;j sumY[i]+=power(X[j],i-1)*Y[j]; cout<<"sumY["< } for(i=1;i<=index+1;i++) {//建立正规方程组 for(j=1;j<=index+1;j++) a[i][j]=sumX[i+j-2]; b[i]=sumY[i]; } k=1;//用高斯消元法解方程组 do{ for(j=k+1;j<=index+1;j++)l[j][k]=a[j][k]/a[k][k]; for(i=k+1;i<=index+1;i++){ for(j=k+1;j<=index+1;j++) a[i][j]=a[i][j]-l[i][k]*a[k][j]; b[i]=b[i]-l[i][k]*b[k]; } if(k==index+1)break; k++; }while (1); x[index+1]=b[index+1]/a[index+1][index+1]; for(i=index;i>=1;i--) { s=0; for(j=i+1;j<=index+1;j++) s=s+a[i][j]*x[j]; x[i]=(b[i]-s)/a[i][i]; } cout<<"拟合系数为: ";//输出拟合系数 for(i=1;i<=index+1;i++) cout< doublem=0; cout< "; for(i=0;i { doublet=x[1]+x[2]*X[i]-Y[i]; m=m+power(t,2); } cout< } 五、结果讨论和分析 分析: 数据拟合的具体作法是: 对给定的数据(xi,yi)(i=0,1,…,m),在取定的函数类中,求p(x)属于此函数类,使误差ri=p(xi)-yi(i=0,1,…,m)的平方和最小,即 ∑ri2=∑(∑p(xi)-yi)2=min 从几何意义上讲,就是寻求与给定点(xi,yi)(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。 实验地点 综合楼六层606室 指导教师 王峥
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 数值 方法 实验 报告 太原 理工大学