解方程——对分法
对分法的理论依据是:设f是区间[a,b]上得连续函数,满足f(a)f(b)<0,那么f在a和b之间有一个根r,使得f(r) = 0
算法分析:
1.首先确定r在(a,b)区间内
2.令c0 = (a0 + b0)/2
if f(c0)f(a0) < 0
b1 = c0; a1 = a0
else
a1 = c0; b1 = b0
3.以此类推
matlab代码实现:
%代码运行前先要建立一个内联函数,比如f=inline('x^3 + x - 1') function xc = bisect(f,a,b,tol) if sign(f(a))*sign(f(b)) >= 0 error('f(a)f(b)<0 not satisfied!') end fa = f(a); fb = f(b); k = 0; while (b - a)/2 > tol %这里的tol是指求根时要求的精度 c = (a + b)/2; fc = f(c); if fc ==0 break end if sign(fc)*sign(fa) < 0 b = c; fb = fc; else a = c; fa = fc; end end xc = (a + b)/2
算法的精度:
设[a0,b0]为初始区间,
第一次对分后变为[a1,b1],长度变为(b0 - a0)/2
第一次对分后变为[a2,b2],长度变为(b0 - a0)/2^2
... ...
第n次对分后变为[an,bn],长度变为(b0 - a0)/2^n
我们取xc = (an + bn)/2 为根的近似,
则误差为:|xc - r| < (b0 - a0)/2^(n+1)
我们定义:如果误差小于0.5x10^(-p),那么解精确到P位小数
这样一来,我们就可以根据所要求的解的精确度来确定需要对分的次数n了。
例子:在区间[0,1]上求f(x)=cosx - x的根,精确到6位小数
根据误差公式:(1-0)/2^(n+1) < 0.5*10^(-6)
可以求得 n >= 19.9
也就是说至少要对分20次才能达到所要求的精度。