数值分析实验报告合集.docx
- 文档编号:25135153
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:26
- 大小:214.61KB
数值分析实验报告合集.docx
《数值分析实验报告合集.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告合集.docx(26页珍藏版)》请在冰豆网上搜索。
数值分析实验报告合集
数值分析实验报告
姓名:
学号:
院系:
班级:
2015年12月
目录
1、二分法的应用......................................1
2、牛顿迭代法的应用..................................4
3、拉格朗日插值多项式的应用..........................7
4、牛顿插值多项式的应用.............................11
5、梯形求积方法的应用...............................14
6、高斯消去法的应用.................................17
7、三角分解法的应用.................................20
8、欧拉法的应用.....................................24
二分法的应用
1.问题背景
对于一元高次方程的求解,不像一元二次方程那样有着求解公式。
在现实中也并不需要完全正确的解,只需要近似解。
如是我们可以采用二分法来近似求解一元高次方程。
2.数学模型
理想的一元n次方程的表达式为:
3.算法及流程
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2求区间(a,b)的中点c.
3计算f(c).
4
(1)若f(c)=0,则c就是函数的零点;
(2)若f(a)·f(c)<0,则令b=c;
(3)若f(c)·f(b)<0,则令a=c.
(4)判断是否达到精确度ξ:
即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.
matlab程序
symsx;
fun=input('请输入求解函数f(x)=');
a=input('请输入求值下限a=');
b=input('请输入求值上限b=');%输入试求值区间
e=input('请输入求解精度e=');%求解精度
f=inline(fun);%修改需要求解的inline函数的函数体
k=0;
d=b-a;
whiled>e
c=(a+b)/2;
iff(a)*f(c)<0
b=c;
elseiff(a)*f(c)>0
a=c;
else
a=c;
b=c;
end
k=k+1;
d=b-a;
end
x=(a+b)/2%输出计算结果
k%输出计算次数
4.实验结果及分析
请输入求解函数f(x)=x^2-3*x-2
请输入求值下限a=1
请输入求值上限b=6
请输入求解精度e=0.0001
x=3.5615
k=16
采用二分法存在一定的局限性,一要求f(x)在区间(a,b)连续,二要求f(a)*f(b)<0。
另外一个是区间(a,b)的选择比较困难。
操作十分的不便。
牛顿迭代法的应用
1.问题背景
非线性方程求解是在很多工程问题上都会碰到的。
对于其精确解一般是很难求解到的,但是我们在工程中也并不需要精确解,近似解就可以达到我们的计算要求。
我们可以通过采取牛顿迭代法来求解非线性方程的近似解。
2.数学模型
非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系、对数关系、指数关系、三角函数关系等等。
比如下面这个函数。
3.算法及流程
牛顿迭代法公式如下:
牛顿迭代法步骤如下:
1.前期阶段。
选初始点
并计算与这点相关的一阶导和函数值,以便在后面使用。
2.迭代阶段。
按照迭代公式迭代一次,计算最新的近似函数值
并计算与最新点相关的一阶导以及函数值。
3.验证阶段。
当误差值在允许误差范围内,则停止迭代,以最新点作为方程式的解,否则转4。
4.判断阶段。
如果迭代次数N已经达到预先设定的次数,则代表该次迭代没有成功,转5。
如果是另外一种情况,没有达到预先设定的迭代次数,那么就转到第2步,重新进入迭代阶段,进行迭代。
5.修改阶段。
重新选择迭代初始值进行迭代。
matlab程序
fun=input('请输入求解函数f(x)=');
a=input('请输入迭代初值x0=');
e=input('请输入求解精度e=');%求解精度
n=input('请输入最大求解次数n=');%最大求解次数
f=inline(fun);%修改需要求解的inline函数的函数体
x1=a;
f1=diff(fun,x,1);%对原函数进行求导
f2=inline(f1);
x2=x1-f(a)/f2(a);
n0=0;
d=x1-x2;
whilen0 ifd>e x1=x2; x2=x1-f(x1)/f2(x1) n0=n0+1; d=x1-x2; else break; end end ifn0==n disp('超过迭代次数,请重新选择初始值,进行迭代。 ') else x=x2%输出值 n=n0%迭代次数 end 4.计算结果及分析 请输入求解函数f(x)=2^x+sin(x)-2*x-6 请输入求值初始值a=10 请输入求解精度e=0.000001 请输入最大求解次数n=1000 x=3.840362 n=9 采用牛顿迭代法,大大缩减了计算次数,求解精度也高。 但是一个难点是求值初点的选择十分困难。 如果选择误差太大,将无法计算出来。 选用牛顿迭代法,需要合理选择迭代初始值。 拉格朗日插值多项式的应用 1.问题背景 有时候我们所测量的数据是一些点的集合,并不能很好反映结果。 为了研究其变化规律,我们需要对这些点进行数据处理,对其进行拟合,我们可以采用拉格朗日插值多项式进行拟合。 2.数学模型 在平面上有n个点,然后我们用一个函数来逼近。 也就是拉格朗日插值多项式来逼近。 最后可得: 3.算法及流程 matlab程序 clc; clear; symsx x0=input('请输入对应点x的值'); y0=input('请输入对应点y的值'); m=length(x0); fori=1: m a=1; forj=1: m ifj~=i a=expand(a*(x-x0(j))); end end b=1; fork=1: m ifk~=i b=b*(x0(i)-x0(k)); end end A(i)=expand(a/b); end L=0; forp=1: m L=L+y0(p)*A(p); end L plot(x0,y0,'r*'); axisequal gridon holdon x=linspace(x0 (1),x0(end),20)'; y=inline(L); y1=y(x); plot(x,y1) 流程图如下图所示: 4.计算结果及分析 请输入对应点x的值[0.20.40.60.81.0] 请输入对应点y的值[0.980.920.680.420.21] 对应的拟合曲线函数求解得到: L=-(75*x^4)/32+(385*x^3)/48-(305*x^2)/32+(829*x)/240+61/100 拟合曲线如图所示: 红色的点是原始数据点,蓝色的线是拟合曲线。 通过朗格朗日多项式拟合,波动较大,而且每增加一个点,又得重新计算,计算麻烦。 但是逻辑清楚,编程较牛顿插值多项式要简单。 牛顿插值多项式的应用 1.问题背景 有时候我们所测量的数据是一些点的集合,并不能很好反映结果。 为了研究其变化规律,我们需要对这些点进行数据处理,对其进行拟合,我们可以采用牛顿多项式进行拟合。 2.数学模型 牛顿插值多项式的表达为: 牛顿插值多项式克服了增加一个借点时整个计算工作重新开始的缺点,而且可以节省乘除法运算次数。 3.算法及流程 牛顿插值多项式前面系数的计算过程: matlab程序: clc; clear; symsx x0=input('请输入对应点x的值'); y0=input('请输入对应点y的值'); m=length(x0); n=length(x0); fort=1: m A=zeros(n,n); A(: 1)=y0'; s=0.0;p=1.0;q1=1.0;c1=1.0; forj=2: n fori=j: n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(x0(i)-x0(i-j+1)); end q1=abs(q1*(x-x0(j-1))); c1=c1*j; end C=A(n,n); q1=abs(q1*(x-x0(n))); fork=(n-1): -1: 1 C=conv(C,poly(x0(k))); d=length(C); C(d)=C(d)+A(k,k);%在最后一维,也就是常数项加上新的差商 end end plot(x0,y0,'r*'); axisequal gridon holdon x=linspace(x0 (1),x0(end),20)'; y=polyval(C,x); plot(x,y) 4.计算结果及分析 请输入对应点x的值[0.20.40.60.81.0] 请输入对应点y的值[0.980.920.810.640.38] L=-(25*x^4)/48+(5*x^3)/6-(53*x^2)/48+(23*x)/120+49/50 在其中红色的点是输入的数据点,蓝色的线是采用牛顿插值多项式进行拟合的结果,从图像中可以看出其吻合比较好,在其中的误差是比较小的。 其中就是求多项式的系数编程比较麻烦,逻辑性很强。 梯形求积方法的应用 1.问题背景 在工程中,我们画出曲线,大部分的时候需要对曲线的覆盖面积进行求解。 当我们已知曲线的函数,用求积分的算法可以解决。 但是一般工程中曲线的函数的原函数是很难求解出来,这时候我们可以采取梯形求积方法来近似解决这个问题。 2.数学模型 在这里选用一个原函数比较难求的函数: 3.算法及流程 梯形求积法: 1 将求积分区间[a,b]进行划分为n等分; 2 用每个小区间的梯形面积近似代替曲线面积; 3 将每个小区间的梯形面积加起来,得到区间的近似面积。 matlab程序 clc clear symsx fun=input('请输入求积函数f(x)='); a=input('请输入求积区间下限a='); b=input('请输入求积区间上限b='); n=input('请输入划分区间个数n='); f=inline(fun); s=0; i=1; whilei a1=a+(b-a)/n*(i-1); a2=a+(b-a)/n*i; s=s+(b-a)/n*(f(a1)+f(a2))/2; i=i+1; end s x=a: 0.005: b; y=f(x); area(x,y) gridon 4. 5.计算结果及分析 请输入求积函数f(x)=sin(x)/x+x*eps^x+x^2-2 请输入求积区间下限a=2 请输入求积区间上限b=4 请输入划分区间个数n=20 s=13.4808 请输入求积函数f(x)=sin(x)/x+x*eps^x+x^2-2 请输入求积区间下限a=2 请输入求积区间上限b=4 请输入划分区间个数n=60 s=14.3639 请输入求积函数f(x)=sin(x)/x+x*eps^x+x^2-2 请输入求积区间下限a=2 请输入求积区间上限b=4 请输入划分区间个数n=200 s=14.6818 从图形可以看出,计算的面积是图中所示的蓝色部分。 从计算结果可以知道,区间划分的越小,计算的精度就越高,但是计算次数会明显的增多,效率将会大大的降低。 从本质上来说,求解精度还是不够。 可以采取其他更加复杂的算法如复合梯形求积公式,这种精度更高,计算次数更少。 高斯消去法的应用 1.问题背景 在很多工程问题的时候,可能有很多的变量,建立了线性方程组。 对于线性方程组的求解,人工计算很废时间,也很废力气。 但是我们可以采用高斯消去法很好的来完成这种运算。 2.数学模型 设N个未知数的线性方程组为: 3.算法及流程 高斯消去法的流程: 通过初等行变化的系数矩阵变位上三角矩阵。 如下式: 然后通过回代法求解 高斯消去法的基本思想就是: 用矩阵的初等行变换将系数矩阵A化为具有简单形式的矩阵(如上三角矩阵,单位矩阵等)而三角形方程组是很容易回代求解的。 matlab的程序为: A=input('请输入线性方程组的系数矩阵A='); b=input('请输入线性方程组右边的值b='); a=[Ab]; x=[]; n=length(a)-1; fork=1: n fori=k+1: n c=a(i,k)/a(k,k); forj=k: n+1 a(i,j)=a(i,j)-c*a(k,j); end end end fori=n: -1: 1 s=0; ifi==n x(i)=(a(n,n+1)-s)/a(n,n); else forj=n: -1: i s=s+a(i,j)*x(j); end x(i)=(a(i,n+1)-s)/a(i,i); end end a x 4.计算结果及分析 请输入线性方程组的系数矩阵A=[223;477;-245] 请输入线性方程组右边的值b=[6;2;-14] a= 2236 031-10 00612 x= 4-42 通过输入线性方程组的系数矩阵和右边的数值一列。 通过程序的运算,其中包括了消元和回代两个过程,最终得计算结果。 编写的程序是合理的,采用此种方法可以计算线性方程组,但是变量非常多线性方程组,输入数据难,而且计算次数太多,效率不是很高。 三角分解法的应用 1.问题背景 在很多工程问题的时候,可能有很多的变量,建立了线性方程组。 对于线性方程组的求解,人工计算很废时间,也很废精力。 但是我们可以采用三角分解法来完成这种运算。 2.数学模型 设N个未知数的线性方程组为: 3.算法及流程 三角分解法的流程: 将矩阵分解为A=LU,L为下三角矩阵,U为上三角矩阵。 L和U是唯一的。 如下式: 对于三角矩阵的求解是非常简单,进行简单的回代即可以求解。 matlab程序 clc; clear; A=input('请输入线性方程组的系数矩阵A='); b=input('请输入线性方程组右边的值b='); n=length(A); A=[Ab]; L=eye(n); U=zeros(n); fori=1: n-1 forj=i: n-1 L(j+1,i)=A(j+1,i)/A(i,i); A(j+1,: )=A(j+1,: )-L(j+1,i)*A(i,: ); end end U=A(: 1: n); a1=[Lb] n=length(a1)-1; y=zeros(n,1); s=0; fori=1: 1: n ifi==1 y (1)=a1(1,n+1)/a1(1,1); else forj=1: 1: i-1 s=s+a1(i,j)*y(j); end y(i)=(a1(i,n+1)-s)/a1(i,i); s=0; end end a2=[Uy] n=length(a2)-1; fori=n: -1: 1 s=0; ifi==n x(i)=(a2(n,n+1)-s)/a2(n,n); else forj=n: -1: i s=s+a2(i,j)*x(j); end x(i)=(a2(i,n+1)-s)/a2(i,i); end end x 4.计算结果及分析 请输入线性方程组的系数矩阵A=[223;477;-245] 请输入线性方程组右边的值b=[3;1;-7] [Lb]= 1003 2101 -121-7 [Uy]= 2233 031-5 0066 x= 2-21 通过输入线性方程组的系数矩阵和右边的数值一列。 通过程序的运算,将矩阵分解为L和U,一个下三角矩阵和一个上三角矩阵,然后通过三角矩阵的计算方法,通过回代最终得计算结果。 编写的程序是合理的。 采用此种方法可以计算线性方程组,但是变量非常多线性方程组,输入数据难,而且计算次数过多,效率不是很高。 欧拉法的应用 1.问题背景 在工程当中,我们所建立的方程一般都是微分方程,对于其求解非常重要,但是其求解又很难求得精确解,精确解也并不是我们所需要的。 我们可以求得近似解。 我们采用欧拉法来求解一阶常微分方程。 2.数学模型 一阶常微分方程如下式所示: 3.算法及流程 a.对于初值问题,先将其离散化,即把[a,b]区间n等分,得各离散节点, b.由上一点推出下一点的值,逐渐推导到n点。 公式如下: c.最终可以计算出终点的近似值 matlab程序为: clc; clear; symsx symsy fun=input('请输入常微分函数右侧表达式='); xinit=input('请输入初始点x0='); yint=input('请输入初始点y0='); xfinal=input('请输入求值点xfianl='); n=input('请输入划分区间个数n='); f=inline(fun); h=(xfinal-xinit)/n; x=zeros(1,n+1); y=zeros(1,n+1); x (1)=xinit; y (1)=yint fori=1: n x(i+1)=x(i)+h; y(i+1)=y(i)+h*f(x(i),y(i)); end T=[x',y'] y(n+1) plot(x,y) 4.计算结果及分析 请输入常微分函数右侧表达式=y-2*x/y 请输入初始点x0=0 请输入初始点y0=1 请输入求值点xfianl=1 请输入划分区间个数n=10 T= 01.0000 0.10001.1000 0.20001.1918 0.30001.2774 0.40001.3582 0.50001.4351 0.60001.5090 0.70001.5803 0.80001.6498 0.90001.7178 1.00001.7848 ans= 1.7848 从图形结果可以看出,红色的点是每一步计算出来的点。 求解精度并不高,并不能得到很好的解。 这种算法还需要改进。 所以后面出现了改进的欧拉法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 实验 报告