最速下降法Matlab程序及算例
时间: 2023-12-24 17:56:13 浏览: 299
最速下降法是一种常用的非线性优化算法,可以用于求解无约束优化问题。下面我为您提供一个用Matlab实现最速下降法的程序,并附上一个算例。
程序代码:
```matlab
function [x, fval] = steepestDescent(f, gradf, x0, tol, maxiter)
% steepestDescent: 最速下降法求解无约束优化问题
% 输入:
% f: 目标函数
% gradf: 目标函数的梯度
% x0: 初始点
% tol: 精度要求,默认为1e-6
% maxiter: 最大迭代次数,默认为1000
% 输出:
% x: 最优解
% fval: 最优解对应的函数值
if nargin < 5
maxiter = 1000;
end
if nargin < 4
tol = 1e-6;
end
x = x0; % 初始点
iter = 0; % 迭代次数
fval = f(x); % 计算初始点的函数值
while iter < maxiter
iter = iter + 1;
g = gradf(x); % 计算梯度
alpha = fminsearch(@(t) f(x-t*g), 0); % 一维搜索确定步长
x = x - alpha*g; % 更新点
fval_new = f(x); % 计算新点的函数值
if abs(fval_new-fval) < tol
break;
end
fval = fval_new;
end
if iter == maxiter
warning('达到最大迭代次数,可能未收敛');
end
end
```
算例:
我们考虑求解目标函数 $f(x_1,x_2)=x_1^2+x_2^2$ 的最小值,其中 $x_1,x_2$ 为变量。该问题的梯度为 $\nabla f(x_1,x_2)=(2x_1,2x_2)$。
我们取初始点为 $(1,2)$,精度要求为 $10^{-6}$,最大迭代次数为 $1000$。用上述程序求解最小值及最优解的函数值,代码如下:
```matlab
f = @(x) x(1)^2 + x(2)^2; % 目标函数
gradf = @(x) [2*x(1); 2*x(2)]; % 梯度
x0 = [1; 2]; % 初始点
tol = 1e-6; % 精度要求
maxiter = 1000; % 最大迭代次数
[x, fval] = steepestDescent(f, gradf, x0, tol, maxiter);
fprintf('最小值为 %f,在点 (%f, %f) 处取得\n', fval, x(1), x(2));
```
运行结果如下:
```
最小值为 0.000000,在点 (0.000000, 0.000000) 处取得
```
可以看出,最速下降法成功求解了该问题。
阅读全文