化算法工具箱全攻略:從fmincon到混合求解)
之前寫過一篇 MATLAB 遺傳算法工具箱的入門教程很多讀者在評論區(qū)留言問“全局優(yōu)化算法有了那 MATLAB 自帶的優(yōu)化算法工具箱到底能干什么”、“fmincon 和 ga 到底什么區(qū)別”、“有沒有一套系統(tǒng)的函數(shù)清單能讓我照著查”。這篇文章就來填這個坑把 MATLAB Optimization Toolbox優(yōu)化算法工具箱從概念、環(huán)境、核心函數(shù)到實戰(zhàn)案例完整梳理一遍。無論你是在校學(xué)生做數(shù)學(xué)建模還是工程師在做參數(shù)標(biāo)定、資源調(diào)度、控制器參數(shù)整定這篇文章都能幫你建立一套清晰的使用框架。如果你還沒看過上一篇遺傳算法工具箱的內(nèi)容建議先收藏本篇再配合上一期一起看。遺傳算法解決的是“傳統(tǒng)梯度方法不好使”的全局尋優(yōu)問題而優(yōu)化算法工具箱解決的是“從入門到工程落地”的完整優(yōu)化鏈路問題。兩者互為補充結(jié)合起來用效果最好。1. 背景與核心概念1.1 什么是優(yōu)化算法工具箱優(yōu)化算法工具箱Optimization Toolbox是 MATLAB 提供的一套用于求解最優(yōu)化問題的官方工具箱。它的核心定位是通過統(tǒng)一的函數(shù)接口讓用戶不需要從零編寫梯度下降、牛頓法、線性規(guī)劃、二次規(guī)劃等底層算法就能直接求解各類優(yōu)化問題。這里的“優(yōu)化”在數(shù)學(xué)上通常指求目標(biāo)函數(shù)的最小值或最大值在滿足約束條件等式、不等式、變量邊界的前提下找到一組決策變量使目標(biāo)函數(shù)值最優(yōu)。舉個最簡單的例子。你在設(shè)計一個圓柱形水杯希望表面積最小、容積固定這就是一個帶等式約束的非線性優(yōu)化問題。用 MATLAB 優(yōu)化工具箱只需要寫出目標(biāo)函數(shù)和約束條件調(diào)用fmincon即可求解。從應(yīng)用角度看優(yōu)化算法工具箱覆蓋的場景非常廣曲線擬合與參數(shù)估計工程結(jié)構(gòu)優(yōu)化設(shè)計生產(chǎn)排程與資源分配投資組合優(yōu)化控制系統(tǒng)參數(shù)整定機器學(xué)習(xí)模型中的損失函數(shù)最小化。1.2 優(yōu)化算法工具箱與遺傳算法工具箱的區(qū)別這是一個很容易混淆的點。很多初學(xué)者會問“我有遺傳算法工具箱了為什么還需要優(yōu)化算法工具箱”兩者定位不同對比項優(yōu)化算法工具箱遺傳算法工具箱Global Optimization Toolbox核心算法梯度下降、牛頓法、內(nèi)點法、SQP、單純形法等遺傳算法、模擬退火、粒子群、模式搜索等適用問題目標(biāo)函數(shù)連續(xù)、可導(dǎo)或至少局部光滑目標(biāo)函數(shù)復(fù)雜、不可導(dǎo)、多峰、離散組合優(yōu)化收斂速度快局部收斂能力強慢但全局搜索能力強對初值要求敏感需要較好的初始點不敏感全局搜索典型函數(shù)fminunc、fmincon、linprog、quadprogga、simulannealbnd、particleswarm、patternsearch一句話總結(jié)如果你的問題比較“規(guī)整”目標(biāo)函數(shù)連續(xù)可導(dǎo)、約束清晰直接用優(yōu)化算法工具箱效率高、精度好如果目標(biāo)函數(shù)像“過山車”一樣有大量局部極小值傳統(tǒng)方法容易陷入局部最優(yōu)那就考慮遺傳算法或者用遺傳算法先找到一個好的初始點再用fmincon精修。這兩種工具箱不是替代關(guān)系而是配合關(guān)系。下面我畫了一張簡單的選型流程方便你對照判斷問題來了 │ ├─ 目標(biāo)函數(shù)是否連續(xù)、可導(dǎo) │ ├─ 是 → fminunc / fmincon / linprog │ └─ 否 / 不確定 → ga / particleswarm │ ├─ 是否有約束條件 │ ├─ 無約束 → fminunc / fminbnd │ └─ 有約束 → fmincon / linprog / quadprog / ga │ └─ 問題規(guī)模 ├─ 小規(guī)模、高精度 → 梯度類算法 └─ 大規(guī)模、可接受近似最優(yōu) → 智能優(yōu)化算法1.3 為什么要掌握優(yōu)化算法工具箱在科研和工程場景中優(yōu)化問題無處不在。掌握這個工具箱至少能帶來三個直接收益提高建模效率不需要自己推導(dǎo)迭代公式通過optimoptions配置算法細(xì)節(jié)即可完成求解統(tǒng)一問題描述方式MATLAB 用optimproblem和optimvar支持“問題式建?!弊尨a結(jié)構(gòu)貼近數(shù)學(xué)表達(dá)減少出錯方便與 Simulink 聯(lián)動控制系統(tǒng)的參數(shù)優(yōu)化、電池模型參數(shù)辨識等場景可以直接封裝成函數(shù)給優(yōu)化器調(diào)用。因此無論是數(shù)學(xué)建模競賽、畢業(yè)論文還是工業(yè)項目優(yōu)化算法工具箱都是一項必備技能。2. 環(huán)境準(zhǔn)備與版本說明2.1 MATLAB 版本要求優(yōu)化算法工具箱是 MATLAB 的官方工具箱從 R2006a 之后基本都包含在內(nèi)。不同版本之間函數(shù)名整體穩(wěn)定但部分新函數(shù)比如solve統(tǒng)一入口、optimproblem問題式建模是后續(xù)版本加入的。建議如果你使用的是 R2016a 及以后版本可以完整使用問題式建模功能如果你還在用 R2014a 之前的版本建議優(yōu)先使用傳統(tǒng)的fmincon、fminunc函數(shù)式語法本文示例以常見新版 MATLAB 界面為準(zhǔn)核心代碼在老版本上也能兼容大部分。你可以先在 MATLAB 命令行窗口輸入以下命令檢查當(dāng)前環(huán)境是否支持優(yōu)化工具箱ver(optim)如果輸出內(nèi)容中顯示Optimization Toolbox Version xx說明環(huán)境正常。如果提示找不到需要在 MATLAB 的“主頁 → 附加功能 → 管理附加功能”中安裝。2.2 常用函數(shù)速查表在進入實戰(zhàn)之前先給出一張高頻函數(shù)對照表。這張表建議截圖保存平時寫代碼時經(jīng)常用到函數(shù)適用問題典型調(diào)用格式fminbnd單變量無約束極小值x fminbnd(fun, x1, x2)fminunc多變量無約束極小值x fminunc(fun, x0)fmincon多變量有約束極小值x fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)linprog線性規(guī)劃x linprog(f, A, b, Aeq, beq, lb, ub)quadprog二次規(guī)劃x quadprog(H, f, A, b)lsqcurvefit曲線擬合最小二乘x lsqcurvefit(fun, x0, xdata, ydata)fsolve非線性方程組求解x fsolve(fun, x0)ga全局優(yōu)化遺傳算法x ga(fun, nvars, A, b, Aeq, beq, lb, ub)2.3 示例項目結(jié)構(gòu)為了方便后面的實戰(zhàn)部分統(tǒng)一講解我按下面的目錄結(jié)構(gòu)組織示例代碼matlab_opt_demo/ ├── obj_fun.m % 目標(biāo)函數(shù)定義 ├── nonlcon_fun.m % 非線性約束定義 ├── main_fmincon.m % fmincon 主腳本 ├── main_ga_hybrid.m % 遺傳算法 fmincon 混合求解 ├── main_problem.m % 問題式建模示例 └── plot_result.m % 結(jié)果可視化3. 核心語法與原理拆解3.1 從最優(yōu)化的標(biāo)準(zhǔn)數(shù)學(xué)表達(dá)說起MATLAB 優(yōu)化工具箱的所有求解器本質(zhì)上都在解決下面這個標(biāo)準(zhǔn)形式的數(shù)學(xué)模型min f(x) s.t. A*x b Aeq*x beq lb x ub c(x) 0 ceq(x) 0其中x是決策變量向量f(x)是目標(biāo)函數(shù)A*x b是線性不等式約束Aeq*x beq是線性等式約束lb、ub是變量上下界c(x)、ceq(x)是非線性不等式和等式約束。很多初學(xué)者容易卡在這一步不知道自己的業(yè)務(wù)問題如何“翻譯”成這種標(biāo)準(zhǔn)形式。我提供一個實用翻譯方法先找到“要優(yōu)化的目標(biāo)”是什么寫成函數(shù)再找到“必須滿足的限制”有哪些拆成等式和不等式最后確定“自變量有沒有范圍”對應(yīng)lb和ub。比如你想設(shè)計一個長方體盒子要求體積為 1000 立方厘米同時希望表面積最小。設(shè)長寬高為x1, x2, x3那么目標(biāo)函數(shù)f(x) 2*(x1*x2 x1*x3 x2*x3)等式約束x1*x2*x3 1000邊界條件x1, x2, x3 0這就是一個非常標(biāo)準(zhǔn)的fmincon問題。3.2 匿名函數(shù)與函數(shù)文件MATLAB 優(yōu)化工具箱最常用的傳參方式是函數(shù)句柄。你可以選擇用匿名函數(shù)實現(xiàn)簡單目標(biāo)也可以寫成獨立.m文件。匿名函數(shù)示例% 目標(biāo)函數(shù)f(x) (x1-1)^2 (x2-2.5)^2 fun (x) (x(1) - 1)^2 (x(2) - 2.5)^2;函數(shù)文件示例文件路徑obj_fun.mfunction y obj_fun(x) y (x(1) - 1)^2 (x(2) - 2.5)^2; end當(dāng)你需要傳入額外參數(shù)時可以使用“參數(shù)封裝”技巧。比如目標(biāo)函數(shù)中帶常數(shù)a, ba 1.5; b 2.0; fun (x) (x(1) - a)^2 (x(2) - b)^2;這種寫法避免了修改函數(shù)文件簽名非常實用。3.3 fmincon 詳解fmincon是優(yōu)化算法工具箱中最重要的函數(shù)用于求解帶約束的非線性多元函數(shù)最小值。它支持四種算法interior-point內(nèi)點法默認(rèn)sqp序列二次規(guī)劃active-set有效集法trust-region-reflective信賴域反射法基礎(chǔ)調(diào)用x0 [1, 1]; % 初始點 A []; b []; % 線性不等式約束 Aeq []; beq []; % 線性等式約束 lb [0, 0]; % 變量下界 ub [5, 5]; % 變量上界 nonlcon (x) deal([], x(1)^2 x(2)^2 - 4); % 非線性等式約束 x1^2 x2^2 4 options optimoptions(fmincon, Display, iter, Algorithm, sqp); x_opt fmincon(obj_fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);關(guān)于nonlcon它必須返回兩個輸出c和ceq分別代表非線性不等式約束要求c 0和非線性等式約束要求ceq 0。所以上面的deal([], x(1)^2 x(2)^2 - 4)表示沒有非線性不等式約束等式約束為x(1)^2 x(2)^2 - 4 0。這里有一個新手容易忽略的坑等式約束不要寫成x(1)^2 x(2)^2 4而要寫成x(1)^2 x(2)^2 - 4。3.4 linprog 與線性規(guī)劃當(dāng)目標(biāo)函數(shù)和所有約束都是線性時應(yīng)使用linprog而不是fmincon。線性規(guī)劃的求解速度和穩(wěn)定性遠(yuǎn)高于一般非線性優(yōu)化器。線性規(guī)劃標(biāo)準(zhǔn)形式min f * x s.t. A*x b Aeq*x beq lb x ub示例f [-3; -5]; % 最大化 3*x1 5*x2轉(zhuǎn)化為最小化 -3*x1 - 5*x2 A [1, 0; 0, 2; 3, 4]; b [4; 12; 18]; lb [0; 0]; x_opt linprog(f, A, b, [], [], lb, []);這里的目標(biāo)函數(shù)是最大化問題所以取相反數(shù)。輸出結(jié)果中fval f * x_opt對應(yīng)原問題的負(fù)數(shù)需要記得轉(zhuǎn)回來。3.5 問題式建模optimproblem從 R2017b 開始MATLAB 推薦使用問題式建模代碼可讀性更高更適合數(shù)學(xué)建模比賽和復(fù)雜工程問題。示例% 創(chuàng)建優(yōu)化問題對象 prob optimproblem(ObjectiveSense, minimize); % 定義優(yōu)化變量 x optimvar(x, 2, LowerBound, 0, UpperBound, 5); % 定義目標(biāo)函數(shù) prob.Objective (x(1) - 1)^2 (x(2) - 2.5)^2; % 添加約束 prob.Constraints.cons1 x(1) x(2) 4; prob.Constraints.cons2 x(1)^2 x(2)^2 4; % 設(shè)置初始點 x0.x [1, 1]; % 求解 [sol, fval] solve(prob, x0);問題式建模的優(yōu)點在于ObjectiveSense可以明確指定minimize或maximize不需要手工取負(fù)號約束直接用數(shù)學(xué)符號表示直觀不易錯solve函數(shù)會自動選擇合適的求解器。4. 完整實戰(zhàn)案例4.1 案例一帶約束的非線性優(yōu)化fmincon下面通過一個工程中常見的“圓柱形儲罐設(shè)計”案例完整展示fmincon的使用流程。問題描述設(shè)計一個圓柱形儲罐要求容積不低于 20 立方米罐體高度不超過 6 米底面半徑不超過 2.5 米。目標(biāo)是使罐體總表面積最小減少材料用量。建模過程設(shè)底面半徑為r高度為h。目標(biāo)函數(shù)總表面積包含頂面和底面S(r, h) 2*pi*r^2 2*pi*r*h約束條件容積pi*r^2*h 20 高度h 6 半徑0 r 2.5由于 MATLAB 優(yōu)化工具默認(rèn)求解“小于等于”約束容積約束需要轉(zhuǎn)化- pi*r^2*h -20首先定義目標(biāo)函數(shù)文件obj_fun.mfunction S obj_fun(x) r x(1); h x(2); S 2 * pi * r^2 2 * pi * r * h; end然后定義非線性約束函數(shù)文件nonlcon_fun.mfunction [c, ceq] nonlcon_fun(x) r x(1); h x(2); % 容積約束pi*r^2*h 20 c -pi * r^2 * h 20; ceq []; % 沒有等式約束 end主腳本main_fmincon.mclear; clc; % 初始猜測 x0 [1, 5]; % 變量邊界 lb [0.1, 0.1]; % 半徑和高度都大于 0 ub [2.5, 6]; % 線性約束本問題沒有線性約束置空 A []; b []; Aeq []; beq []; % 求解 options optimoptions(fmincon, ... Display, iter, ... Algorithm, sqp, ... MaxIterations, 200); [x_opt, fval] fmincon(obj_fun, x0, A, b, Aeq, beq, lb, ub, nonlcon_fun, options); % 輸出結(jié)果 fprintf(\n 優(yōu)化結(jié)果 \n); fprintf(最優(yōu)半徑 r %.4f 米\n, x_opt(1)); fprintf(最優(yōu)高度 h %.4f 米\n, x_opt(2)); fprintf(最小表面積 S %.4f 平方米\n, fval); fprintf(對應(yīng)容積 V %.4f 立方米\n, pi * x_opt(1)^2 * x_opt(2));運行后你會看到fmincon每一步迭代的信息最終輸出 優(yōu)化結(jié)果 最優(yōu)半徑 r 1.4697 米 最優(yōu)高度 h 2.9478 米 最小表面積 S 40.7922 平方米 對應(yīng)容積 V 20.0000 立方米從結(jié)果可以看出最優(yōu)解恰好滿足容積等于 20 立方米的邊界條件說明約束起到了作用。4.2 案例二遺傳算法 fmincon 混合優(yōu)化在實際工程中fmincon對初始點非常敏感。如果初始點選得不好可能收斂到局部最優(yōu)解。此時可以先用遺傳算法做一次全局搜索再把搜索結(jié)果作為fmincon的初值進行局部精修。這種“全局粗搜 局部精修”的混合策略在很多實際問題中效果非常好。主腳本main_ga_hybrid.mclear; clc; % 第一步遺傳算法全局搜索 nvars 2; lb [0.1, 0.1]; ub [2.5, 6]; % 遺傳算法選項 ga_options optimoptions(ga, ... PopulationSize, 100, ... MaxGenerations, 100, ... Display, final, ... PlotFcn, gaplotbestf); x_ga ga(obj_fun, nvars, [], [], [], [], lb, ub, nonlcon_fun, ga_options); fprintf(\n遺傳算法找到的全局最優(yōu)解r %.4f, h %.4f, S %.4f\n, ... x_ga(1), x_ga(2), obj_fun(y)); % 第二步fmincon 局部精修 options optimoptions(fmincon, ... Display, final, ... Algorithm, sqp); [x_final, fval] fmincon(obj_fun, x_ga, [], [], [], [], lb, ub, nonlcon_fun, options); fprintf(\n 混合優(yōu)化最終結(jié)果 \n); fprintf(最優(yōu)半徑 r %.4f 米\n, x_final(1)); fprintf(最優(yōu)高度 h %.4f 米\n, x_final(2)); fprintf(最小表面積 S %.4f 平方米\n, fval);這里的關(guān)鍵點在于遺傳算法的收斂精度通常不如梯度類方法但它能提供更好的初始位置。將ga的輸出直接塞給fmincon就能把兩者的優(yōu)勢結(jié)合起來。你可以對比一下直接隨機取初值運行fmincon和先用ga再精修看哪個更穩(wěn)定、更不容易陷入局部最優(yōu)。4.3 案例三問題式建模求解為了展示現(xiàn)代 MATLAB 的推薦用法這里用問題式建模重寫同一個圓柱儲罐設(shè)計問題。文件main_problem.mclear; clc; % 創(chuàng)建優(yōu)化問題 prob optimproblem(ObjectiveSense, minimize); % 定義優(yōu)化變量 r optimvar(r, LowerBound, 0.1, UpperBound, 2.5); h optimvar(h, LowerBound, 0.1, UpperBound, 6); % 目標(biāo)函數(shù) prob.Objective 2 * pi * r^2 2 * pi * r * h; % 約束條件 prob.Constraints.volume pi * r^2 * h 20; % 初始點 x0.r 1; x0.h 5; % 求解 [sol, fval] solve(prob, x0); % 顯示結(jié)果 fprintf(\n 問題式建模結(jié)果 \n); fprintf(最優(yōu)半徑 r %.4f 米\n, sol.r); fprintf(最優(yōu)高度 h %.4f 米\n, sol.h); fprintf(最小表面積 S %.4f 平方米\n, fval);問題式建模和傳統(tǒng)函數(shù)式建模的區(qū)別很明顯代碼中直接寫了pi * r^2 * h 20和數(shù)學(xué)表達(dá)式幾乎一一對應(yīng)別人看你的代碼時不需要再猜“這個c是什么意思”。4.4 運行與驗證運行以上任意一個腳本后建議再做一步可視化驗證確保結(jié)果不是“數(shù)值表面好看、物理上不合理”。plot_result.m% 繪制目標(biāo)函數(shù)等值線和約束邊界 r_vals linspace(0.1, 2.5, 100); h_vals linspace(0.1, 6, 100); [R, H] meshgrid(r_vals, h_vals); S 2 * pi * R.^2 2 * pi .* R .* H; V pi .* R.^2 .* H; % 只顯示滿足容積約束的區(qū)域 S(V 20) NaN; figure; contourf(R, H, S, 30); xlabel(半徑 r (m)); ylabel(高度 h (m)); title(圓柱儲罐優(yōu)化目標(biāo)函數(shù)等值線); colorbar; hold on; % 標(biāo)記最優(yōu)解 plot(1.4697, 2.9478, r*, MarkerSize, 15, LineWidth, 2); legend(可行域內(nèi)表面積, 最優(yōu)解); grid on; hold off;運行后可以看到最優(yōu)解落在可行域的邊界上與理論分析一致。5. 常見問題與排查思路我在使用優(yōu)化算法工具箱時遇到過不少問題下面把高頻異常整理成表方便你排查問題現(xiàn)象常見原因解決思路求解結(jié)果不收斂初始點選取不當(dāng)嘗試多個初始點或用遺傳算法先搜索提示“Objective function is returning undefined values”目標(biāo)函數(shù)在搜索區(qū)域內(nèi)出現(xiàn) NaN 或 Inf檢查目標(biāo)函數(shù)是否存在除零、開根號負(fù)數(shù)等情況約束條件不滿足非線性約束函數(shù)返回值方向?qū)懛创_認(rèn)不等式約束必須寫成c 0形式求解速度很慢默認(rèn)算法不合適嘗試更換Algorithm選項如sqp結(jié)果明顯不是全局最優(yōu)目標(biāo)函數(shù)多峰梯度算法陷入局部最優(yōu)改用ga、particleswarm或與fmincon混合變量始終停在邊界上約束過緊或邊界設(shè)置不合理檢查lb和ub是否限制了最優(yōu)解solve報錯“No solver found”問題類型與求解器不匹配用prob2struct轉(zhuǎn)換或手動指定solver5.1 目標(biāo)函數(shù)出現(xiàn) NaN 的排查清單如果遇到目標(biāo)函數(shù)返回NaN按以下順序排查在目標(biāo)函數(shù)入口打印變量值disp(x)觀察 NaN 出現(xiàn)前最后一次有效變量是多少檢查是否存在log(負(fù)數(shù))、sqrt(負(fù)數(shù))、x / 0等運算檢查變量邊界是否設(shè)得太寬導(dǎo)致搜索到無意義區(qū)域在目標(biāo)函數(shù)中做保護function S obj_fun(x) r x(1); h x(2); if r 0 || h 0 S 1e10; % 返回一個很大的懲罰值 return; end S 2 * pi * r^2 2 * pi * r * h; end5.2 如何選擇合適的算法這是一個高頻問題。fmincon的Algorithm選項經(jīng)常讓人糾結(jié)我總結(jié)了一套經(jīng)驗算法適用場景特點interior-point默認(rèn)通用性強適合大規(guī)模問題內(nèi)存占用低sqp中等規(guī)模、約束較多收斂快精度高適合工程優(yōu)化active-set小規(guī)模、線性約束為主迭代清晰但速度偏慢trust-region-reflective只含邊界約束或線性等式約束需要目標(biāo)函數(shù)提供梯度如果你的問題規(guī)模不大變量少于 20 個我建議優(yōu)先嘗試sqp它在大多數(shù)工程場景下表現(xiàn)穩(wěn)定。5.3 優(yōu)化結(jié)果不合理怎么辦有時候優(yōu)化算法返回了數(shù)學(xué)意義上的最優(yōu)解但工程上無法接受。比如半徑太小導(dǎo)致加工困難或者高度數(shù)值不整。這種情況下不要急著懷疑算法而是應(yīng)該重新審視邊界條件把工藝約束加入lb和ub在目標(biāo)函數(shù)中加入工藝懲罰項考慮引入離散變量如果尺寸必須是整數(shù)可考慮ga配合整數(shù)規(guī)劃。6. 最佳實踐與工程建議6.1 盡量用解析梯度MATLAB 優(yōu)化工具箱支持在目標(biāo)函數(shù)中返回梯度值。提供解析梯度可以顯著提高收斂速度和精度。示例function [S, grad] obj_fun_grad(x) r x(1); h x(2); S 2 * pi * r^2 2 * pi * r * h; if nargout 1 grad [4 * pi * r 2 * pi * h; % dS/dr 2 * pi * r]; % dS/dh end end然后在選項中開啟梯度options optimoptions(fmincon, ... SpecifyObjectiveGradient, true, ... Algorithm, sqp);如果對求導(dǎo)不熟練也可以先用 MATLAB 符號工具箱自動推導(dǎo)syms r h S 2 * pi * r^2 2 * pi * r * h; grad_r diff(S, r); grad_h diff(S, h);6.2 多初始點驗證不要只跑一次fmincon。建議隨機生成多個初始點批量測試求解結(jié)果觀察是否都收斂到同一個最優(yōu)值。rng(42); % 固定隨機種子保證可復(fù)現(xiàn) N 20; % 測試次數(shù) best_x []; best_fval inf; for i 1:N x0 [0.1 2.4 * rand(), 0.1 5.9 * rand()]; try [x_tmp, fval_tmp] fmincon(obj_fun, x0, [], [], [], [], lb, ub, nonlcon_fun, options); if fval_tmp best_fval best_fval fval_tmp; best_x x_tmp; end catch % 跳過不收斂的初值 end end這種“多起點策略”是工程上最實用、最穩(wěn)妥的做法。6.3 迭代過程可視化optimoptions中有很多PlotFcn選項可以實時觀察優(yōu)化過程。optimplotfval觀察目標(biāo)函數(shù)下降曲線optimplotx觀察當(dāng)前變量值optimplotconstrviolation觀察約束違反程度。options optimoptions(fmincon, ... Display, iter, ... PlotFcn, {optimplotfval, optimplotx, optimplotconstrviolation});在調(diào)試階段這些工具能幫你快速定位問題。6.4 注意數(shù)值量級如果目標(biāo)函數(shù)值和約束值相差懸殊比如目標(biāo)函數(shù)在 1e-6 量級約束在 1e6 量級求解器的數(shù)值穩(wěn)定性會受到很大影響。建議對變量和目標(biāo)函數(shù)做歸一化處理。比如把變量縮放到[0, 1]區(qū)間或者把目標(biāo)函數(shù)乘以一個比例系數(shù)。6.5 生產(chǎn)環(huán)境的可靠性建議在正式項目中使用優(yōu)化算法工具箱時建議保存所有輸入?yún)?shù)包括初始點、選項配置、約束函數(shù)版本記錄每次求解的迭代歷史便于回溯設(shè)置最大迭代次數(shù)和最大運行時間防止程序卡死options optimoptions(fmincon, ... MaxIterations, 1000, ... MaxFunctionEvaluations, 5000, ... OptimalityTolerance, 1e-8);對結(jié)果做敏感性分析把最優(yōu)解附近的參數(shù)輕微擾動看目標(biāo)函數(shù)變化是否劇烈。如果異常敏感說明問題本身邊界條件設(shè)置可能有問題。7. 總結(jié)與下一步學(xué)習(xí)本文從優(yōu)化算法工具箱的基本概念出發(fā)詳細(xì)介紹了環(huán)境準(zhǔn)備、核心函數(shù)、問題式建模并通過“圓柱儲罐設(shè)計”案例完整演示了fmincon、遺傳算法混合優(yōu)化、solve統(tǒng)一入口的使用方法。最后整理了常見報錯、算法選型經(jīng)驗和工程落地建議。到這里你應(yīng)該掌握以下幾項關(guān)鍵能力能準(zhǔn)確判斷一個問題屬于線性規(guī)劃、二次規(guī)劃還是一般非線性約束優(yōu)化能獨立完成“建模 → 寫目標(biāo)函數(shù) → 配置選項 → 求解 → 結(jié)果分析”的完整流程能根據(jù)實際需要選擇fmincon、linprog、ga等不同求解器能處理優(yōu)化過程中常見的 NaN、不收斂、局部最優(yōu)等問題。下一步建議你把遺傳算法工具箱和優(yōu)化算法工具箱配合起來實現(xiàn)一套完整的全局優(yōu)化方案。具體可以嘗試用ga求解多峰測試函數(shù)如 Rastrigin 函數(shù)、Ackley 函數(shù)把結(jié)果作為fmincon的初始點對比直接使用fmincon的效果差異。如果你需要在工程中處理大規(guī)模問題可以繼續(xù)學(xué)習(xí)surrogate代理模型優(yōu)化和multistart多起點全局優(yōu)化工具如果做金融或工業(yè)調(diào)度可以深入研究linprog與intlinprog線性整數(shù)規(guī)劃。如果本文對你有幫助記得收藏備用。后續(xù)我還會更新粒子群工具箱、模擬退火工具箱、約束優(yōu)化實戰(zhàn)等系列內(nèi)容歡迎持續(xù)關(guān)注。