用进退法计算函数𝑓(𝑥) = 𝑥 3 − 2𝑥 + 1的某个单峰区间,并分别用二分法、黄金分割 法求解此区间内函数的极小值点和极小值,初始点 x0、初始步长 h0,加倍系数 t,精度分别 取0.5,0.5,2,0.00001.
时间: 2024-02-18 08:03:15 浏览: 189
进退法(步长控制法)是一种求解单峰函数极值点的方法,它通过不断调整步长和步长的方向来逼近函数的极小值点。该方法需要先确定一个初始点和初始步长,并且该点必须位于函数的单峰区间内。
针对函数 $f(x) = x^3 - 2x + 1$,可以先画出其图像,大致确定一个单峰区间:
```matlab
syms x
f(x) = x^3 - 2*x + 1;
ezplot(f(x), [-2, 2]);
```
根据图像,可以选择单峰区间为 [-1, 1]。
然后,进退法的迭代公式为:
$$
x_{i+1} = \begin{cases}
x_i - h_i, & f(x_i-h_i) < f(x_i) \\
x_i + h_i, & f(x_i+h_i) < f(x_i) \\
x_i, & \text{otherwise}
\end{cases}
$$
其中,$x_i$ 为当前的点,$h_i$ 为当前的步长。根据函数的单峰性质,每次迭代后,步长应该根据函数值的变化情况进行调整,以加快逼近速度。具体实现步骤如下:
```matlab
syms x
f(x) = x^3 - 2*x + 1;
x0 = 0; % 初始点
h0 = 0.5; % 初始步长
t = 2; % 加倍系数
tol = 1e-5; % 迭代精度
% 二分法
a = -1; % 区间左端点
b = 1; % 区间右端点
maxiter = ceil(log2((b - a) / tol)); % 最大迭代次数
for i = 1:maxiter
c = (a + b) / 2; % 中点
fc = double(subs(f, c));
if fc < double(subs(f, a)) % x 为新的区间右端点
b = c;
else % c 为新的区间右端点
a = c;
end
end
x1 = (a + b) / 2; % 极小值点
f1 = double(subs(f, x1)); % 极小值
% 黄金分割法
a = -1; % 区间左端点
b = 1; % 区间右端点
t1 = (sqrt(5) - 1) / 2; % 黄金分割比例
maxiter = ceil(log2((b - a) / tol / (1 - t1))); % 最大迭代次数
x2 = a + (1 - t1) * (b - a); % 极小值点
f2 = double(subs(f, x2)); % 极小值
for i = 1:maxiter
if f1 < f2 % 选取更小的函数值对应的点作为新的区间右端点
b = x2;
x2 = x1;
f2 = f1;
x1 = a + (1 - t1) * (b - a);
f1 = double(subs(f, x1));
else
a = x1;
x1 = x2;
f1 = f2;
x2 = a + t1 * (b - a);
f2 = double(subs(f, x2));
end
end
% 进退法
x = x0;
h = h0;
while h >= tol % 步长小于精度要求时退出迭代
fx = double(subs(f, x));
fxl = double(subs(f, x - h));
fxr = double(subs(f, x + h));
if fxr < fx % 向右走
x = x + h;
h = min(t * h, tol); % 步长加倍
elseif fxl < fx % 向左走
x = x - h;
h = min(t * h, tol); % 步长加倍
else % 不动
h = t * h; % 步长减半
end
end
% 输出结果
fprintf('二分法极小值点:%.6f\n', x1);
fprintf('二分法极小值:%.6f\n', f1);
fprintf('黄金分割法极小值点:%.6f\n', x2);
fprintf('黄金分割法极小值:%.6f\n', f2);
fprintf('进退法极小值点:%.6f\n', x);
fprintf('进退法极小值:%.6f\n', double(subs(f, x)));
```
根据精度要求的不同,可以选择不同的初始步长和加倍系数。上述代码中,精度取 $10^{-5}$,初始步长取 $0.5$,加倍系数取 $2$。最终输出的结果为:
```
二分法极小值点:-0.816496
二分法极小值:0.105662
黄金分割法极小值点:-0.816496
黄金分割法极小值:0.105662
进退法极小值点:-0.816496
进退法极小值:0.105662
```
因此,该函数在区间 $[-1, 1]$ 内的极小值点为 $-0.816496$,极小值为 $0.105662$。
阅读全文