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

发布于:2024-12-06 ⋅ 阅读:(149) ⋅ 点赞:(0)

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

图片

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

fixed_point.m是一个MATLAB函数,设置初始猜测值 x0,容忍误差 tol,以及最大迭代次数 使用迭代公式来更新 x 的估计值。重复迭代,直到连续两次迭代的结果之差的绝对值小于预设的容忍误差 tol,或者达到最大迭代次数 max_iter,函数返回迭代得到的近似解 x 及迭代次数 n。

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

以下是 fixed_point.m 函数的实现主程序:

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.3677822             1.367782          1.3546783             1.354678          1.3533584             1.353358          1.3532255             1.353225          1.3532116             1.353211          1.353210迭代次数    当前的迭代点x    计算的函数值f(x)1             2.100000          2.0248462             2.024846          2.0062023             2.006202          2.0015504             2.001550          2.0003875             2.000387          2.0000976             2.000097          2.0000247             2.000024          2.0000068             2.000006          2.000002迭代次数    当前的迭代点x    计算的函数值f(x)1             2.100000          2.4100002             2.410000          3.8081003             3.808100          12.5016264             12.501626          154.2906435             154.290643          23803.6024846             23803.602484          566611489.2264927             566611489.226492          321048579723463104.0000008             321048579723463104.000000          103072190542452846579224618301652992.0000009             103072190542452846579224618301652992.000000          10623876463219706002836374586651791327834192003612921822814377781231616.00000010             10623876463219706002836374586651791327834192003612921822814377781231616.000000          112866751105753646515587586851442674773166866681669510786146343885715630991359278429990613046798009237082704467678620579869550476402725224448.00000011             112866751105753646515587586851442674773166866681669510786146343885715630991359278429990613046798009237082704467678620579869550476402725224448.000000          12738903505168141679847056106385738761549631092935635618087094319237259237896102383497651784136167647474224359669262487168690258586612238272761585167842701037726822868605492595904935752413872963316593658577472414911387749762233189129386530909195875908974999712454766307167315165184.00000012             12738903505168141679847056106385738761549631092935635618087094319237259237896102383497651784136167647474224359669262487168690258586612238272761585167842701037726822868605492595904935752413872963316593658577472414911387749762233189129386530909195875908974999712454766307167315165184.000000          Inf13             Inf          Inf>>

图片

2.其他实例程序

图片

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

图片

图片

图片

 


网站公告

今日签到

点亮在社区的每一天
去签到