玖叶教程网

前端编程开发入门

MATLAB不动点迭代法求单变量非线性方程的根程序加实例

不动点迭代法用于单变量线性方程近似根,首先确定一个方程根附近的近似初始值,采用逐次逼近的方法,使用迭代公式不断地更新这个初始值,使这个初始值不断趋近于准确值。


1.不动点迭代法自定义函数

fixed_point.m函数

function [ x, iteration, x_record] = fixed_point( func, x0, prec,Maxiteration )
%% 函数功能:实现不动点迭代求解单变量非线性方程的根
%输入  func 构造的非线性函数迭代方程
%      x0 表示迭代的初始点
%      prec 表示允许的误差
%      Maxiteration 表示最大的迭代次数
%输出  x表示计算出来的近似根
%      iteration表示计算的迭代次数
%      x_record表示记录的求解过程数据
%初始化
prev = x0;
x_record = 0;
%输出第一次
x_val = func(prev);
iteration = 1;
x_record =[ iteration prev x_val];
disp("迭代次数    当前的迭代点x    计算的函数值f(x)")
fprintf("%d             %f          %f\n",iteration,prev,x_val);
%循环求解根
while abs(x_val - prev) >= prec && iteration < Maxiteration %循环进行条件 误差超过误差要求与迭代次数小于最大的迭代次数
    prev = x_val;
    x_val = func(prev);
    iteration = iteration + 1;
    x_record = [x_record;iteration prev  func(prev)];%记录求解过程
    fprintf("%d             %f          %f\n",iteration,prev, func(prev));
end
x = x_val;
if iteration >= Maxiteration
    disp('Method fails to converge.');
end
end

主程序

clc;%清除命令行窗口命令
clear all;%清除工作窗口变量
close all;%关闭图形窗口
%方程 f(x) = x^4-x-2
func1 = @(x)(x+2).^(1/4);%函数定义 f(x)
x0 =1.5;%初始化起点
prec = 1e-5;%误差要求
Maxiteration = 10000;%最大迭代次数
[ x, iteration, x_record] = fixed_point( func1, x0, prec,Maxiteration );%调用函数
%绘制图形
figure;
xx = 0:0.001:5;
yy = func1(xx);
plot(xx,yy,'b-','linewidth',2);
xlabel('x');
ylabel('y');
grid on;
hold on;
stem(x_record(:,2),x_record(:,3),'r--','linewidth',0.2,'markerface','r');
text(1.5,1.6,"f(x) = (x+2)^{(1/4)}  g(x) = x");
%方程 f(x) = x^2-x-2
x0 =2.1;
func2 = @(x)sqrt(x+2);
[ x1, iteration1, x_record1] = fixed_point( func2, x0, prec,Maxiteration );
x0 =2.1;
func3 = @(x) x.^2-2;
[ x2, iteration2, x_record2] = fixed_point( func3, x0, prec,Maxiteration );

运行结果

迭代次数    当前的迭代点x    计算的函数值f(x)
1             1.500000          1.367782
2             1.367782          1.354678
3             1.354678          1.353358
4             1.353358          1.353225
5             1.353225          1.353211
6             1.353211          1.353210
迭代次数    当前的迭代点x    计算的函数值f(x)
1             2.100000          2.024846
2             2.024846          2.006202
3             2.006202          2.001550
4             2.001550          2.000387
5             2.000387          2.000097
6             2.000097          2.000024
7             2.000024          2.000006
8             2.000006          2.000002
迭代次数    当前的迭代点x    计算的函数值f(x)
1             2.100000          2.410000
2             2.410000          3.808100
3             3.808100          12.501626
4             12.501626          154.290643
5             154.290643          23803.602484
6             23803.602484          566611489.226492
7             566611489.226492          321048579723463104.000000
8             321048579723463104.000000          103072190542452846579224618301652992.000000
9             103072190542452846579224618301652992.000000          10623876463219706002836374586651791327834192003612921822814377781231616.000000
10             10623876463219706002836374586651791327834192003612921822814377781231616.000000          112866751105753646515587586851442674773166866681669510786146343885715630991359278429990613046798009237082704467678620579869550476402725224448.000000
11             112866751105753646515587586851442674773166866681669510786146343885715630991359278429990613046798009237082704467678620579869550476402725224448.000000          12738903505168141679847056106385738761549631092935635618087094319237259237896102383497651784136167647474224359669262487168690258586612238272761585167842701037726822868605492595904935752413872963316593658577472414911387749762233189129386530909195875908974999712454766307167315165184.000000
12             12738903505168141679847056106385738761549631092935635618087094319237259237896102383497651784136167647474224359669262487168690258586612238272761585167842701037726822868605492595904935752413872963316593658577472414911387749762233189129386530909195875908974999712454766307167315165184.000000          Inf
13             Inf          Inf
>>

2.网上其他实例程序

程序来源于知乎作者Marcovaldo的文章《不动点迭代法—单变量非线性方程近似根matlab求解》,文章链接为:

https://zhuanlan.zhihu.com/p/369690237





% 程序来源于知乎作者Marcovaldo的文章《不动点迭代法—单变量非线性方程近似根matlab求解》,文章链接为:
% https://zhuanlan.zhihu.com/p/369690237
clc
clear all
syms x;
f=input("请输入迭代方程(自变量为x,如1/3*(x^3+1)):  ");
p0=input("请输入不动点迭代法的初始值:");
perror=input("请输入允许的误差值:");
maxK=input("请输入最大迭代次数:");


[p,k,Y]=FPM(f,p0,perror,maxK);


DP=sprintf("使用不动点迭代法迭代%d次,计算%s=x在%g附近的解为:%g",k,f,p0,p);
disp(DP);
fprintf("迭代值如下:");
disp(Y);


function [p,k,Y]=FPM(f,p0,perror,maxK)
%p0表示迭代初始值
%f表示迭代公式函数
%maxK表示规定的最大迭代次数
%pererr表示允许误差
%k表示最终迭代的次数
%p表示最终迭代的值
%Y用来记录每次迭代过程的迭代值
    syms x;
    P(1)=p0;
    k=2;
    P(k)=subs(f,x,P(k-1));      %迭代
    while k<=maxK
        err=abs(P(k)-P(k-1));    %err表示相邻的迭代值的差值
        if(err<perror)
            fprintf('迭代%d次即可满足允许误差值退出\n',k-1);
            break;
        end
        k=k+1;
        P(k)=subs(f,x,P(k-1));
    end         %共迭代了k-1次
    if(k-1==maxK) 
        disp("超过最大迭代次数!");
    end
    p=P(k); 
    k=k-1;
    Y=P;
end

3.参考内容

[1]知乎作者Marcovaldo的文章《不动点迭代法—单变量非线性方程近似根matlab求解》,文章链接为:https://zhuanlan.zhihu.com/p/369690237

[2] 博客园作者GentleMin的文章《非线性方程(组):一维非线性方程(一)二分法、不动点迭代、牛顿法 [MATLAB]》,文章链接为:https://www.cnblogs.com/gentle-min-601/p/9645452.html


本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。


作 者 | 郭志龙

编 辑 | 郭志龙
校 对 | 郭志龙

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言