二分法,最简单的,貌似没要求....
function [x, count] = bisection(fx,a,b,error,count)
if(nargin == 4)%调用时不需要输入count,计数用,用户不需要知道
count = 1;
end
x = (a+b)/2;
fa = subs(fx,a);
f2 = subs(fx,x);
err = b - a;
if(err > error && f2 ~= 0)
if( fa*f2 < 0)
[x, count] = bisection(fx,a,x,error,count+1);
else [x, count] = bisection(fx,x,b,error,count+1);
end
end
end
迭代法
function [x0, count] = iteration(fx,a,error,n,count)
%n为最大迭代次数
if(nargin == 4)
count = 1;
end
x0 = subs(fx,a);
if(abs(x0-a) > error && count <= n)
[x0, count] = iteration(fx,x0,error,n,count+1);
end
end
加权加速迭代法
function [x0,count] = acceleration(fx,a,error,n,L,count)
%调用只需accele(fx,a,error,n)即可
if (nargin == 4)
count = 1;
L = subs(diff(fx),a);
end
x0 = subs(fx,a)/(1-L) - L*a/(1-L);
if (abs(x0-a) > error && count <= n)
[x0,count] = acceleration(fx,x0,error,n,L,count+1);
end
end
埃特金迭代法(与书本上有所不同,按照上课ppt编写的)
function [x0, count] = aitken(fx,a,error,n,count)
if (nargin == 4)
count = 1;
end
x1 = subs(fx,a);
x2 = subs(fx,x1);
x0 = x2 - (x2-x1)^2/(x2-2*x1+a);
if (abs(x0-a) > error && count <= n)
[x0,count] = aitken(fx,x0,error,n,count+1);
end
end
牛顿法
function [x0,count] = newton(fx,a,error,n,count)
if(nargin == 4)
count = 1;
end
x0 = a - subs(fx,a)/subs(diff(fx),a);
if(abs(x0-a) > error && count <= n)
[x0,count] = newton(fx,x0,error,n,count+1);
end
end
弦截法
function [x0,count] = secant(fx,a,b,error,n,count)
if(nargin == 5)
count = 1;
end
fa = subs(fx,a);
fb = subs(fx,b);
x0 = b - fb*(b-a)/(fb-fa);
if(abs(x0-b) > error && count <= n)
[x0,count] = secant(fx,b,x0,error,n,count+1);
end
end
抛物线法
function [x0,count] = parabola(fx,a,b,c,error,n,count)
if(nargin == 6)
count = 1;
end
fa = subs(fx,a);
fb = subs(fx,b);
fc = subs(fx,c);
fb_a = (fb-fa)/(b-a);
fc_b = (fc-fb)/(c-b);
fc_b_a = (fc_b - fb_a)/(c-a);
w = fc_b + fc_b_a*(c-b);
x0 = c - 2*fc/(w+(w^2 - 4*fc*fc_b_a)^.5);
if(abs(x0-c) > error && count <= n)
[x0,count] = parabola(fx,b,c,x0,error,n,count+1);
end
end
示例:
syms x
fx = x^3 +4*x^2-10;
gx = (10/(4+x))^.5;
format long;
[x0,count] = bisection(fx,1.5,1,10^-6)
[x0,count] = newton(fx,1.5,10^-6,100)
[x0,count] = secant(fx,1,1.5,10^-6,100)
[x0,count] = parabola(fx,1,1.2,1.5,10^-6,100)
[x0,count] = iteration(gx,1.5,10^-6,100)
[x0,count] = acceleration(gx,1.5,10^-6,100)
[x0,count] = aitken(gx,1.5,10^-6,100)
调用函数时应当注意传入的是f(x)=0,还是g(x)=x...............