前言
在数值方法中,区间消去法常常被用来确定迭代的初始区间。确定了初始区间后,可以结合如牛顿法、抛物线法和黄金分割法等等方法进行极小值(点)的计算。
算法流程图
算法代码
function QJXQ(y,x0,h0,N)
% y为所求函数, 符号函数
% x0为初始点,默认为0
% h0为初始迭代步长, 默认为0.1
% N为最大迭代次数, 默认为100
if nargin<4,N=100;end
if nargin<3,h0=0.1;end
if nargin<2,x0=0;end
y = matlabFunction(y); % 将符号函数转化为匿名函数
n = 0; % 当前迭代次数
% 首次迭代
n = n + 1;
h = h0;
x1 = x0;
x2 = x1 + h;
y1 = y(x1);
y2 = y(x2);
while true
if y2 > y1 && n == 1
h = -h;
x3 = x1; y3 = y1;
x1 = x2; y1 = y2;
x2 = x3; y2 = y3;
elseif n ~= 1
x1 = x2; y1 = y2;
x2 = x3; y2 = y3;
end
x3 = x2 + h;
y3 = y(x3);
if y3 < y2
h = 2*h;
else
fprintf(['第%d次迭代收敛:\nx1=%7.4f, x2=%7.4f, x3=%7.4f\ny1=%7.4f,' ...
' y2=%7.4f, y3=%7.4f\n最优区间为[%7.4f,%7.4f]\n'],n, x1, x2, x3, y1, y2, y3, x1, x3)
break
end
n = n + 1;
if n > N
fprintf('超过最大迭代次数%d,请调整参数!\n',N)
break
end
end
end
测试
使用函数y = x^2 - 6*x + 9对算法进行测试。
%%
syms x
h0 = 0.1; % 步长
x0 = 2; % 初始点
y = x.^2 - 6*x + 9; % 目标函数
N = 100; % 最大迭代次数
QJXQ(y,x0,h0,N)
测试结果:
总代码
clc;clear;close all
%%
syms x
h0 = 0.1; % 步长
x0 = 2; % 初始点
y = x.^2 - 6*x + 9; % 目标函数
N = 100; % 最大迭代次数
QJXQ(y,x0,h0,N)
%%
function QJXQ(y,x0,h0,N)
% y为所求函数, 符号函数
% x0为初始点,默认为0
% h0为初始迭代步长, 默认为0.1
% N为最大迭代次数, 默认为100
if nargin<4,N=100;end
if nargin<3,h0=0.1;end
if nargin<2,x0=0;end
y = matlabFunction(y); % 将符号函数转化为匿名函数
n = 0; % 当前迭代次数
% 首次迭代
n = n + 1;
h = h0;
x1 = x0;
x2 = x1 + h;
y1 = y(x1);
y2 = y(x2);
while true
if y2 > y1 && n == 1
h = -h;
x3 = x1; y3 = y1;
x1 = x2; y1 = y2;
x2 = x3; y2 = y3;
elseif n ~= 1
x1 = x2; y1 = y2;
x2 = x3; y2 = y3;
end
x3 = x2 + h;
y3 = y(x3);
if y3 < y2
h = 2*h;
else
fprintf(['第%d次迭代收敛:\nx1=%7.4f, x2=%7.4f, x3=%7.4f\ny1=%7.4f,' ...
' y2=%7.4f, y3=%7.4f\n最优区间为[%7.4f,%7.4f]\n'],n, x1, x2, x3, y1, y2, y3, x1, x3)
break
end
n = n + 1;
if n > N
fprintf('超过最大迭代次数%d,请调整参数!\n',N)
break
end
end
end
总结
这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。
参考文献
主编白清顺. 机械优化设计.第6版 [M]. 2017.