凯鲁嘎吉
用书写铭记日常,最迷人的不在远方

MATLAB实例:不动点迭代法求一元函数方程的根

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

    之前写过一篇博客:MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根 - 凯鲁嘎吉 - 博客园 ,后来发现这篇博客中的不动点迭代法程序有问题,实际上是用牛顿迭代法求解的。这里,重新写了不动点迭代法的MATLAB程序,并绘制出函数图,直观理解方程的根。

问题描述:

    求方程

$f(x)={{x}^{3}}-x-1=0$

    在${{x}_{0}}=1.5$附近的根${{x}^{*}}$

解:

    将上述方程改为如下形式:

$x=\sqrt[3]{x+1}$

    据此建立迭代公式

${{x}_{k+1}}=\sqrt[3]{{{x}_{k}}+1},\text{  }k=0,1,2,\cdots .$

MATLAB程序

clear
clc
% Author:凯鲁嘎吉 https://www.cnblogs.com/kailugaji/
% f(x)=x^3-x-1;
% x=(x+1)^(1/3);
x=1.5; % 初始值
esp=1e-6; % 迭代终止条件
N=100; % 最大迭代次数
y=zeros(N, 1); % 暂存x变量的空间
for t=1:N
    x=fun(x);
    y(t)=x;
    fprintf('第 %d 次, x=%f\n', t, x);
    if t>1 
        if abs(y(t)-y(t-1))<esp
            break;
        end
    end
end

% 画出函数曲线
xx=0:0.01:3;
yy=xx.^3-xx-1;
figure(1)
plot(xx, real(yy));
hold on
z=0*ones(1, length(xx));
plot(xx, z, 'r');
xlabel('x');
ylabel('y');
title('y=x^3-x-1');
saveas(gcf,sprintf('不动点迭代法.jpg'),'bmp'); 


function x=fun(x)
x=(x+1).^(1./3);  % x的迭代函数
end

结果

第 1 次, x=1.357209
第 2 次, x=1.330861
第 3 次, x=1.325884
第 4 次, x=1.324939
第 5 次, x=1.324760
第 6 次, x=1.324726
第 7 次, x=1.324719
第 8 次, x=1.324718
第 9 次, x=1.324718

posted on 2020-10-17 19:52  凯鲁嘎吉  阅读(9227)  评论(0编辑  收藏  举报