当前位置:文档之家› 数值分析实验报告模板

数值分析实验报告模板

数值分析实验报告模板篇一:数值分析实验报告(一)(完整)数值分析实验报告12345篇二:数值分析实验报告实验报告一题目:非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。

本实验采用两种常见的求解方法二分法和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);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;elseb=c;endR=b-a;%求出误差k=k+1;endx=c%给出解Newton法及改进的Newton法源程序:clear%%%% 输入函数f=input('请输入需要求解函数>>','s')%%%求解f(x)的导数df=diff(f);%%%改进常数或重根数miu=2;%%%初始值x0x0=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;k=k+1;if (eval(subs(f,'x0','x')) breakendif 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;elsebreakendendendk;%给出迭代次数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=;当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篇误差分析实验(问题)实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。

对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。

通过本实验可获得一个初步体会。

数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。

病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。

问题提出:考虑一个高次的代数多项式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?1???anx?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??x19???0()同时将方程的解x看成是系数?的函数,考察方程的某个解关于?的扰动是否敏感,与研究它关于?的导数的大小有何关系?为什么?你发现了什么现象,哪些根关于?的变化更敏感?思考题一:(上述实验的改进)在上述实验中我们会发现用roots函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab的帮助。

实验过程:程序:a=poly(1:20); rr=roots(a); for n=2:21 nfor m=1:9ess=10^(-6-m);ve=zeros(1,21);ve(n)=ess;r=roots(a+ve);-6-ms=max(abs(r-rr)) end end利用符号函数:(思考题一) a=poly(1:20);y=poly2sym(a); rr=solve(y) for n=2:21 nfor m=1:8ess=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来进行问题的分析。

相关主题