上机实验报告(非线性方程的数值解法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二分法实验(1)
上机题目:二分法的应用
实验目的:熟悉二分法并在计算机上实现
实验要求:
①上机前充分准备,复习有关内容,写出计算步骤,查对程序;
②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言,算法步骤
陈述,变量说明,程序清单,输出计算结果,结果分析等等;
③用编好的程序在Matlab 环境中执行。
算法说明:
①找出 计算f(x)在有限根区间[a, b]端点的值,f(a),f(b)
②计算 计算f(x)在区间中点(
2b a +)处的值f(2
b a +) . ③判断 若f(2b a +)=0,则2b a +即是根,计算过程结束,否则检验若(2
b a +)f(a)<0,则以2b a +代替b,否则以2
b a +代替a.反复执行步骤②和步骤③,直到区间[a, b]长度小于允许误差ξ,此时中点2b a +即为所求近似根。
计算例题:求f (x )=x 3- x -1在[1,1.5]的零点. f (1)<0,. f (1.5)>0,delta= d=106-
不动点迭代法实验⑵
上机题目:不动点迭代法的实现
实验目的:熟悉迭代法并在计算机上实现
实验要求:
①上机前充分准备,复习有关内容,写出计算步骤,查对程序;
②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言,算法步骤
陈述,变量说明,程序清单,输出计算结果,结果分析等等;
③用编好的程序在Matlab 环境中执行。
算法说明:
①准备 将0)(=x f 改写为等价的形式)(x x ϕ=。
若要求*
x 满足0)(*=x f ,则)(**x x ϕ=;反之亦然。
求)(x f 的零点,等价于求的不动点,选择一个初始近似值0x 代
入)(x x ϕ=右端,得)(01x x ϕ=。
如此反复迭代计算⋯==+,1,0),(1k x x k k ϕ,此为迭
代公式。
②不动点的存在性迭代法的收敛性
定理1 设],[)(b a C x ∈ϕ满足:
(1)对任意],[b a x ∈有b x a ≤≤)(ϕ;
(2)存在正常数L<1,使对任意],[,b a y x ∈都有|||)()(|y x L y x -≤-ϕϕ,则)(x ϕ在],[b a 上存在唯一不动点*x 。
定理2 设],[)(b a C x ∈ϕ满足定理1中的两个条件,则对任意],[0b a x ∈,由迭代公式得到的迭代序列}{k x 收敛到)(x ϕ的不动点*x ,并有误差估计
||1||01*
x x L L x x k
k --≤-。
计算例题: 求f (x )=x 3-x -1在[1,1.5]的零点. 取x 0=1.5, d=106-
牛顿法实验⑶
上机题目:实现Newton 法
实验目的:编制求单变量非线性方程组的程序.
实验要求:
①上机前充分准备,复习有关内容,写出计算步骤,查对程序;
②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言, 算法步骤陈述,变量说明,程序清单,输出计算结果,结果分析等; ③用编好的程序在Matlab 环境中执行简化Newton 法.来解方程。
计算步骤:
①准备 选定初始近似值x 0,计算f 0=f(x 0),f ')(00x f '=。
②迭代 按公式 x 0001f f x '-=迭代一次,得新的近似值x 1, 计算f )(),(1111x f f x f '='=.
③控制 如果 x 1满足1εδ或21εf ,则终止迭代,以x 1作为所求的根;否则
转步骤4,此处21εε,是允许误差,而 ⎪⎪⎩⎪⎪⎨⎧≥-〈-=c x x x x c x x x 11
01101,,当当δ时。
其中c 是取绝对误差或相对误差的控制常数,一般可取c=1.
④修改 如果迭代次数达到预先指定的次数N ,或者f '=0,则方程失败;否则以(x 1,11,f f ')代替(000,,f f x ')转步骤2继续迭代。
例题:用牛顿方法解方程 x 3-x-1=0,取迭代初值 x 0=1.5, d=106-.
程序代码:
①二分法:
function [x,k,error]=erfenfa(f,a,b,delta)
% 二分法求方程的根
% =左边:[给定区间内的一个实根,迭代次数,误差]
% =右边:erfenfa('函数表达式',区间左端点,区间右端点,预定精度)
f=inline(f);
if f(a)*f(b)>0
x=char(' none');
k=0;
error=char(' NONE');
disp(' 在给定区间不存在实根')
else m=a;
n=b;
N=10000;
for k=1:N
x0=(m+n)/2;
M=f(m);
t=f(x0);
if t==0
x=x0;
else t;
end
if t*M<0
n=x0;
else m=x0;
end
x=(m+n)/2;
error=abs(x-x0);
if error<delta
break;
end
end
end
②不动点迭代法:
function [x,k,error]=BDdiedai(f,x0,a,b,delta)
% 不动点迭代法求方程的根
% =左边:[给定区间内的一个实根,迭代次数,误差]
% =右边:BDdiedai('迭代算式',初始近似值,区间左端点,区间右端点,预定精度) f=inline(f);
g=inline(diff(sym(f)));
if max(f(a),f(b))<a||min(f(a),f(b))>b
x=char(' none');
k=0;
error=char(' none');
disp(' 重新确认区间');
else
if min(abs(g(a)),abs(g(b)))>1
disp(' 迭代公式错误');
disp(' 无法求解x');
x=char(' none');
k=0;
error=char(' none');
else N=10000;
for k=1:N
x=f(x0);
x0=x;
error=abs(x-f(x0));
if error<delta
break;
end
end
end
end
③牛顿法:
function [x,k,error]=niudunfa(f,x0,delta)
% 牛顿法求方程的根
% =左边:[给定区间内的一个实根,迭代次数,误差]
% =右边:erfenfa('函数表达式',迭代初值,预定精度) f=inline(f);
g=inline(diff(sym(f)));
N=10000;
for k=1:N
x=x0-f(x0)/g(x0);
x1=x0;
x0=x;
error=abs(x-x1);
if error<delta;
break;
end
if k==N||g(x0)==0
disp(' 方程失败');
x=char(' none');
k=0;
error=char(' none');
break;
end
end
算例实现及其结果:
①二分法:
>> [x,k,error]=erfenfa('x^3-x-1',1.0,1.5,1e-10)
x =
1.3247
k =
32
error =
5.8208e-011
②不动点迭代法:
>> [x,k,error]=BDdiedai('(x+1)^(1/3)',1.5,1,1.5,1e-6) x =
1.3247
k =
8
error =
2.3346e-007
③牛顿法:
>> [x,k,error]=niudunfa('x^3-x-1',1.5,1e-6)
x =
1.3247
k =
4
error =
2.1675e-007
结果分析:
二分法需要迭代32次,不动点迭代法需要迭代8次,牛顿法需要迭代4次。
牛顿法求解方程的根最快。