•牛顿迭代法的主要思想:
(此方法又称切线法)已知
𝑥
0,
𝑓
𝑥
0
,(x0,f(x0)),
所以在此处对应的切线为:
𝑓
𝑥
=
𝑓
′
𝑥
0
∗
𝑥
−
𝑥
0
+
𝑓
(
𝑥
0),
切线f(x)=f^′ (x0)∗(x-x0)+f(x0),切线
与
𝑥
轴x轴
的交点
𝑥
,0
带入(x,0)带入
切线中,则可以得到
Newton
公式:
•
𝑥
=
𝑥
0−
𝑓
𝑥
0
𝑓
′
𝑥
0
,
迭代
𝑛
次
,x=x0-f(x0)/(f^′ (x0) ),迭代n次,
得到公式
:
𝑥
𝑛
+1
=
𝑥
𝑛
−
𝑓
𝑥
𝑓
′
𝑥x_(n+1)=x_n-f(x)/(f^′ (x) )
•几何表示:
最终迭代到
x,
得到非线性方程的解
。
从初值x0不断逼近所需要求解的x。
采用MATLAB编程。
所编写的函数文件
function sol = Newton_iterative(f,x0,eps,maxiter)
%定义一个函数,输入三个参数,分别是非线性方程f,x0是初值,eps是精度,max是最大迭代次数
%三种函数定义
%sol = Newton_iterative(f,x0,eps,maxiter)
%sol = Newton)iterative(f,x0,eps)
%Newton_iterative(f,x0)
%输入参数
%1.f是求解的非线性方程,要求输入的是符号方程
%2.x0是初值
%3.eps是精度 1e - 12
%4.maxiter是最大迭代次数 默认最大迭代次数是100
%5.输出参数。sol是一个结构体,包含了迭代过程的信息。
%%
%for example
%%
%%输入参数控制
if nargin == 3
maxiter = 100; %默认100次
elseif nargin == 2
maxiter = 100;
eps = 1e-12; %默认精度
elseif nargin < 2 || nargin > 4
error('输入参数不足或者输入参数too many')
end
%%
%%变量初始化
x_b = x0; %x(k)表示上一次的值
x_n = x0; %x(k+1)表示下一次的值
df = diff(f,symvar(f),1); %方程的一阶导数 其中symvar函数是明确表达式中符号变量
k = 0; %迭代次数
%%
%利用newton iterative思想,进行数值逼近
fprintf('%5s %20s %15s\n','iter','ApproximateSolution','ErrorPrecision')
for k = 1:maxiter
x_b = x_n; % 迭代序列,x(k+1)的值赋给x(k)
fx = subs(f,symvar(f),x_b);% f是非线性方程,用x_b替代symvar(f),然后根据f计算
dfx = subs(df,symvar(f),x_b);%同理,此为求一阶导数
x_n = double(x_b - fx/dfx); %迭代公式,最重要的部分
errval = abs(double(subs(f,symvar(f),x_n)));%每次迭代误差大小
%迭代过程的输出
fprintf('%3d %20.15f %20.15f\n',k,x_n,errval);
if errval <= eps %满足精度,退出循环
break
end
end
%%
%迭代收敛的问题
if k < maxiter
disp(['方程满足精度',num2str(eps),'的条件下,近似解为:',...
num2str(x_n),',误差:',num2str(errval)])
else
disp('牛顿迭代求解数值逼近,到达最大迭代次数,可能不收敛....')
return
end
%%
%输出参数的控制(采用结构体的形式)
if nargout == 1
sol.info = '迭代收敛,逼近终止';
sol.X = x_n;
sol.norm_error = errval;
sol.iterative = k;
sol.eps = eps;
sol.success = '成功';
end
%%
% 可视化问题
fplot (f,[x_n-x0,x_n+x0], 'LineWidth',1.5) % f是函数,区间[x_n-x0,x_n+x0],线宽1.5
hold on
grid on %网格
fplot(@(t)0.*t,[x_n-x0,x_n+x0])
plot(x_n,errval,'r.','MarkerSize',20)
title('牛顿迭代法求解非线性方程的近似解')
xlabel('X')
ylabel('Y')
end
主文件
调用上文编写函数文件。
clc; clear;close all;
%主函数
syms x % 定义符号
f = 2 * exp(-x) * sin(x) + 2 * cos(x) - 0.25; % 所求函数
%x0 = 1;
x0 = 5;
eps = 1e-15;
maxiter = 100;
sol = Newton_iterative(f,x0,eps,maxiter);