ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:70.77KB ,
资源ID:10381489      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10381489.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(太原理工大学计算机数值方法实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

太原理工大学计算机数值方法实验报告.docx

1、太原理工大学计算机数值方法实验报告本科实验报告课程名称: 计算机数值方法 实验地点: 专业班级: 学号:学生姓名: 指导教师: 成 绩: 年 月 日太原理工大学学生实验报告学院名称计算机科学与技术学院专业班级学号学生姓名实验日期成绩课程名称计算机数值方法实验题目实验一 方程求根一、实验目的和要求:(1)实验目的: 熟悉使用二分法、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。求方程:f(x)=x*x*x+4*x*x-10=0在1,2内的一个实根,且要求满足精度|x*-xn|0.001(2)实验要求:1.应用C,C+或JAVA编出通用程序,源程序要有详细的注释和说明;2.比较计算结果,对

2、不同方法进行比较分析;3.实验完成,提交实验结果并写出报告,分析计算结果是否符合问题的要求,找出计算成功的原因或计算失败的教训。二、实验内容和原理: (1) 增值寻根法:基本思想为:从初始值x0开始,按规定的一个初始步长h来增值。令x(n+1)=x(n)+h,(n=0,1,2.),同时计算f(x(n+1).在增值过程中会遇到三种情况:1. f(x(n+1))=0,此时x(n+1)即为方程根。2. f(x(n))和f(x(n+1)同号,说明区间内无根。3. f(x(n))和f(x(n+1)同号,说明区间内有根,则把步长缩小,直至满足精度要求为止,x(n)或x(n+1)就是满足精度的近似根。 (2

3、) 二分法:基本思想为:设f(x)在a,b内连续,且f(a)*f(b)0,则方程f(x)=0在(a,b)内有实根x*.然后逐步对分区间a,b,通过判断两端点函数值乘积的符号,进一步缩小有根区间从而求出满足精度要求的近似值。(3) 牛顿迭代法:基本思想为给定一个初始值由牛顿法的迭代公式:x(n+1)=x(n)-f(x(n)/f(x(n) (n=0,1,2.)逐步求出x(n),直至(x(n+1)-x(n))的绝对值小于给定精度,则x(n+1)即可作为近似值。 (4) 双点割线法:由给出的两个初始近似值,再根据双点割线法迭代公式:x(n+1)=x(n)-(f(x(n)/(f(x(n)-f(x(n-1

4、)*(x(n)-x(n-1),(n=1,2,3.)逐步求出x(n),直至x(n+1)-x(n)的绝对值满足精度,则x(n+1)即可作为近似值。 (5) 单点割线法:由给出的两个初始近似值,再根据双点割线法迭代公式:x(n+1)=x(n)-(f(x(n)/(f(x(n)-f(x(0)*(x(n)-x(0),(n=1,2,3.)逐步求出x(n),直至x(n+1)-x(n)的绝对值满足精度,则x(n+1)即可作为近似值。三、主要仪器设备:笔记本电脑 四、操作方法:源代码:(1)增值寻根法: #includedouble fun(double x) /原函数 return(x*x*x+4*x*x-10

5、);/求解方程f(x)=x*x*x+4*x*x-10=0的根,精度为10-3. int main() double a=1.25,h=1,x=a; printf(初始近似值为:%lfn,a); do if(fun(x)=0)printf(根为:%f,x);return 0; /*如果初始值函数值为0,则初始值即为根*/ else if(fun(x)*fun(x+h)0) /*如果fun(x)和fun(x+h)同号则使X加h并跳出本次循环执行下一次*/ x=x+h;continue; else if(fun(x)*fun(x+h)0.001);/当不满足精度要求时继续执行循环体 printf(根

6、为:%fn,x);/跳出循环说明满足精度要求则x可近似作为方程根 return 0;(2)二分法:#include#include#define esp 1e-3 /精度double f(double x) /原函数 return (x*x*x+4*x*x-10);double root(double (*fun)(double),double left,double right,double deviation)/用二分法求方程根 /其中形参*fun为指向原函数的指针 double x,y; while(fabs(right-left)deviation)/当不满足精度要求继续执行循环体 x

7、=(right+left)/2; /求出中点的横坐标 y=fun(x); /计算中点的函数值 if(y=0)return x; /如果中点函数值等于0则中点即为所求根 if(y0)right=x; /若中点函数值大于0则令其为区间右终点值 else left=x; /否则令其为左端点值 return(right+left)/2; /以中点值作为最终近似值int main() double a,b; printf(请输入区间左右端点值:n); scanf(%lf%lf,&a,&b); printf(近似根为%lfn,root(f,1,2,esp); return 0;(3)牛顿迭代法:#incl

8、ude#includedouble f1(double x) /原函数 return x*x*x+4*x*x-10;double f2(double x) /导函数 return 3*x*x+8*x;double newton(double x0,double e) double x1; do x1=x0; /按牛顿迭代公式Xn+1=Xn-(f1(Xn)/f2(Xn)求解 x0=x1-f1(x1)/f2(x1); while(fabs(x0-x1)e); /当不满足精度要求时继续执行循环体 return x0; /满足精度要求时返回Xn+1的值int main() double x0=1.5;

9、/初始近似值 double e=pow(10,-3); /精度 printf(初始近似值为:%lfn,x0); printf(近似根为:%lfn,newton(x0,e); return 0;(4)双点割线法:# include # include #define esp 10e-3 /精度 double f(double x) /原函数 return(x*x*x+4*x*x-10); double fun(double x0,double x1) /双点割线法求近似根 double x; int i=0; while(fabs(x1-x0)esp) /当不满足精度要求继续执行循环体 x=x1

10、-f(x1)*(x1-x0)/(f(x1)-f(x0); x0=x1; x1=x; i+; /达到精度要求后跳出循环 printf(执行循环次数为 i=%dn,i); return (x1); /返回最终近似根main () double m,n,result; printf(请输入两个双精度初始近似值 m n: n); /输入两个双精度初始近似值 scanf(%lf%lf,&m,&n); result=fun(m,n); printf(result=%lfn,result);/输出最后结果,保留四位小数(5)单点割线法:# include # include #define esp 5*(1

11、0e-3) /精度 double f(double x) /原函数 return(x*x*x-3*x-1); double fun(double x0,double x1) /单点割线法求近似根 double x; int i=0; while(fabs(x1-x0)esp) /当不满足精度要求继续执行循环体 x=x1-f(x1)*(x1-x0)/(f(x1)-f(x0); x1=x; i+; /达到精度要求后跳出循环 printf(执行循环次数为 i=%dn,i); return (x1); /返回最终近似根main () double m,n,result; printf(please i

12、nput m n: n); /输入两个双精度初始近似值 scanf(%lf%lf,&m,&n); result=fun(m,n); printf(result=%.4fn,result);/输出最后结果,保留四位小数五、实验结果: 程序运行结果:(1)增值寻根法:初始近似值为:1.250000根为:1.360000Press any key to continue(2)二分法:请输入区间左右端点值:1 2近似根为1.364746Press any key to continue (3)牛顿迭代法:初始近似值为:1.500000近似根为:1.365230Press any key to cont

13、inue(4) 双点割线法:请输入两个双精度初始近似值 m n:1 2执行循环次数为 i=4result=1.365212Press any key to continue(5)单点割线法:please input m n:1 2执行循环次数为 i=15result=1.365200Process returned 14 (0xE) execution time : 4.411 sPress any key to continue. 六、结果分析: (1)通过对不同方法比较可知,收敛速度:牛顿迭代法双点割线法 单点割线法,二分法和增值寻根法的收敛速度就相对较慢,且结果相对前三种方法较不精确。(

14、2)但二分法和增值寻根法的优点是简单,对f(x)只要求连续,局限性是只能用于求实根,不能求复根及偶数重根。(3)牛顿法则收敛很快,而且可求复根,缺点是对重根收敛较慢,要求函数一阶导数存在。(4)割线法省去了牛顿法求函数导数过程,简化了计算步骤,且收敛速度也较快,其中双点割线法比单点割线法收敛速度快。 七、心得体会: 本次实验内容较为简单,最主要的是要学会将数学方法转变为程序上机实现,同时要学会对不同方法进行比较,确定时间复杂度最小的算法。 实验地点指导教师 太原理工大学学生实验报告学院名称计算机科学与技术学院专业班级学号学生姓名实验日期成绩课程名称计算机数值方法实验题目实验二 线性方程组的直接

15、求解法一、实验目的和要求:(1)实验目的:合理利用Gauss消元法、LU分解法求解下列方程组:0.001X1+2.000X2+3.000X3=1.000-1.000X1+3.712X2+4.623X3=2.000-2.000X1+1.072X2+5.643X3=3.000(2)实验要求:1.应用C,C+或JAVA编出通用程序,源程序要有详细的注释和说明;2.比较计算结果,对不同方法进行比较分析;3.实验完成,提交实验结果并写出报告,分析计算结果是否符合问题的要求,找出计算成功的原因或计算失败的教训。二、实验内容和原理:(1)Gauss消元法:基本思想为:对于n阶线性方程组,只要各步主元素不为0

16、,经过n-1步消元,就可以得到一个等价的的系数矩阵为上三角形矩阵的方程组,然后再利用回代过程即可求得原方程的解。时间复杂度约为O(n3)。(2)Gauss列主元素消元法:基本思想:在用高斯消元法求解方程组时,用作除法的小主元素可能使舍入误差增加,因此需要考虑依次按列选主元素,然后换行使之变到主元素位置上,再进行消元计算。(3)Gauss完全主元素消元法:基本思想:首先在系数矩阵A中选取绝对值最大的元素作为主元素,然后交换相应行和列,进行高斯消元,其次在A(1)的2n行及2n列选取主元素进行消元,依次进行下去。(4)LU分解法:当系数矩阵A满足顺序主子式不为0时,可将A分解为为一个单位下三角矩阵

17、L和一个上三角矩阵U的乘积,且分解唯一,然后方程式变为Ly=b,Ux=y,接着先求y,再求出x。三、主要仪器设备:笔记本电脑四、操作方法:(1)Gauss消元法: 源代码:/*矩阵A用于存放线性方程组的增广矩阵,向量X表示线性方程组的解,例题为P43例2*/#include#includeint main() double m,p,A1010,X10; int n,i,j,k,q; char c; printf(请输入方程的阶数(小于等于8):n); scanf(%d,&n); for(i=1;i=n;i+)/方便起见从A11开始存入数据 printf(请输入增广矩阵第%d行:n,i); fo

18、r(j=1;j=n+1;j+) scanf(%lf,&Aij); /for for(i=1;in;i+) m=fabs(Aii);j=i; /m表示矩阵第i列中的最大值,j用来标记最大值所在的行数 for(k=i+1;km) m=fabs(Aki);j=k;/易错 /for for(q=i;q=n+1;q+)/交换第i行和第j行 p=Aiq; Aiq=Ajq; Ajq=p; /for /*消去过程* for(k=i+1;k=n;k+) m=-Aki/Aii; for(j=i;j=1;i-) p=0.0; for(j=i+1;j=n;j+) p=p+Aij*Xj; Xi=(Ain+1-p)/Ai

19、i; /for printf(线性方程组的解为:n); for(i=1;i=n;i+) printf(x%d=%lfn,i,Xi); c=getchar(); return 0;(2)Gauss列主元素消元法: 源代码:/*矩阵A用于存放线性方程组的增广矩阵,向量X表示线性方程组的解,例题为P43例2*/#include#includeint main() double m,p,A1010,X10; int n,i,j,k,q; char c; printf(请输入方程的阶数(小于等于8):n); scanf(%d,&n); for(i=1;i=n;i+)/方便起见从A11开始存入数据 pri

20、ntf(请输入增广矩阵第%d行:n,i); for(j=1;j=n+1;j+) scanf(%lf,&Aij); /for for(i=1;in;i+) m=fabs(Aii);j=i; /m表示矩阵第i列中的最大值,j用来标记最大值所在的行数 for(k=i+1;km) m=fabs(Aki);j=k;/易错 /for for(q=i;q=n+1;q+)/交换第i行和第j行 p=Aiq; Aiq=Ajq; Ajq=p; /for /*消去过程* for(k=i+1;k=n;k+) m=-Aki/Aii; for(j=i;j=1;i-) p=0.0; for(j=i+1;j=n;j+) p=p

21、+Aij*Xj; Xi=(Ain+1-p)/Aii; /for printf(线性方程组的解为:n); for(i=1;i=n;i+) printf(x%d=%.3lfn,i,Xi); c=getchar(); return 0;(3)Gauss完全主元素消元法: 源代码:/*矩阵A用于存放线性方程组的增广矩阵,向量X表示线性方程组的解*/#include#includeint main() double m,p,A1010,X10; int n,i,j,k,q,l,c,w; char a; printf(请输入方程的阶数(小于等于8):n); scanf(%d,&n); for(i=1;i=

22、n;i+)/方便起见从A11开始存入数据 printf(请输入增广矩阵第%d行:n,i); for(j=1;j=n+1;j+) scanf(%lf,&Aij); /for for(i=1;in;i+) m=fabs(Aii);j=i;l=i; /m表示矩阵第i列中的最大值,j用来标记最大值所在的行数,l用来标记最大值所在的列数 for(k=i;k=n;k+) for(c=i;cm) m=fabs(Akc);j=k;l=c;/易错,忘加fabs for(q=i;q=n+1;q+)/交换第i行和第j行 p=Aiq; Aiq=Ajq; Ajq=p; /for for(w=i;w=n;w+)/交换第i

23、列与第c列 p=Awi; Awi=Awc; Awc=p; /*消去过程* for(k=i+1;k=n;k+) m=-Aki/Aii; for(j=i;j=1;i-) p=0.0; for(j=i+1;j=n;j+) p=p+Aij*Xj; Xi=(Ain+1-p)/Aii; /for printf(线性方程组的解为:n); for(i=1;i=n;i+) printf(x%d=%lfn,i,Xi); a=getchar(); return 0;(4)LU分解法: 源代码:#include#includeint main() double p,A1212,x12,L1212,R1212,b12,

24、y12; int n,i,j,k,m; printf(请输入方程组的阶数(小于等于10):n); scanf(%d,&n); for(i=1;i=n;i+) printf(请输入系数矩阵的第%d行:n,i); for(j=1;j=n;j+) scanf(%lf,&Aij); /for printf(请输入右端向量b:n); for(i=1;i=n;i+) scanf(%lf,&bi); for(j=1;j=n;j+) R1j=A1j;/上三角矩阵R的第一行为A的第一行 for(i=2;i=n;i+) Li1=Ai1/R11;/求出L的第一列 for(k=2;k=n-1;k+) for(j=k;j=n;j+) p=0.0; for(m=1;m=k-1;m+) p=p+Lkm*Rmj; Rkj=Akj-p; /for for(i=k+1;i=n;i+) p=0.0; for(m=1;m=k-1;m+) p=p+Lim*Rmk; Lik=(Aik-p)/Rkk; /for /for p=0.0; for(j=1;j=n-1;j+)/求Rnn p=p+Lnj*Rjn; Rnn=Ann-p; y1=b1;/回代过程求y for(k=2;k=n;k+) p=0.0

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1