5.1 题目
5.2 问题背景
在工程和科学技术中,许多问题常归结为求解函数方程:
f(x) = 0
如何求方程 f(x) = 0 的根是一个古老的数学问题,5 次以上的代数方程和超越方程一般没有求根公式,很难或无法求得精确解,而实际应用中只要得到满足一定精确度的近似解就可以了。
牛顿(Newton)迭代法是最为著名的方程求根的数值方法,它的优点是收敛速度快。牛顿下山法 (Newton down-hill method) 是牛顿法的一种变形。Newton法的收敛性依赖于初始点的选取,如果偏离所求根较远,则Newton法可能会发散,Newton下山法它是为减弱牛顿法对初始近似值的限制而提出的一种算法。即牛顿法和下山法的综合运用。下山法即要求将每次迭代过程得到的值与其前一步进行绝对值的比较,确保每一次迭代后的近似值的绝对值小于前一项。
5.3 算法
5.4 matlab编程实现
主程序:
clear;
format long;
fun1=@(x)sqrt(x)-x^3+2; %f(x)表达式
fun2=@(x)1/2/sqrt(x)-3*x^2; %f(x)一阶导数表达式
% fun2='3*x^2-1'; %课本例题测试数据
x0=1;eps=0.00001; %迭代初值与允许误差
[x,k,z,fx]=newton(x0,fun1,fun2,eps) %输出:x为零点近似值,k为终止时迭代次数,z矩阵存储迭代过程中的x,fx为零点近似值的函数值
函数:
function [x2,k,z,fx]=newton(x0,fun1,fun2,eps)
%fun1是原函数,fun2是导函数,eps是允许误差,x0是迭代初始点, z矩阵存储迭代过程中的x ,fx为零点近似值的函数值
format long;
x=x0;i=0;k=1;
z=zeros(8,1);z(1)=x;
error=1;
while error>eps
lamda=1;
x2=x-lamda*fun1(x)/fun2(x);
while abs(fun1(x2))>abs(fun1(x)) %试取适当下山因子以使得迭代法收敛
lamda=lamda/2;
x2=x-lamda*fun1(x)/fun2(x);
i=i+1;
if i>20
disp('为了保证迭代法收敛,请更换初始值以满足单调性条件');
break;
end
end
error=abs(x2-x);
z(k+1)=x2; %z矩阵存储迭代过程中的xk
x=x2;
k=k+1;
end
fx=fun1(x)
end
5.5 结果展示
>> work5
x =
1.475890462601969
k =
5
z =
1.000000000000000
1.400000000000000
1.480480469787711
1.475905863685759
1.475890462776181
1.475890462601969
0
0
fx=
0
5.6 讨论
(1) Newton下山法可以有效减弱牛顿法对初始近似值的限制,且收敛较快;
(2)本程序用数值解代入f(x)验证计算结果,结果显示误差极小;