优化工具 #
一、无约束优化 #
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
七、总结 #
本章学习了:
- 无约束优化:fminbnd、fminsearch、fminunc
- 约束优化:linprog、quadprog、fmincon
- 多目标优化:fgoalattain
- 方程求解:fzero、fsolve
- 最小二乘:lsqcurvefit、lsqnonlin
MATLAB文档已全部完成!
最后更新:2026-03-27