数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告一:实验题目

一、 实验目的

掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。

二、 实验内容

1、编写二分法、牛顿迭代法程序,并使用这两个程序计算

02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。

2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。

3、由中子迁移理论,燃料棒的临界长度为下面方程的根

,用牛顿迭代法求这个方程的最小正根。

4、用牛顿法求方程

的根,精确至8位有效数字。比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。

三、 实验程序

第1题:02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。

画图函数:

function Test1()

% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0

r = 0:0.01:1;

y = r + exp(r) - 2

plot(r, y);

grid on 二分法程序:

计算调用函数:[c,num]=bisect(0,1,1e-4)

function [c,num]=bisect(a,b,delta)

%Input –a,b 是取值区间范围

% -delta 是允许误差

%Output -c 牛顿迭代法最后计算所得零点值

% -num 是迭代次数

ya = a + exp(a) - 2;

yb = b + exp(b) - 2;

if ya * yb>0

return ;

end

for k=1:100

c=(a+b)/2;

yc= c + exp(c) - 2;

if abs(yc)<=delta

a=c;

b=c;

elseif yb*yc>0

b=c;

yb=yc;

else

a=c;

ya=yc;

end

if abs(b-a)

num=k; %num为迭代次数

break;

end

end

c=(a+b)/2;

err=abs(b-a);

yc = c + exp(c) - 2;

牛顿迭代法程序:

计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:

function [y] = func1(x)

y = x + exp(x) - 2;

end

迭代算法:

function[c,num]=newton(func,p0,delta)

%Input -func是运算公式

% -p0是零点值

% -delta是允许误差

%Output -c牛顿迭代法最后计算所得零点值

% -num是迭代次数

num=-1;

for k=1:1000

y0=func(p0);

dy0=diff(func([p0 p0+1e-8]))/1e-8;

p1=p0-y0/dy0;

err=abs(p1-p0);

p0=p1;

if(err

num=k;%num为迭代次数

break;

end

end

c=p0;

第2题:

由题意得到算式:

计算调用函数:[c,num]=newton(@func2,0.02,1e-8) 程序:先用画图法估计出大概零点位置在0.02附近。画图程序:

function Test2()

% f(x) 示意图, f(x) = 200000*(1+x).^10-2160*12*10; f(x) = 0 r = linspace(0,0.06, 100);

y = 200000*(1+r).^10-2160*12*10;

plot(r, y);

grid on

调用函数:

function[y]=func2(r)

y=200000*(1+r).^10-2160*12*10;

end

牛顿迭代法算法程序:

function [c,num] =newton(func,p0,delta)

%Input -func是运算公式

% -p0是零点值

% -delta是允许误差

%Output -c牛顿迭代法最后计算所得零点值

% -num是迭代次数

num=-1;

for k=1:1000

y0=func(p0);

dy0=diff(func([p0 p0+1e-8]))/1e-8;

p1=p0-y0/dy0;

err=abs(p1-p0);

p0=p1;

if(err

num=k;

break;

end

end

c=p0;

第3题:求最小正数解

计算调用函数:[c,num]=newton(@func3, 1 ,1e-8) 程序:先用画图法估计出最小正解位置在1到2之间画图程序:

function Test3()

% f(x) 示意图, f(x) = cot(x)-(x.^2-1)./(2.*x); f(x) = 0 ezplot('cot(x)-(x.^2-1)./(2.*x)',[-6,6]);

grid on

调用函数:

function[y]=func3(x)

y=cot(x)-(x.^2-1)./(2.*x);

end

牛顿迭代法算法程序:

function [c,num] =newton(func,p0,delta)

%Input -func是运算公式

% -p0是零点值

% -delta是允许误差

%Output -c牛顿迭代法最后计算所得零点值

% -num是迭代次数

num=-1;

for k=1:1000

y0=func(p0);

dy0=diff(func([p0 p0+1e-8]))/1e-8;

p1=p0-y0/dy0;

err=abs(p1-p0);

p0=p1;

if(err

num=k;

break;

相关文档
最新文档