采用牛顿迭代法求解非线性方程组采用MATLAB编程

牛顿迭代法的主要思想:

(此方法又称切线法)已知 𝑥 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);

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值