数值分析上机实验 - 非线性方程求根试验

更新时间:2023-12-27 12:01:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实 验 报 告

课程名称 数值分析 非线性方程求根试验 上机 20111131 张振 理学楼407 预习部分 实验过程 表现 实验学时 学号 指导教师 实验时间 实验报告 部分 日期 2 2011113130 沈艳 2013.12.11 总成绩 实验项目名称 实验类型 班级 姓名 实验室名称 实验成绩 教师签字

哈尔滨工程大学教务处 制

实验三 非线性方程求根试验

一.数值积分的基本思想 1.不动点迭代法基本思想:

首先给定一个粗糙的初始值,然而用一个迭代公式,反复校对这个初值,将已有近似值逐步精确化,一直到满足精度为止。

具体的,把方程

f?x??0f?x?x???x?x*???x*?改写成x的表达式的零点等价于求,又将

x1,若

称x为

*??x*?点

x0的一个不动点,求

??x?的不动点。在

x2???x1??a,b?上任取一

代入

??x?求得

x1???x0?代入

??x?求得,如此反复下去,为迭代公式。

一般地得

xk?1???xk?k?0,1,2,???x?称为迭代函数,

x???x?

2.牛顿法基本思想:

将非线性方程近似根

x0f?x??0逐步转化为某种线性方程来求解。设

f?x?f?x??0的一个

,则函数在点

x0附近可以用一阶泰勒公式

f??x0??0f?x??f?x0??f??x0??x?x0??0x?x0?来近似。若,解得

f?x0?f??x0?,将

此根为原方程的近似根

xk?1?xk?x1,然后按上式迭代计算,使形成一种新的迭代公式

f?xk?k?0,1,2,??f?xk?称为牛顿法。

二.实验题目及实验目的

(第七章计算实习题1)求下列方程的实根: (1)x2?3x?2?ex?0; (2)x3?2x2?10x?20?0.

要求:(1)设计一种不动点迭代法,要使迭代序列收敛,然后再用斯特芬森加速迭代,计算到xk?xk?1?10?8为止。(2)用牛顿迭代,同样计算到

xk?xk?1?10?8,输出迭代初值及各次迭代值和迭代次数k,比较方法的优劣。

三.实验手段:

指操作环境和平台:win7系统下MATLAB R2012b

程序语言:一种类似C语言的程序语言,但比C语言要宽松得多,非常方便。 四.程序

① 斯特芬森加速迭代

function steffensen(f,x0,p,max) %μü′úoˉêy %3??μ %???è?μ %μü′ú×???′?êy

x(1)=x0; g=inline(f);

disp(sprintf('3??μx0: %f',x0))

disp('i x(i) y(i) z(i)') for i=1:max y(i)=g(x(i)); z(i)=g(y(i));

x(i+1)=x(i)-(((y(i)-x(i))^2)/(z(i)-2*y(i)+x(i)));

disp(sprintf('%d %f %f %f',i,x(i),y(i),z(i))) if (abs(x(i+1)-x(i)))

disp(sprintf('μü′ú′?êy: k=%d',i))

② 牛顿迭代

function root=Newton(f,a,b,eps) %fê?·???D?oˉêy %a?aóD?ù????μ?×ó?T %b?aóD?ù????μ?óò?T %eps?a?ùμ????è %root?a?ó3?μ?oˉêyá?μ? k=0;

if(nargin==3) eps=1.0e-8; end

f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0)

root=b; end

if(f1*f2>0)

disp('á???μ?oˉêy?μ3??y′óóú0!'); return; else tol=1;

fun=diff(sym(f));

fa=subs(sym(f),findsym(sym(f)),a); fb=subs(sym(f),findsym(sym(f)),b); dfa=subs(sym(fun),findsym(sym(fun)),a); dfb=subs(sym(fun),findsym(sym(fun)),b); if(dfa>dfb) root=a-fa/dfa; else

root=b-fb/dfb; end

while(tol>eps) rl=root;

fx=subs(sym(f),findsym(sym(f)),rl); dfx=subs(sym(fun),findsym(sym(fun)),rl); root=rl-fx/dfx; tol=abs(root-rl); k=k+1; end end

disp(sprintf('μü′ú′?êy£ok=%d',k)); disp(sprintf('?ü???a£o'));

控制台输入代码: (1)

>> steffensen('(x^2-exp(x)+2)/3',1.5,1.0e-8,20) >> Newton('x^2-3*x+2-exp(x)',0,2) (2)

>> steffensen('(20-x^3-2*x^2)/10',1.5,1.0e-8,20) >> Newton('x^3+2*x^2+10*x-20',0,2) 五.实验结果比较与分析 (1)

①斯特芬森加速迭代

可取方程的根为0.2575.

②牛顿迭代

(2)

①斯特芬森加速迭代

可取方程的根为1.3688.

②牛顿迭代

六.学习心得

不动点迭代法比较简单 但是使用前需要先选好迭代公式,以免在程序设计中出现错误。 牛顿迭代法的迭代速度快,但是每迭代一次,需要计算函数导数的值,如函数比较复杂,计算函数导数的工作量就会计较的,为避免计算导数值,可以选取常值代替导数值,较少计算量,使牛顿迭代法得以简化。

本文来源:https://www.bwwdw.com/article/ojsx.html

Top