利⽤⼆分法、迭代法、斯蒂芬森加速迭代法和⽜顿迭代法求解⾮线性⽅程
(matlab实现)
⼆分法
matlab代码:
clo, clc, clear;
tol = 1e-6;
g = bictfun('x^3 - 3*x + 1', -1, 1, tol)
function g = bictfun(f, a, b, tol)
% f:待求解的⾮线性⽅程 a:下限 b:上限 tol:精度
if nargin == 3
tol = 1e-3;
end
g = compute_bict(f, a, b, tol);
end
function r = compute_bict(f, a, b, tol)
宝贝英语fa = subs(f, a);
fb = subs(f, b);
skyfall 歌词fab = subs(f, (a + b)/2);
if fa*fab>0 % 零点不在区间 [a, (a + b)/2]
t = (a + b)/2;
r = compute_bict(f, t, b, tol);
el
if fa*fab == 0
r = (a + b)/2;
el
if (abs(b - a)<=tol)
r = (b + 3*a)/4;
el
s = (a + b)/2;摄氏度换算
r = compute_bict(f, a, s, tol);
end
end
crab
end
end
% 结果:
g =
0.3473
迭代法
迭代法的基本思想是⼀种逐次逼近的⽅法。⾸先取⼀个粗糙的近似值,然后⽤同⼀个递推公式反复校正这个近似值,直到满⾜预先给出的精度要求为⽌。
matlab代码:
x0 = 0.5; tol = 1e-6; n = 10000;
f = inline('sin(x)/x', 'x');
commissioned
[x, k, error, P] = Iteration(f,x0,tol, n)
function [x, k, error, P] = Iteration(f, x0, tol, n)
P(1) = x0;
for k = 2:n
P(k) = feval(f, P(k-1));
disp(k);
error = abs(P(k) - P(k - 1));
x = P(k);
effort是什么意思
if error <= tol
break
end
if k == n
disp('超过迭代次数,程序终⽌!');
break;
beiersdorfend
end
end
% 结果:
x =
0.8767
k =
12
error =
8.2977e-07
P =
1 ⾄ 9 列
0.5000 0.9589 0.8537 0.8829 0.8751 0.8772 0.8766 0.8768 0.8767
10 ⾄ 12 列
0.8767 0.8767 0.8767
斯蒂芬森加速迭代法
在通常情况下,迭代法是线性收敛的,⽽线性收敛的速度⽐较慢,因此需要改进迭代公式,提⾼迭代速度,由此产⽣了斯蒂芬森加速迭代法。
matlab代码:
x0 = 0.45;
[R, n] = Stevenfun(f, x0)
function [r0, n] = Stevenfun(f, x0, eps)
if nargin == 2
sampleps = 1e-4;
end
tol = 1; % 初始精度
r0 = x0;
n = 0;
while tol >= eps
n = n + 1;
r = r0;
% y = subs(sym(f), findsym(sym(f)), r) + r; % y = f(r) + r
% z = subs(sym(f), findsym(sym(f)), y) + y; % z = f(y) + y
y = feval(f, r) + r;
z = feval(f, y) + y;
r0 = r - (y - r)^2/(z - 2*y + r);
tol = abs(r0 - r);
end
end
动词不定式的用法
% 结果:
R =
0.3820
n =
3
⽜顿迭代法
利⽤⾮线性函数 f(x) 的线性展开解决问题,算法步骤如下:
(1)、选取初始点x0,最⼤迭代次数n和精度eps。
(2)、如果df(x(k)) = 0,则停⽌计算;如果df(x) ~= 0,则执⾏下⼀步。
(3)、x(k+1) = x(k) - f(x(k))/df(x(k))
(4)、如果 |x(k+1) - x(k)|<eps,则停⽌计算。
(5)、如果k=N,则停⽌计算;否则,k = k + 1,回到第⼆步。
df = inline('3*x^2 - 3', 'x');过去完成时讲解
x0 = 1.4;
eps = 1e-6;
n = 20;
[x, error, k, y] = newton(f, df, x0, eps, n) function [x, error, k, y] = newton(f, df, x0, eps, n) y(1) = x0;
for k = 1: n
x = x0 - feval(f, x0)/feval(df, x0);
error = abs(x - x0);
x0 = x;
if error < eps | y == 0
break
end
end
end
% 结果:
x =
1.0000
error =
8.6078e-07
k =
19
y =
1.4000