优化工具 #

一、无约束优化 #

1.1 一元函数优化 #

matlab
% 定义目标函数
fun = @(x) x^2 + 2*x + 1;

% 求最小值
[x, fval] = fminbnd(fun, -5, 5);

fprintf('最小值点: %.4f\n', x);
fprintf('最小值: %.4f\n', fval);

% 绘图
x_plot = -5:0.1:5;
y_plot = fun(x_plot);
plot(x_plot, y_plot);
hold on;
plot(x, fval, 'ro', 'MarkerSize', 10);
hold off;

1.2 多元函数优化 #

matlab
% 定义目标函数
fun = @(x) x(1)^2 + x(2)^2;

% 初始点
x0 = [1, 1];

% 求最小值
[x, fval] = fminsearch(fun, x0);

fprintf('最小值点: [%.4f, %.4f]\n', x(1), x(2));
fprintf('最小值: %.4f\n', fval);

% 使用fminunc(需要优化工具箱)
options = optimoptions('fminunc', 'Display', 'iter');
[x, fval] = fminunc(fun, x0, options);

1.3 设置选项 #

matlab
% 创建选项
options = optimoptions('fminsearch', ...
    'Display', 'iter', ...
    'MaxIter', 1000, ...
    'TolX', 1e-8, ...
    'TolFun', 1e-8);

% 使用选项
[x, fval] = fminsearch(fun, x0, options);

二、约束优化 #

2.1 线性规划 #

matlab
% 目标函数: min f = -x1 - 2*x2
f = [-1; -2];

% 不等式约束: A*x <= b
A = [1, 2; 4, 1];
b = [4; 5];

% 等式约束: Aeq*x = beq
Aeq = [];
beq = [];

% 变量边界
lb = [0; 0];
ub = [Inf; Inf];

% 求解
[x, fval] = linprog(f, A, b, Aeq, beq, lb, ub);

fprintf('最优解: [%.4f, %.4f]\n', x(1), x(2));
fprintf('最优值: %.4f\n', fval);

2.2 二次规划 #

matlab
% 目标函数: min 0.5*x'*H*x + f'*x
H = [1, -1; -1, 2];
f = [-2; -6];

% 约束
A = [1, 1; -1, 2; 2, 1];
b = [2; 2; 3];
lb = [0; 0];

% 求解
[x, fval] = quadprog(H, f, A, b, [], [], lb);

fprintf('最优解: [%.4f, %.4f]\n', x(1), x(2));
fprintf('最优值: %.4f\n', fval);

2.3 非线性约束优化 #

matlab
% 目标函数
fun = @(x) x(1)^2 + x(2)^2;

% 初始点
x0 = [1, 1];

% 非线性约束函数
nonlcon = @constraints;

% 求解
[x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon);

fprintf('最优解: [%.4f, %.4f]\n', x(1), x(2));
fprintf('最优值: %.4f\n', fval);

% 约束函数
function [c, ceq] = constraints(x)
    % 不等式约束 c(x) <= 0
    c = x(1)^2 + x(2)^2 - 1;  % 单位圆内
    
    % 等式约束 ceq(x) = 0
    ceq = [];
end

2.4 完整约束示例 #

matlab
% 目标函数
fun = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

% 初始点
x0 = [-1, 2];

% 线性不等式约束 A*x <= b
A = [1, 1];
b = 1;

% 变量边界
lb = [-0.5, -Inf];
ub = [0.5, Inf];

% 非线性约束
nonlcon = @constraints;

% 选项
options = optimoptions('fmincon', 'Display', 'iter');

% 求解
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, [], [], lb, ub, nonlcon, options);

function [c, ceq] = constraints(x)
    c = x(1)^2 + x(2)^2 - 1;  % 单位圆内
    ceq = [];
end

三、多目标优化 #

3.1 目标规划 #

matlab
% 目标函数
fun = @(x) [x(1)-1; x(2)-2];

% 初始点
x0 = [0, 0];

% 目标值
goal = [0, 0];

% 权重
weight = [1, 1];

% 约束
A = [1, 1];
b = 1;

% 求解
[x, fval] = fgoalattain(fun, x0, goal, weight, A, b);

四、方程求解 #

4.1 非线性方程 #

matlab
% 单变量方程
fun = @(x) x^3 - 2*x - 5;
x = fzero(fun, 2);

% 多变量方程组
fun = @(x) [x(1)^2 + x(2)^2 - 1; x(1) - x(2)];
x0 = [0.5, 0.5];
x = fsolve(fun, x0);

4.2 线性方程组 #

matlab
% Ax = b
A = [1, 2; 3, 4];
b = [5; 6];
x = A \ b;

% 使用linsolve
x = linsolve(A, b);

五、最小二乘 #

5.1 线性最小二乘 #

matlab
% 数据
x_data = [1; 2; 3; 4; 5];
y_data = [2.1; 3.9; 6.1; 8.2; 9.8];

% 构建设计矩阵
A = [x_data, ones(size(x_data))];

% 求解
p = A \ y_data;

fprintf('拟合直线: y = %.4f*x + %.4f\n', p(1), p(2));

5.2 非线性最小二乘 #

matlab
% 数据
x_data = linspace(0, 5, 20);
y_data = 2*exp(-0.5*x_data) + 0.1*randn(size(x_data));

% 定义模型
fun = @(p, x) p(1) * exp(-p(2) * x);

% 初始参数
p0 = [1, 1];

% 拟合
p = lsqcurvefit(fun, p0, x_data, y_data);

fprintf('参数: a=%.4f, b=%.4f\n', p(1), p(2));

5.3 lsqnonlin #

matlab
% 定义残差函数
fun = @(p) p(1)*exp(-p(2)*x_data) - y_data;

% 初始参数
p0 = [1, 1];

% 求解
p = lsqnonlin(fun, p0);

六、实用示例 #

6.1 曲线拟合优化 #

matlab
function fit_example()
    % 生成数据
    x = linspace(0, 10, 100);
    y_true = 2*sin(1.5*x + 0.5) + 3;
    y = y_true + 0.5*randn(size(x));
    
    % 定义模型
    model = @(p, x) p(1)*sin(p(2)*x + p(3)) + p(4);
    
    % 初始参数
    p0 = [1, 1, 0, 0];
    
    % 拟合
    p = lsqcurvefit(model, p0, x, y);
    
    % 绘图
    plot(x, y, 'o', x, model(p, x), 'r-', 'LineWidth', 2);
    legend('数据', '拟合');
    title(sprintf('拟合参数: A=%.2f, ω=%.2f, φ=%.2f, c=%.2f', p));
end

6.2 投资组合优化 #

matlab
function portfolio_optimization()
    % 资产收益率
    returns = [0.12; 0.10; 0.07; 0.03];
    
    % 协方差矩阵
    cov_matrix = [0.04, 0.01, 0.01, 0.00;
                  0.01, 0.03, 0.01, 0.00;
                  0.01, 0.01, 0.02, 0.00;
                  0.00, 0.00, 0.00, 0.01];
    
    % 目标函数: 最小化风险
    fun = @(w) w' * cov_matrix * w;
    
    % 约束
    Aeq = ones(1, 4);
    beq = 1;
    lb = zeros(4, 1);
    ub = ones(4, 1);
    
    % 目标收益率
    target_return = 0.08;
    A = -returns';
    b = -target_return;
    
    % 初始点
    w0 = [0.25; 0.25; 0.25; 0.25];
    
    % 优化
    [w_opt, risk] = fmincon(fun, w0, A, b, Aeq, beq, lb, ub);
    
    fprintf('最优权重:\n');
    fprintf('  资产1: %.2f%%\n', w_opt(1)*100);
    fprintf('  资产2: %.2f%%\n', w_opt(2)*100);
    fprintf('  资产3: %.2f%%\n', w_opt(3)*100);
    fprintf('  资产4: %.2f%%\n', w_opt(4)*100);
    fprintf('预期收益率: %.2f%%\n', returns'*w_opt*100);
    fprintf('风险(方差): %.4f\n', risk);
end

七、总结 #

本章学习了:

  1. 无约束优化:fminbnd、fminsearch、fminunc
  2. 约束优化:linprog、quadprog、fmincon
  3. 多目标优化:fgoalattain
  4. 方程求解:fzero、fsolve
  5. 最小二乘:lsqcurvefit、lsqnonlin

MATLAB文档已全部完成!

最后更新:2026-03-27