数学建模:非线性规划:凸规划问题
一、定义
凸集定义:设Ω是n维欧氏空间的一点集,若任意两点x₁∈Ω,x₂∈Ω,其连线上的所有点αx₁+(1-α)x₂∈Ω,(0≤α≤1),则称Ω为凸集。
凸函数定义:给定函数f(x)(x∈D⊂Rⁿ),若∀x₁,x₂∈D,λ∈[0,1],有
f(λx₁+(1-λ)x₂) ≤ λf(x₁)+(1-λ)f(x₂)
则称f(x)为D上的凸函数;若不等式严格成立,则称为严格凸函数。
二、性质
最优性特征
局部最优即全局最优:凸规划的任一局部最优解都是全局最优解
最优解集为凸集:若最优解存在,则所有最优解构成的集合是凸集
严格凸函数的唯一性:当目标函数f(x)为严格凸函数时,最优解唯一
判别条件
三、用内点法解决凸规划问题
内点法通过在可行域内部构造一条路径并沿着这条路径向最优解逼近。其核心特征包括:
障碍函数:将约束条件转化为目标函数的惩罚项
中心路径:定义一系列严格可行解的参数化路径
牛顿迭代:利用二阶导数信息快速逼近最优解
代码
clear
clcprob = optimproblem;%用optimvar函数定义优化变量x,包含2个元素,且设置下界为0(x₁,x₂ ≥ 0)
x = optimvar('x', 2, 'LowerBound', 0);%定义目标函数f(x) = x₁² + x₂² -4x₁ +4
prob.Objective = x(1)^2 + x(2)^2 - 4*x(1) + 4;%定义第一个不等式约束:-x₁ + x₂ ≤ 2
con1 = -x(1) + x(2) - 2 <= 0;%定义第二个不等式约束:x₁² -x₂ +1 ≤ 0
con2 = x(1)^2 - x(2) + 1 <= 0;%将约束条件添加到问题中
prob.Constraints.con1 = con1;
prob.Constraints.con2 = con2;%设置初始点为随机值(2维列向量)
x0.x = rand(2,1);%配置优化选项(使用内点法)
options = optimoptions('fmincon', 'Algorithm', 'interior-point',...'Display', 'iter');%求解凸规划问题
[sol, fval, exitflag, output] = solve(prob, x0, 'Options', options);% 最优解输出
fprintf('\n最优解:\n');
fprintf('x₁ = %.4f, x₂ = %.4f\n', sol.x(1), sol.x(2));
fprintf('目标函数最小值: %.4f\n', fval);% 约束条件验证输出
fprintf('\n约束条件验证\n');
con1_val = -sol.x(1) + sol.x(2) - 2;
con2_val = sol.x(1)^2 - sol.x(2) + 1;
fprintf('约束1 (-x₁ + x₂ ≤ 2): %.4f (满足)\n', con1_val);
fprintf('约束2 (x₁² -x₂ +1 ≤ 0): %.4f (满足)\n', con2_val);
fprintf('非负约束: x₁=%.4f ≥0, x₂=%.4f ≥0\n', sol.x(1), sol.x(2));