搜索
您的当前位置:首页正文

【实验】数值分析实验报告模板

来源:二三娱乐


【关键字】实验

数值分析实验报告模板

篇一:数值分析实验报告(一)(完整) 数值分析实验报告 1 2 3 4 5

篇二:数值分析实验报告 实验报告一

题目:非线性方程求解

摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。利用二分法求解给定非线性方程的根,在给定的范围内,假设f(x,y)在[a,b]上连续,f(a)xf(b) 直接影响迭代的次数甚至迭代的收敛与发散。即若x0 偏离所求根较远,Newton法可能发散的结论。并且本实验中还利用利用改进的Newton法求解同样的方程,且将结果与Newton法的结果比较分析。

前言:(目的和意义)

掌握二分法与Newton法的基本原理和应用。掌握二分法的原理,验证二分法,在选对有根区间的前提下,必是收敛,但精度不够。熟悉Matlab语言编程,学习编程要点。体会Newton使用时的优点,和局部收敛性,而在初值选取不当时,会发散。 数学原理:

对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。

对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b) Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式 xk?1?xk?f(xk) f'(xk)

产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为

xk?1?xk?rf(xk) 'f(xk)

其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计:

本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x);

1文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

y=-x*x-sin(x);

写成如上形式即可,下面给出主程序。 二分法源程序: clear

%%%给定求解区间 b=; a=0; %%%误差 R=1;

k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; a=c; else b=c; end

R=b-a;%求出误差 k=k+1; end x=c%给出解

Newton法及改进的Newton法源程序: clear

%%%% 输入函数

f=input('请输入需要求解函数>>','s') %%%求解f(x)的导数 df=diff(f);

%%%改进常数或重根数 miu=2; %%%初始值x0

x0=input('input initial value x0>>'); k=0;%迭代次数 max=100;%最大迭代次数

R=eval(subs(f,'x0','x'));%求解f(x0),以确定初值x0时否就是解 while (abs(R)>1e-8)

x1=x0-miu*eval(subs(f,'x0','x'))/eval(subs(df,'x0','x')); R=x1-x0; x0=x1;

2文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

k=k+1;

if (eval(subs(f,'x0','x')) break end

if k>max;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值 ss=input('maybe result is error,choose a new x0,y/n?>>','s'); if strcmp(ss,'y')

x0=input('input initial value x0>>'); k=0; else break end end end

k;%给出迭代次数 x=x0;%给出解 结果分析和讨论: x2

?0在[1,2]内的根。(??5*10?6,下同) 1. 用二分法计算方程sinx?2 计算结果为 x= ; f(x)= -; k=18;

由f(x)知结果满足要求,但迭代次数比较多,方法收敛速度比较慢。 2. 用二分法计算方程x3?x?1?0在[1,]内的根。 计算结果为 x= ; f(x)= ; k=17;

由f(x)知结果满足要求,但迭代次数还是比较多。 3. 用Newton法求解下列方程 a) xex?1?0 x0=; 计算结果为 x= ; f(x)= ; k=4;

由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快。 b) x3?x?1?0 x0=1;

c) (x?1)2(2x?1)?0 x0=, x0=;

3文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

当x0=时,计算结果为 x= ; f(x)= -; k=4;

由f(x)知结果满足要求,而且又迭代次数只有4次看出收敛速度很快,实际上该方程确实有真解x=。

当x0=时,计算结果为 x= ; f(x)=0; k=9;

由f(x)知结果满足要求,实际上该方程确实有真解x=,但迭代次数增多,实际上当取x0〉时,x≈1,就变成了方程的另一个解,这说明Newton法收敛与初值很有关系,有的时候甚至可能不收敛。

4. 用改进的Newton法求解,有2重根,取??2 (x?1)2(2x?1)?0 x0=;并与3.中的c)比较结果。

当x0=时,程序死循环,无法计算,也就是说不收敛。改??时,结果收敛为 x=; f(x)=; k=16;

显然这个结果不是很好,而且也不是收敛至方程的2重根上。 当x0=时,结果收敛为 x= ; f(x)= ; k=4;

这次达到了预期的结果,这说明初值的选取很重要,直接关系到方法的收敛性,实际上直

接用Newton法,在给定同样的条件和精度要求下,可得其迭代次数k=15,这说明改进后的Newton法法速度确实比较快。 结论:

对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,二且总体上来说速度比较慢。Newton法,收敛速度要比二分法快,但是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结果可能不是预期需要的结果。改进的Newton法求解重根问题时,如果初值不当,可能会不收敛,这一点非常重要,当然初值合适,相同情况下其速度要比Newton法快得多。在编制程序过程中,需事先规定迭代的次数,若超过这个次数,还不收敛,则停止迭代,另选初值。 篇三:数值分析实验报告5篇 误差分析 实验(问题)

4文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的保存空间等)。 问题提出:考虑一个高次的代数多项式 p(x)?(x?1)(x?2)?(x?20)??(x?k) k?120 ()

显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 p(x)??x19?0 ()

其中?是一个非常小的数。这相当于是对()中x19的系数作一个小的扰动。我们希望比较()和()根的差别,从而分析方程()的解对扰动的敏感性。

实验内容:为了实现方便,我们先介绍两个Matlab函数:“roots”和“poly”。 u?roots(a)

其中若变量a保存n+1维的向量,则该函数的输出u为一个n维的向量。设a的元素依次为a1,a2,?,an?1,则输出u的各分量是多项式方程 a1xn?a2xn?1anx?an?1?0 的全部根;而函数 b?poly(v)

的输出b是一个n+1维变量,它是以n维变量v的各分量为根的多项式的系数。可见“roots”和“poly”是两个互逆的运算函数。 ess?; ve?zeros(1,21); ve(2)?ess; roots(poly(1:20)?ve)

上述简单的Matlab程序便得到()的全部根,程序中的“ess”即是()中的?。 实验要求:

(1)选择充分小的ess,反复进行上述实验,记录结果的变化并分析它们。 如果扰动项的系数?很小,我们自然感觉()和()的解应当相差很小。计算中你有什么出乎意料的发现?表明有些解关于如此的扰动敏感性如何? (2)将方程()中的扰动项改成?x18或其它形式,实验中又有怎样的现象出现?

(3)(选作部分)请从理论上分析产生这一问题的根源。注意我们可以将 方程()写成展开的形式, p(x,?)?x20??x190 ()

同时将方程的解x看成是系数?的函数,考察方程的某个解关于?的扰动是否敏感,与研究它关于?的导数的大小有何关系?为什么?你发现了什么现象,哪些根关于?的变化更敏感?

5文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

思考题一:(上述实验的改进)

在上述实验中我们会发现用roots函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab的帮助。 实验过程: 程序:

a=poly(1:20); rr=roots(a); for n=2:21 n for m=1:9 ess=10^(-6-m); ve=zeros(1,21); ve(n)=ess; r=roots(a+ve); -6-m

s=max(abs(r-rr)) end end

利用符号函数:(思考题一) a=poly(1:20); y=poly2sym(a); rr=solve(y) for n=2:21 n for m=1:8

ess=10^(-6-m);ve=zeros(1,21);ve(n)=ess; a=poly(1:20)+ve;y=poly2sym(a);r=solve(y);-6-m s=max(abs(r-rr)) end end 数值实验结果及分析: 讨论:

利用这种方法进行这类实验,可以很精确的扰动敏感性的一般规律。即当对扰动 项的系数越来越小时,对其多项式扰动的结果也就越来越小,即扰动敏感性与扰动项的系数成正比,扰动项的系数越大,对其根的扰动敏感性就越明显,当扰动的系数一定时,扰动敏感性与扰动的项的幂数成正比,扰动的项的幂数越高,对其根的扰动敏感性就越明显。 实验总结:

利用MATLAB来进行病态问题的实验,虽然其得出的结果是有误差的,但是可以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。 插值法

实验(多项式插值的振荡现象) 问题提出:考虑一个固定的区间上用插值逼近一个函数。显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。 我们自然关心插值多项式的次数增加时,L(x)是否也更加靠近被逼近的函数。龙格给出了一个极著名例子。设区间[-1,1]上函数 f(x)=1/(1+25x^2)

实验内容:考虑区间[-1,1]的一个等距划分,分点为: x(i)=-1+2i/n,i=0,1,2?,n

6文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

泽拉格朗日插值多项式为: L(x)=∑l(i)(x)/(1+25x(j)^2 ) i=0,1,?n

其中l(i)(x), i=0,1,?n,n是n次拉格朗日插值基函数。 实验要求:

⑴ 选择不断增大的分点数目n=2,3?,画出f(x)及插值多项式函数L(x)在[-1,1]上的图象,比较分析实验结果。

(2)选择其它的函数,例如定义在区间[-5,5]上的函数 h(x)=x/(1+x^4) , g(x)=arctanx 重复上述的实验看其结果如何。(3)区间[a,b]上切比雪夫点的定义为:xk=(b+a)/2+((b-a)/2)cos((2k-1)π/(2(n+1))),k=1,2,^,n+1 以x1,x2^x(n+1)为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果。 实验过程: 程序:

多项式插值的震荡现象(实验) for m=1:6

subplot(2,3,m)%把窗口分割成2*3大小的窗口 largrang(6*m)%对largrang函数进行运行 if m==1

title('longn=6') elseif m==2 title('longn=12') elseif m==3 title('longn=18') elseif m==4 title('longn=24') elseif m==5 title('longn=30') elseif m==6 title('longn=36')

end%对每个窗口分别写上标题为插值点的个数 end

此文档是由网络收集并进行重新排版整理.word可编辑版本!

7文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.

因篇幅问题不能全部显示,请点此查看更多更全内容

Top