不动点迭代法用于单变量线性方程近似根,首先确定一个方程根附近的近似初始值,采用逐次逼近的方法,使用迭代公式不断地更新这个初始值,使这个初始值不断趋近于准确值。
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 >= Maxiterationdisp('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.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.其他实例程序
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<=maxKerr=abs(P(k)-P(k-1)); %err表示相邻的迭代值的差值if(err<perror)fprintf('迭代%d次即可满足允许误差值退出\n',k-1);break;endk=k+1;P(k)=subs(f,x,P(k-1));end %共迭代了k-1次if(k-1==maxK) disp("超过最大迭代次数!");endp=P(k); k=k-1;Y=P;
end