主要解决方法:
(1)试探法(“成功—失败”,斐波那契法, 0.618 法等);
(2)插值法(抛物线插值法,三次插值法等);
(3)微积分中的求根法(切线法,二分法等)。
无约束问题的解法:
- 解析法
- 梯度法(最速下降法)
- Newton法
- 变尺度法(拟牛顿法)
- 直接法
- Powell法
一维搜索——斐波那契法
%% 测试用例
interval = [-1 3];
delta = 0.32;
% f = @(x)x^2 - x + 2; % 直接定义f(x)函数
f = @fx; % fx函数作为参数传递
[xk,xx,xresult] = fabnacci(f,interval,delta)
%% 定义一个函数,另存为fx.m文件
function ff = fx(x)
ff = x^2 - x + 2
end
%% fabonacci.m
function [k,x,result] = fabnacci(f,interval,delta)
a = interval(1);
b = interval(2);
F = [1 1]; % 斐波那契数列的第1和2项
k=1;n=2;
% 生成斐波那契数列
while (b-a)/F(n) > delta
n = n+1;
F(n) = F(n-1)+F(n-2);
end
% 搜索算法
t(1)=a+F(n-1)/F(n)*(b-a);
t(2)=b+F(n-2)/F(n)*(a-b); % t(2)<t(1)
while k < n-1
f1 = f(t(1)); f2=f(t(2));
if f1<f2 % a<t(2)<t(1)<b,最小值留在较小f所在的那个子区间,即[t(2),b]
a=t(2);t(2)=t(1);t(1)=a+F(n-1-k)/F(n-k)*(b-a);
else
b=t(1);t(1)=t(2);t(2)=b+F(n-1-k)/F(n-k)*(a-b);
end
k = k+1;
end
x = (a+b)/2;
result = f(x);
end
梯度下降算法
测试函数以及梯度
% detaf.m
function [f,df] = detaf(x)
f = x(1)^2+25*x(2)^2;
df = [2*x(1);50*x(2)];
end
主体函数(梯度下降)
% zuisu.m
clc
x=[2;2];
[f0,g] = detaf(x);
while norm(g) >0.000001 % norm(向量)返回向量元素平方和的平方根,此处指梯度变化量接近0时停止迭代
p = -g/norm(g); %负梯度方向,单位化
t = 1.0;
f = detaf(x+t*p);
while f>f0
t = t/2;
f = detaf(x+t*p);
end
x = x+t*p;
[f0,g] = detaf(x);
end
x,f0