一、定義
凸集定義??:設Ω是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?2 + x?2 -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?2 -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?2 -x? +1 ≤ 0): %.4f (滿足)\n', con2_val);
fprintf('非負約束: x?=%.4f ≥0, x?=%.4f ≥0\n', sol.x(1), sol.x(2));