还没写完,静等后续……
二分法求方程近似解
概念
每次将有根区间一分为二,得到长度逐次减半的区间序列(ak,bk),则区间中点xk = (ak+bk)/2就是第k步迭代的近似解
算法
输入:a,b,函数f(x):输出:x
while (b - a) > ε do
x:=a+(b-a)/2;
if sign(f(x))=sign(f(a)) then
a:=x;
else
b:=x;
end
end
x:=a+(b-a)/2
其中x为输出结果。ε表示区间(a,b)的长度小于某个阈值ε。sign()表示取符号的函数。
MATLAB实现
erfen.m文件
function [k,x,wuca,yx]=erfen(a,b,abtol)
a(1)=a; b(1)=b;
ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数
if ya* yb>0,
disp('注意:ya*yb>0,请重新调整区间端点a和b.'), return
end
max1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil是向 方向取整
for k=1: max1+1
a;ya=fun(a); b;yb=fun(b); x=(a+b)/2;
yx=fun(x); wuca=abs(b-a)/2; k=k-1;
[k,a,b,x,wuca,ya,yb,yx]
if yx==0
a=x; b=x;
elseif yb*yx>0
b=x;yb=yx;
else
a=x; ya=yx;
end
if b-a< abtol , return, end
end
k=max1; x; wuca; yx=fun(x);
fun.m文件
function [y]=fun(x)
y = x^3 - x + 4;%这里表示的是求解的方程,可修改
最后运行代码求解
[k,x,wuca,yx]=erfen (-2,-1,0.001)
% erfen(a,b,abtol)中的a,b表示区间(a,b),abtol表示精确值,也就是阈值ε
不动点迭代法
概念
通过某种等价变换,将非线性方程改写为x=g(x)。其中,g(x)为连续函数。给定初值x0后,可构造迭代公式x(k+1)=g(x(k))
算法
MATLAB实现
diedai2.m文件
function [k,piancha,xdpiancha,xk,yk]=diedai2(x0,tol,ddmax)
x0为初值,tol为精确度,ddmax为最大迭代次数
x(1)=x0;
for i=1: ddmax
x(i+1)=fun(x(i));piancha=abs(x(i+1)-x(i));
xdpiancha=piancha/( abs(x(i+1))+eps);i=i+1;
xk=x(i);yk=fun(x(i)); [(i-1) piancha xdpiancha xk yk]
if (piancha<tol)|(xdpiancha< tol)
k=i-1; xk=x(i);
return;
end
end
if i>ddmax
disp('迭代次数超过给定的最大值ddmax')
k=i-1; xk=x(i);yk=fun(x(i));
[(i-1) piancha xdpiancha xk yk];
return;
end
P=[(i-1),piancha,xdpiancha,xk,yk]';
fun.m文件
function [y]=fun(x)
y = (x^5+1)/3;%这里表示的是求解的方程,可修改
%这里是将x^5-3*x+1=0改写为x=(x^5+1)/3
函数调用
[k,piancha,xdpiancha,xk,yk]=diedai2(0.3,1e-4,100)
%k为迭代次数,piancha为绝对误差,xdpiancha为相对误差,xk,yk为迭代完后对应的x(k)值和x(k+1)值
牛顿迭代法
概念
函数y=f(x)写成p(x)=f(x)-(x-xk)*f '(xk)=0。因此可以得到迭代方程
x(k+1) = x(k) - f(xk) / f '(xk)
这是f(x)=0为单根的情况。
已知重根m,则有迭代方程x(k+1) = x(k) - m*f(xk) / f '(xk)
不知重根m,则迭代方程为
u(x) = f(x) / f ’ (x)
x(k+1) = x(k) - u(xk) / u '(xk)
算法
MATLAB代码
单根情况
newtonxz.m文件
函数调用