数值计算方法实验课
- 格式:doc
- 大小:320.50 KB
- 文档页数:25
本科实验报告课程名称:数值计算方法实验地点:计算机科学与技术学院506 专业班级:学号:学生姓名:指导教师:**年月日太原理工大学学生实验报告}printf("%f\n",c);}五、实验结果与分析二分法割线法分析:使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。
并且割线法程序代码量较少,精简明了。
六、讨论、心得本次数值计算方法程序设计实验是在不断的习题练习中跳脱出来,直接面对实用性较强的程序代码编写。
效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力。
将理论成功地转化成实践结果。
实验地点北区多学科综合楼4506指导教师王峥太原理工大学学生实验报告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]);}return 0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素。
即,为了节约内存及时效,可以不必计算出主元素下方数据。
列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。
列主元素消元法的耗时比完全主元素法少很多,常采用之。
对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。
其中的L为n阶单位下三角阵、U为上三角阵.六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间。
纠正各种语法、算法、思路错误。
最后勉强成功,但还是有几处警告,不得解决之法。
数值计算方法实验报告一、实验介绍本次实验是关于数值计算方法的实验,旨在通过计算机模拟的方法,实现对于数值计算方法的掌握。
本次实验主要涉及到的内容包括数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等。
二、实验内容1. 数值微积分数值微积分是通过计算机模拟的方法,实现对于微积分中的积分运算的近似求解。
本次实验中,我们将会使用梯形公式和辛普森公式对于一定区间上的函数进行积分求解,并比较不同公式的计算误差。
2. 线性方程组的求解线性方程组求解是数值计算领域中的重要内容。
本次实验中,我们将会使用高斯消元法、LU分解法等方法对于给定的线性方程组进行求解,并通过比较不同方法的计算效率和精度,进一步了解不同方法的优缺点。
3. 插值与拟合插值与拟合是数值计算中的另一个重要内容。
本次实验中,我们将会使用拉格朗日插值法和牛顿插值法对于给定的数据进行插值求解,并使用最小二乘法对于给定的函数进行拟合求解。
4. 常微分方程的数值解常微分方程的数值解是数值计算中的难点之一。
本次实验中,我们将会使用欧拉法和龙格-库塔法等方法对于给定的常微分方程进行数值解的求解,并比较不同方法的计算精度和效率。
三、实验结果通过本次实验,我们进一步加深了对于数值计算方法的理解和掌握。
在数值微积分方面,我们发现梯形公式和辛普森公式都能够有效地求解积分,但是辛普森公式的计算精度更高。
在线性方程组求解方面,我们发现LU分解法相对于高斯消元法具有更高的计算效率和更好的数值精度。
在插值与拟合方面,我们发现拉格朗日插值法和牛顿插值法都能够有效地进行插值求解,而最小二乘法则可以更好地进行函数拟合求解。
在常微分方程的数值解方面,我们发现欧拉法和龙格-库塔法都能够有效地进行数值解的求解,但是龙格-库塔法的数值精度更高。
四、实验总结本次实验通过对于数值计算方法的模拟实现,进一步加深了我们对于数值计算方法的理解和掌握。
在实验过程中,我们了解了数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等多个方面的内容,在实践中进一步明确了不同方法的特点和优缺点,并可以通过比较不同方法的计算效率和数值精度来选择合适的数值计算方法。
实验报告一、实验目的二、实验内容三、实验环境四.实验方法五、实验过程1实验步骤2 关键代码及其解释3 调试过程六、实验总结1.遇到的问题及解决过程2.产生的错误及原因分析3.体会和收获。
七、程序源代码:八、教师评语实验报告一.试验目的:练习用数值方法求解给定的非线性方程。
二.实验内容:求解人口方程: )1(5.43e 1004.156-+=λλλe要求误差小于410-。
三.实验环境:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法:牛顿法牛顿法简述:牛顿法是一种特殊的迭代法,其迭代公式为:,2,1,0,)()(1='-=+k x f x f x x k k k k ,当数列{}k x 收敛时,其极限值x 即为方程的解。
定理:给定方程],[,0)(b a x x f ∈=1)设0)()(<b f a f ;2))(x f ''在],[b a 上不变号,且],[,0)(b a x x f ∈≠'; 3)选取],[0b a x ∈,满足0)()(00>''x f x f ;则牛顿法产生的序列{}k x 收敛于0)(=x f 在],[b a 内的唯一解x 。
五.实验过程:1.编程: 用C 语言编出牛顿法的源程序。
2. 开机, 打开C 语言编译程序,键入所编程序源代码.3. 调试程序, 修改错误至能正确运行.六.实验总结:(1)牛顿法收敛速度快,但初值不容易确定,往往由于初值取得不当而使迭代不收敛或收敛慢,但若能保证)()(1+>K K x f x f (称为下山条件),则有可能收敛。
把新的近似值看作初值的话会比原来的取得好,有可能落入局部收敛的邻域。
(2)牛顿法要求)(x f '在x 附近不为零。
亦即x 只能是单根, 不能求重根。
可用重根加速收敛法求重根。
(3)牛顿法的每一步迭代中,都要计算一次导数值,若计算)(x f '比计算函数的近似值要麻烦的多。
数值计算方法实验报告实验目的:通过实验验证不同数值计算方法在求解数学问题时的精度和效率,并分析其优缺点。
实验原理:实验内容:本实验选取了三个典型的数值计算问题,并分别采用了二分法、牛顿迭代法和梯度下降法进行求解。
具体问题和求解方法如下:1. 问题一:求解方程sin(x)=0的解。
-二分法:利用函数值的符号变化将解空间不断缩小,直到找到满足精度要求的解。
-牛顿迭代法:通过使用函数的斜率来逼近方程的解,并不断逼近真实解。
-梯度下降法:将方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到方程的解。
2.问题二:求解函数f(x)=x^2-3x+2的极小值点。
-二分法:通过确定函数在一个区间内的变化趋势,将极小值所在的区间不断缩小,从而找到极小值点。
-牛顿迭代法:通过使用函数的导数和二阶导数来逼近极小值点,并不断逼近真实解。
-梯度下降法:将函数转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到函数的极小值点。
3. 问题三:求解微分方程dy/dx = -0.1*y的解。
-二分法:通过离散化微分方程,将微分方程转化为一个差分方程,然后通过迭代计算不同点的函数值,从而得到函数的近似解。
-牛顿迭代法:将微分方程转化为一个积分方程,并通过迭代计算得到不同点的函数值,从而得到函数的近似解。
-梯度下降法:将微分方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,从而得到函数的近似解。
实验步骤:1.编写代码实现各个数值计算方法的求解过程。
2.对每个数值计算问题,设置合适的初始值和终止条件。
3.运行程序,记录求解过程中的迭代次数和每次迭代的结果。
4.比较不同数值计算方法的精度和效率,并分析其优缺点。
实验结果:经过实验测试,得到了如下结果:-问题一的二分法迭代次数为10次,求解结果为x=0;牛顿迭代法迭代次数为4次,求解结果为x=0;梯度下降法迭代次数为6次,求解结果为x=0。
-问题二的二分法迭代次数为10次,求解结果为x=1;牛顿迭代法迭代次数为3次,求解结果为x=1;梯度下降法迭代次数为4次,求解结果为x=1-问题三的二分法迭代次数为100次,求解结果为y=e^(-0.1x);牛顿迭代法迭代次数为5次,求解结果为y=e^(-0.1x);梯度下降法迭代次数为10次,求解结果为y=e^(-0.1x)。
学院(系)名称:三.埃特金插值法附录(源程序及运行结果):一.拉格朗日插值法#include<stdio.h>#include<math.h>#define MAX 100void main(){int n,k=0,j=0;double x[MAX],y[MAX],x0,y0=0;printf("请输入节点个数n:");scanf("%d",&n);printf("请输入节点值(x,y):");for(int i=0;i<n;i++) scanf("%lf,%lf",&x[i],&y[i]);printf("输入所求节点的x的值:");scanf("%lf",&x0);while(k!=n){double t=1;for(int j=0;j<n;j++) if((j!=k)) t=(x0-x[j])/(x[k]-x[j])*t;y0=y0+t*y[k];k++;}printf("使用拉格朗日插值法输出x的y值为:%lf\n",y0);}运行结果:二.分段抛物线插值法#include<stdio.h>#include<math.h>#define MAX 20void Y(double x[],double y[],double x0,int i){double y0;printf("选取的节点为(%lf,%lf) (%lf,%lf) (%lf,%lf)\n",x[i-1],y[i-1],x[i],y[i],x[i+1],y[i+1]);y0=(x0-x[i])*(x0-x[i+1])*y[i-1]/(x[i-1]-x[i])/(x[i-1]-x[i+1]) +(x0-x[i-1])*(x0-x[i+1])*y[i]/(x[i]-x[i-1])/(x[i]-x[i+1])+(x0-x[i-1])*(x0-x[i])*y[i+1]/(x[i+1]-x[i-1])/(x[i+1]-x[i]);printf("使用分段抛物线插值输出结果为:%lf\n",y0);}void main(){int n,i;double x[MAX],y[MAX],x0,y0=0;printf("请输入节点个数n:");scanf("%d",&n);printf("请输入节点值(x,y):");for(i=1;i<=n;i++) scanf("%lf,%lf",&x[i],&y[i]);printf("输入所求节点的x的值:");scanf("%lf",&x0);if(x0<=x[1]) { i=2;Y(x,y,x0,i);}if(x0>=x[n]) { i=n-1;Y(x,y,x0,i);}for(i=2;i<=n;i++){if(x0<=x[i]){if(fabs(x0-x[i-1])<=fabs(x0-x[i])) i=i-1;Y(x,y,x0,i);break;}}}运行结果:三.埃特金插值法#include<stdio.h>#include<math.h>#define MAX 100void main(){int n,k=0;double x[MAX],y[MAX],x0,y0=0;printf("请输入节点个数n:");scanf("%d",&n);printf("请输入节点值(x,y):");for(int i=0;i<n;i++){scanf("%lf,%lf",&x[i],&y[i]);}printf("输入所求节点的x的值:");scanf("%lf",&x0);while(k!=n){for(int i=k;i<n;i++)y[i]=(x0-x[k-1])/(x[i]-x[k-1])*y[i]+(x0-x[i])/(x[k-1]-x[i])*y[k-1];k++;}printf("用埃特金插值法输出:%lf\n",y[n-1]);}运行结果:。
实验3.1 Gauss消去法的数值稳定性实验实验目的:观察和理解高斯消元过程中出现小主元(即|a(k)kk|很小)时引起方程组解数值不稳定性.实验内容:求解方程组Ax=b,其中实验要求:(1)计算矩阵的条件数,判断系数矩阵是良态的还是病态的.(2)用高斯列主元消去法求得L和U及解向量x1,x2 .(3)用不选主元的高斯消去法求得L和U及解向量x1,x2 .(4)观察小主元并分析对计算结果的影响.解:(1)cond(A1)=68.4296cond(A2)=8.9939A1矩阵条件数远大于1,A1矩阵为病态;A2矩阵条件数没有远远大于1,A2矩阵为良态。
(2)高斯列主元消去法:程序如下ClearA1=[0.3*power(10,-15),59.14,3,1;5.291,-6.130,-1,2;11.2,9,5,2;1,2,1,1];b1=[59.17;46.18;1;2];% A1=[1,2,-1,1;1,1,2,-1;3,-1,1,1;2,1,3,-1];%b1=[1;-2;6;-1];A2=[10,-7,0,1;-3,2.0999********,6,2;5,-1,5,-1;0,1,0,2];b2=[8;5.900000000001;5;1];A=A1; b=b1;n=input('n=');for k=1:n-1 [a,b3]=max(A(k:n,k)); A([k k-1+b3],:)=A([k-1+b3 k],:); b([k k-1+b3],:)=b([k-1+b3 k],:); if A(k,k)~=0A(k+1:n,k)=A(k+1:n,k)./A(k,k);A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n); else stop end endA; b; L=tril(A,-1);U=triu(A,0); for i=1:1:n L(i,i)=1;end L; for j=1:n-1 b(j)=b(j)/L(j,j);b(j+1:n)=b(j+1:n)-b(j)*L(j+1:n,j);end b(n)=b(n)/L(n,n); b; y=b;for j=n:-1:2 y(j)=y(j)/U(j,j); y(1:j-1)=y(1:j-1)-y(j)*U(1:j-1,j);end y(1)=y(1)/U(1,1);结果如下:方程组一:L1: U1:解向量x1结果如下:方程组二结果如下:L2:U2:解向量x2结果如下:(3)不选主元的分解程序如下:ClearA1=[0.3*power(10,-15),59.14,3,1;5.291,-6.130,-1,2;11.2,9,5,2;1,2,1,1]; b1=[59.17;46.18;1;2];%A1=[6,2,1,-1;2,4,1,0;1,1,4,-1;-1,0,-1,3];%b1=[6;-1;5;-5];A2=[10,-7,0,1;-3,2.0999********,6,2;5,-1,5,-1;0,1,0,2];b2=[ 8;5.900000000001;5;1]; A=A2; b=b2; n=input('n='); for k=1:n-1A(k+1:n,k)= A(k+1:n,k)/A(k,k); A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n); end L=tril(A,-1); U=triu(A,0); for i=1:1:n L(i,i)=1; end L ;for j=1:n-1 b(j)=b(j)/L(j,j);b(j+1:n)=b(j+1:n)-b(j)*L(j+1:n,j); end b(n)=b(n)/L(n,n); b; y=b;for j=n:-1:2 y(j)=y(j)/U(j,j); y(1:j-1)=y(1:j-1)-y(j)*U(1:j-1,j); end y(1)=y(1)/U(1,1);方程组一结果:L1: U1:解向量x1结果如下:方程组二结果:L2: U2:解向量x2结果如下:(4) 观察方程在两种不同方法下的结果可知:由于计算机字长是一定的,小主元会造成大数除以小数的结果超出字长,结果发生很大的变化。
本科生实验报告实验课程数值计算方法学院名称机电工程学院专业名称机械工程学生姓名学生学号指导教师实验地点实验成绩二〇二三年十一月二〇二三年十二月目录实验1 MATLAB的基本运算 (1)实验2 MALTAB多项式运算 (14)实验3 图形的可视化及修饰处理 (16)实验4 SIMULINK仿真实验 (19)实验1 MATLAB的基本运算一、实验目的基本掌握MATLAB向量、矩阵、数组的生成及其基本运算(区分数组运算和矩阵运算)、常用的数学函数、以及字符串的操作。
二、实验内容1向量的生成和运算;2矩阵的创建、引用和运算;3多维数组的创建及运算;4字符串的操作。
三、实验步骤1.向量的生成和运算(1) 向量的生成①直接输入法:>> A=[1;2;3;4;5]②冒号生成发:>> A=1:2:10 ,B=1:10 ,C=10:-1:1函数生成法:linspace( )是线性等分函数,logspace( )是对数等分函数。
>> A=linspace(1,10)B=linspace(1,30,10)>> A=logspace(0,4,5)(2) 向量的运算维数相同的行向量只可以相加减,维数相同的列向量也可以相加减,标量可以与向量直接相乘除。
>> A=[1 2 3 4 5], B=3:7,>> AT=A', BT=B',>> E1=A+B, E2=A-B>> F=AT-BT,>> G1=3*A, G2=B/3,②向量的点积与叉积运算。
>> A=ones(1,10);B=1:10; BT=B';>> E1=A*BT2.矩阵的创建、引用和运算(1)矩阵的创建和引用m 元素构成的矩阵结构,行向量和列向量是矩阵的特殊形式。
矩阵是由n①直接输入法:>> A=[1 2 3;4 5 6]>> B=[ 1 4 72 5 83 6 9 ]>> A(1)>> A(4:end)>> B(:,1)>> B(:)>> B(5)抽取法>> clear>> A=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16] >> B=A(1:3,2:3)>> C=A([1 3],[2 4])>> A([1 3;2 4])③函数法:>> A=ones(3,4)>> B=zeros(3)>> C=eye(3,2)>> D=magic(3)(2) 矩阵的运算①矩阵的加减、数乘与乘法已知矩阵:>> A=[1 23 -1],>> B=[-1 01 2]>> A+B >> 2*A >> 2*A-3*B >> A*B②矩阵的逆矩阵>> format rat;A=[1 0 1;2 1 2;0 4 6] >> A1=inv(A)>> A*A1③矩阵的除法>> a=[1 2 1;3 1 4;2 2 1],b=[1 1 2],d=b'>> c1=b*inv(a),c2=b/a>> c3=inv(a)*d, c4=a\d3.多维数组的创建及运算数组运算用小圆点加在运算符的前面表示,以区分矩阵的运算。
学院(系)名称:)()()()(0101112x x x f x f x f x x ---=附录(源程序及运行结果):一.二分法#include<stdio.h>#include<math.h>double f(double x){return x*x-x-1;}void main(){float a=0,b=0,x=1,m,e;int k;while(f(a)*f(b)>0){printf("请输入区间a,b的值。
以及精度e\n");scanf("%f,%f,%f",&a,&b,&e);}k=0;if(f(a)*f(b)==0){if(f(a)==0)printf("使用二分法输出:a=%f,k=%d\n",a,k);elseprintf("使用二分法输出:b=%f,k=%d\n",b,k);}else{while(f(a)*f(b)!=0){m=(a+b)/2;if(fabs(a-b)/2<e){printf("使用二分法输出:m=%f,k=%d\n",m,k);break;}else {if(f(a)*f(m)>0)a=m;else b=m;k=k+1;}}}}运行结果:二.迭代法与牛顿迭代法#include<stdio.h>#include<math.h>double f(double x){return exp(-x);}double f1(double x){return (x*exp(x)-1);}double ff(double x){return (exp(x)+x*exp(x));}void diedaifa(double x0,double e,int N){double x1;int k=1;while(k!=N){x1=f(x0);if(fabs(x1-x0)>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;}else{printf("使用迭代法输出结果:%lf\n",x1);break;}}}void NDdiedaifa(double x0,double e,int N){int k=1;double x1;while(k!=N){if(ff(x0)==0)printf("公式f(x)奇异!\n");else{x1=x0-f1(x0)/ff(x0);if(fabs(x1-x0)>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;}else{printf("使用牛顿迭代法输出结果:%lf\n",x1);break;}}}}void main(){double x0,e;int N;printf("请输入初值:");scanf("%lf",&x0);printf("精度:");scanf("%lf",&e);printf("以及判定迭代失败的最大次数N:");scanf("%d",&N);diedaifa(x0,e,N);NDdiedaifa(x0,e,N);}运行结果:四.双点弦截法#include<stdio.h>#include<math.h>double f(double x){return (x*x*x+3*x*x-x-9);}void main(){double x0,x1,x2,e;int N;int k=1;printf("请输入初值x0和x1:");scanf("%lf,%lf",&x0,&x1);printf("精度:");scanf("%lf",&e);printf("以及判定迭代失败的最大次数N:");scanf("%d",&N);while(k!=N){x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));if(fabs(f(x2))>=e){k++;if(k==N)printf("迭代失败!\n");x0=x1;x1=x2;}else{printf("使用双点弦截法输出结果:%lf\n",x2);break;}}}运行结果:。
实验报告一、实验目的二、实验内容三、实验环境四.实验方法五、实验过程1实验步骤2 关键代码及其解释3 调试过程六、实验总结1.遇到的问题及解决过程2.产生的错误及原因分析3.体会和收获。
七:程序源代码:八.教师评语:实验报告一.试验目的:练习用数值方法求解给定的非线性方程。
二.实验内容:求解人口方程: )1(5.43e 1004.156-+=λλλe要求误差小于410-。
三.实验环境:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法:牛顿法牛顿法简述:牛顿法是一种特殊的迭代法,其迭代公式为:,2,1,0,)()(1='-=+k x f x f x x k k k k ,当数列{}k x 收敛时,其极限值x 即为方程的解。
定理:给定方程],[,0)(b a x x f ∈=1)设0)()(<b f a f ;2))(x f ''在],[b a 上不变号,且],[,0)(b a x x f ∈≠'; 3)选取],[0b a x ∈,满足0)()(00>''x f x f ;则牛顿法产生的序列{}k x 收敛于0)(=x f 在],[b a 内的唯一解x 。
五.实验过程:1.编程: 根据所用算法及选用语言编出源程序 2. 开机, 打开所用语言系统输入所编源程序. 3. 调试程序, 修改错误直至能正确运行. 4. 运行程序并输出计算结果.六.实验总结: 对实验中存在的问题及解决的办法、实验结果等进行分析讨论.七、教师评语附:实验报告之例实验一 非线性方程求根姓名 专业: 学号:一.试验目的:练习用数值方法求解给定的非线性方程。
二.实验内容:求解人口方程: )1(5.43e 1004.156-+=λλλe要求误差小于410-。
三.实验仪器、语言:PC 计算机,C 程序设计语言 四.实验方法:牛顿法牛顿法简述:牛顿法是一种特殊的迭代法,其迭代公式为:,2,1,0,)()(1='-=+k x f x f x x k k k k ,当数列{}k x 收敛时,其极限值x 即为方程的解。
定理:给定方程],[,0)(b a x x f ∈=1)设0)()(<b f a f ;2))(x f ''在],[b a 上不变号,且],[,0)(b a x x f ∈≠'; 3)选取],[0b a x ∈,满足0)()(00>''x f x f ;则牛顿法产生的序列{}K x 收敛于0)(=x f 在],[b a 内的唯一解x 。
五.实验过程:1.编程: 用C 语言编出牛顿法的源程序。
2. 开机, 打开C 语言编译程序,键入所编程序源代码.3. 调试程序, 修改错误至能正确运行.六. 讨论:(1)牛顿法收敛速度快,但初值不容易确定,往往由于初值取得不当而使迭代不收敛或收敛慢,但若能保证)()(1+>K K x f x f (称为下山条件),则有可能收敛。
把新的近似值看作初值的话会比原来的取得好,有可能落入局部收敛的邻域。
(2)牛顿法要求)(x f '在x 附近不为零。
亦即x 只能是单根, 不能求重根。
可用重根加速收敛法求重根。
(3)牛顿法的每一步迭代中,都要计算一次导数值,若计算)(x f '比计算函数的近似值要麻烦的多。
为了避免求导数,可用差商近似代替微商11)()()(----='K K K K K x x x f x f x f此时牛顿迭代法改为)()()()(111--+---=K K K K K K K x x x f x f x f x x .(4) 由于人口方程来源于实际问题, λ代表人口增长率, 其真实值不会太大, 初值不应取得过大.否则会得到该方程的另外一个解.附:程序源代码:#include<math.h>#define ep 1e-4 float f (float x) { float y;y=100*exp(x)+43.5*(exp(x)-1)/x-156.4;return(y); }float df (float x) { float y;y=100*exp(x)+43.5*( x*exp(x)-exp(x)+1)/(x*x); return(y); }float root(float x) { float y;if (fabs)f<ep) y=x;else y=root(x-f(x)/df(x)); while(n<N) return(y); }main() {float y,x0;printf(“enter x0:”); scanf(“%f”,&x0); y=root(x);printf(“%f%f’,y,f(y)); }实验二 线性方程组的直接解法一.试验目的:练习线性方程组的直接解法。
二.实验内容:求解如下三对角线方程组:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡--------100200200200100414411411411454321x x x x x .三.实验仪器、语言:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法:追赶法五.实验步骤:1.编程: 根据所用算法及选用语言编出源程序 2. 开机, 打开所用语言系统输入所编源程序. 3. 调试程序, 修改错误直至能正确运行. 4. 运行程序并输出计算结果.六.讨论: 对实验中存在的问题及解决的办法、实验结果等进行分析讨论.七.写出实验报告:实验报告要求及书写格式见附例.附:实验报告之例实验二 线性方程组的直接解法姓名 专业: 学号:一.试验目的:练习线性方程组的直接解法。
二.实验内容:求解如下三对角线方程组:⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡--------100200200200100414411411411454321x x x x x . 三.实验仪器、语言:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法:追赶法追赶法简述:追赶法主要用于解三对角线方程组,尤其是具有严格对角占优的三对角线方程。
用克路特分解法将三对角线矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=---n n n n n ii i b a c b a c b a c b a c b A 11122211分解为A=LU:⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=n n i i L αγαγαγαγα 33221, ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=-11111121n iU ββββ 其中11111111,,3,2,,;,,3,2,---=⎪⎩⎪⎨⎧-==-=====n n n n i i i i i i i i b n i cb c b n i a βγααββγααβαγ 求解f Ax =可通过求解两个三角方程组y Ux f Ly ==,来实现,其中).1,2,,2,1)(,).,,2,1(/)(,11111 --=-===-==+-n n i x y x y x n i y f y fy i i i i n n i i i i i βαγα五.实验过程:1.编程: 用C 语言编出追赶法的源程序。
2. 开机, 打开C 语言编译程序,键入所编程序源代码.3. 调试程序, 修改错误至能正确运行.4. 运行程序并输出计算结果.计算结果:x(1) = 46.1538 x(2) = 84.6154 x(3) = 92.3077 x(4) = 84.6154 x(5) = 46.1538六. 讨论:追赶法的中间运算没有数量级的很大变化,不会有严重的误差积累,所以此方法是比较稳定的。
但在计算过程中要求),,3,2,1(n i i =α不能为零,因此,并不是任何三对角线方程组均可用追赶法求解。
附:程序源代码:#include “math.h ” #include “stdio.h ” int treede(n,m,b,d) int n,m;double b[],d[]; {int k,j; float s;if(m!=(3*n-2)){printf(“err\n ”);return(-2);} for (k=0;k<=n-2;k++) {j=3*k;s=b[j]; if(fabs(s)+1.0=1.0){ printf(“fail\n ”);return(0);} b[j+1]= b[j+1]/s; d[k]= d[k]/s;b[j+3]= b[j+3]- b[j+2]*b[j+1];d[k+1]= d[k+1]- b[j+2]*d[k];}s=b[3*n-3];if(fabs(s)+1.0=1.0){ printf(“fail\n”);return(0);}d[n-1]= d[n-1]/s;for (k=n-2;k>=0;k-)d[k]= d[k]- b[3*k+1]*d[k+1];return(2)}#include “stdio.h”#include “treede.c”main(){int i;static double b[13]={4.0, 4.0, 4.0, 4.0, 4.0,-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0};static double d[5]={100.0,200.0, 200.0, 200.0,100.0}; if(treede(5,13,b,d)>0)for (i=0;i<=4;i++)printf(“x(%d)=%5.4\n”,i+1,d[i]);}实验三 矩阵求逆一.试验目的:练习用数值方法求逆矩阵。
二.实验内容:求下面矩阵的逆矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=491472583A . 三.实验仪器、语言:PC 计算机,FORTRAN 、C 、C ++、VB 任选一种。
四.实验方法: 全主元高斯——约当消去法 五.实验步骤:1.编程: 根据所用算法及选用语言编出源程序 2. 开机, 打开所用语言系统输入所编源程序. 3. 调试程序, 修改错误直至能正确运行. 4. 运行程序并输出计算结果.六.讨论: 对实验中存在的问题及解决的办法、实验结果等进行分析讨论.七.写出实验报告:实验报告要求及书写格式见附例.附:实验报告之例实验三 矩阵求逆姓名 专业: 学号:一.试验目的:练习用数值方法求逆矩阵。