数值分析-近似计算

还没写完,静等后续……

二分法求方程近似解

概念

每次将有根区间一分为二,得到长度逐次减半的区间序列(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文件


函数调用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修罗——宙火大帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值