数学建模与MATLAB实现:无约束优化

无约束优化是数学建模中的一个重要问题,广泛应用于工程、经济、管理等领域。本文介绍了无约束优化的基本思想、常用算法,并重点讲解了如何使用MATLAB求解无约束优化问题。


一、无约束优化问题

无约束优化问题的标准形式为:

min ⁡ f ( x ) \min f(x) minf(x)

其中,( x ) 是决策变量,( f(x) ) 是目标函数。无约束优化的目标是找到使目标函数 ( f(x) ) 最小的 ( x ) 值。


二、无约束优化的基本算法

1. 最速下降法

最速下降法是一种基本的优化算法,适用于寻优过程的前期迭代。其优点是计算量小,存储变量少,初始点要求不高;缺点是收敛速度较慢。

算法步骤:

  1. 选择初始点 ( x_0 )。
  2. 计算梯度 ( \nabla f(x_k) )。
  3. 沿负梯度方向进行搜索,更新 ( x_{k+1} = x_k - \alpha_k \nabla f(x_k) )。
  4. 重复步骤2和3,直到满足收敛条件。

2. 牛顿法

牛顿法利用目标函数的二阶导数信息,收敛速度较快。如果目标函数是二次函数,牛顿法可以一步达到最优点。

算法步骤:

  1. 选择初始点 ( x_0 )。
  2. 计算梯度 ( \nabla f(x_k) ) 和 Hessian 矩阵 ( H(x_k) )。
  3. 更新 ( x_{k+1} = x_k - H(x_k)^{-1} \nabla f(x_k) )。
  4. 重复步骤2和3,直到满足收敛条件。

3. 拟牛顿法

拟牛顿法通过近似 Hessian 矩阵来避免直接计算二阶导数,常用的方法包括 BFGS 和 DFP 算法。


三、MATLAB中的无约束优化函数

MATLAB提供了多种求解无约束优化问题的函数,常用的有 fminbndfminuncfminsearch

1. fminbnd 函数

fminbnd 用于求解一维无约束优化问题,基于黄金分割法和二次插值法。

调用格式:

x = fminbnd(fun, x1, x2)
[x, fval] = fminbnd(fun, x1, x2)

示例:

f = @(x) 2*exp(-x).*sin(x);
[xmin, ymin] = fminbnd(f, 0, 8);
disp(['最小值点:', num2str(xmin)]);
disp(['最小值:', num2str(ymin)]);

2. fminunc 函数

fminunc 用于求解多维无约束优化问题,支持大型和中型优化算法。

调用格式:

x = fminunc(fun, x0)
[x, fval] = fminunc(fun, x0)

示例:

fun = @(x) exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);
x0 = [-1, 1];
[x, fval] = fminunc(fun, x0);
disp(['最优解:', num2str(x)]);
disp(['目标函数值:', num2str(fval)]);

3. fminsearch 函数

fminsearch 使用单纯形法求解多维无约束优化问题,适用于目标函数不可导的情况。

调用格式:

x = fminsearch(fun, x0)
[x, fval] = fminsearch(fun, x0)

示例:

fun = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2, 2];
[x, fval] = fminsearch(fun, x0);
disp(['最优解:', num2str(x)]);
disp(['目标函数值:', num2str(fval)]);

四、MATLAB优化工具箱的使用

MATLAB的优化工具箱提供了丰富的函数和选项,用户可以通过 optimset 函数设置优化参数。

1. 设置优化参数

options = optimset('Display', 'iter', 'TolFun', 1e-8);

2. 使用优化参数

[x, fval] = fminunc(fun, x0, options);

五、应用实例

实例1:水槽容积最大化问题

对边长为3米的正方形铁板,在四个角剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?

MATLAB代码:

fun = @(x) -(3 - 2*x).^2 * x;
[xmax, fmax] = fminbnd(fun, 0, 1.5);
disp(['剪掉的正方形边长:', num2str(xmax)]);
disp(['最大容积:', num2str(-fmax)]);

运行结果:

剪掉的正方形边长:0.5
最大容积:2

实例2:Rosenbrock函数优化

Rosenbrock函数是一个经典的无约束优化问题,其形式为:

f ( x ) = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 f(x) = 100(x_2 - x_1^2)^2 + (1 - x_1)^2 f(x)=100(x2x12)2+(1x1)2

MATLAB代码:

fun = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2, 2];
[x, fval] = fminsearch(fun, x0);
disp(['最优解:', num2str(x)]);
disp(['目标函数值:', num2str(fval)]);

运行结果:

最优解:1.0000  1.0000
目标函数值:1.9151e-010

六、总结

本文介绍了无约束优化的基本概念和常用算法,重点讲解了如何使用MATLAB求解无约束优化问题。通过 fminbndfminuncfminsearch 等函数,用户可以方便地求解一维和多维无约束优化问题。MATLAB的优化工具箱提供了丰富的选项,用户可以根据需要设置优化参数,以获得更好的优化效果。

无约束优化在数学建模中有着广泛的应用,掌握其基本原理和MATLAB实现方法对于解决实际问题具有重要意义。

你可能感兴趣的:(#数学建模,Matlab编程实验,数学建模,matlab,开发语言)