1. 绘图
从区间[-2, 2]的图像看出,在[-2, 2]至少有两个根,但在[-1, 1]之间是否有根难以判断,因此继续绘制[-1, 1]之间的图像,如下:
可以看到,函数在[-1,1]之间无根,为进一步确认,绘制[0, 0.4]区间上的图像,如下,确认[0, 0.4]间无根。
由上面三幅图,通过图表法,得知,f(x)=0仅有两个根,分别在(-2, -1.5)和(1, 1.5)内,且在(-1, 1)间无根。
2. 割线法求解
设置误差为1e-5,使用MATLAB的编程求解结果如下。
初始值
x
0
=
−
2
,
x
1
=
−
1.95
x_0=-2, x_1=-1.95
x0=−2,x1=−1.95,共迭代8次找到零值点-1.5737;
初始值
x
0
=
+
2
,
x
1
=
+
1.95
x_0=+2, x_1=+1.95
x0=+2,x1=+1.95,共迭代9次找到零值点1.2974。
它们的迭代图分别如下:
3. 确定收敛阶
f
′
(
x
)
=
324
x
5
+
225
x
4
−
408
x
3
−
207
x
2
+
16
f'(x)=324x^5 + 225x^4 - 408x^3 - 207x^2 + 16
f′(x)=324x5+225x4−408x3−207x2+16
f
′
(
−
1.5737
)
=
−
653.5924
f'(-1.5737)= -653.5924
f′(−1.5737)=−653.5924
f
′
(
1.2974
)
=
604.8823
f'(1.2974)=604.8823
f′(1.2974)=604.8823
在两根处的导数均不为0,故割线法在两根处的迭代求解均是超线性收敛。
clear
close all
clc
tic
%% 定义函数句柄
f = @(x) 54*x.^6 + 45*x.^5 - 102*x.^4 - 69*x.^3 + 16*x - 4;
f_prime = @(x) 324*x.^5 + 225*x.^4 - 408*x.^3 - 207*x.^2 + 16;
%% 设置误差及初始值
eps = 1e-5;
x0 = 2; %-2;
x1 = 1.95; % -1.95;
%% 开始迭代
x_all = [x1];
cnt = 0;
while 1
f1 = f(x1);
if abs(f1) < eps
break
end
x_tmp = x1;
x1 = x1 - (x1 - x0) / (f1 - f(x0)) * f1;
x0 = x_tmp;
x_all = [x_all, x1];
cnt = cnt + 1;
end
fprintf('迭代次数: %d, 解为%.4f\n', cnt, x1);
fprintf('根处的导数: %.4f\n', f_prime(x1));
toc
%%
figure(1)
step = linspace(-2, 2, 10000);
plot(step, f(step), 'k', 'LineWidth', 1)
hold on
plot(x_all, f(x_all), 'ro', 'LineWidth', 1)
hold off
grid on