Matlab數學建模學習筆記——非線性規划


非線性規划

非線性規划的matlab解法

fmincon函數

x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
% x0是x的初始值,fun是用M文件定義的函數f(x),nonlcon是M文件定義的非線性向量函數c(x),ceq(x);options定義了優化參數,可以用Matlab默認的參數設置
x = fmincon(problem)
[x,fval] = fmincon(___)
[x,fval,exitflag,output] = fmincon(___)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

e.g

\[\min f(x)=x_1^2+x_2^2+x_3^2+8,\\ s.t.= \begin{cases} x_1^2-x_2+x_3^2 \geq 0,\\ x_1+x_2^2+x_3^3 \leq 20,\\ -x_1-x_2^2+2=0,\\ x_2+2x_3^2=3,\\ x_1,x_2,x_3 \geq 0 。 \end{cases} \]

對於這道題,我們需要編寫三個m文件

% filename :'fun1.m'
function f = fun1(x)
f = sum(x.^2)+8;
% filename :'fun2.m'
function [g,h] = fun2(x)
g = [-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(3)^3-20]; % 非線性不等式約束
h = [-x(1)-x(2)^2+2
    x(2)+2*x(3)^2-3]; % 非線性等式約束
% filename :'main.m'
clear;
clc;
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2');

求得當x1=0.5522, x2=1.2033, x3=0.9478時,最小值y=10.6511

fminsearch函數(求極小值)

\[f(x)=sin(x)+3 \]

例如我們要求\(f(x)\)取得極小值時x的值,代碼如下

% filename :'fun.m'
function f = fun(x);
f = sin(x) +3;
% filename :'main.m'
x0 = 2;
[x,y] = fminsearch(@ fun,x0)

計算函數的零點和方程組的解

\[求多項式f(x)=x^3-x^2+2x-3的零點 \]

法一

clear;
clc;
xishu = [1,-1,2,-3];
x = roots(xishu);
x =

  -0.1378 + 1.5273i
  -0.1378 - 1.5273i
   1.2757 + 0.0000i

法二

clear;
clc;
syms x
x0 = solve(x^3-x^2+2*x-3);%求函數零點的符號解
x0 = vpa(x0,5); % 化成小數格式的數據,5為有效數字

法三

clear;
clc;
y = @(x)x^3-x^2+2*x-3;
x = fsolve(y,rand);% 只能求給定初始值附近的一個零點

約束極值問題

二次規划

H為實對稱矩陣

求解命令

x = quadprog(H,f)
x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
x = quadprog(problem)
[x,fval] = quadprog(___)
[x,fval,exitflag,output] = quadprog(___)
[x,fval,exitflag,output,lambda] = quadprog(___)

罰函數法

利用罰函數法,可將非線性規划規划問題的求解,轉化為求解一系列無約束極值問題,也可稱這種方法為序列無約束最小化技術

思想是利用題目中的約束函數做出適當的罰函數,由此構造出帶參數的增廣目標函數,把問題轉化成無約束非線性規划問題。主要有兩種形式,一種叫外罰函數法,另一種叫內罰函數法

外罰函數法

\[\min f(x),\\ s.t. \begin{cases} g_i(x) \leq 0,& i=1,\dots,r,\\ h_j(x) \geq0, & j =1,\dots,s,\\ k_m(x)=0, &m=1,\dots,t \end{cases} \]

取一個充分大的數M>0,構造函數

\[P(x,M)=f(x)+M\sum_{i=1}^r \max (g_i(x),0)-M\sum_{j=1}^s \min (h_j(x),0)+M\sum_{m=1}^t |k_m(x)| \]

在matlab中可以直接利用max,min,sun函數

注意:如果非線性規划問題要求實時算法,則可以使用罰函數的方法,但是計算精度較低。

matlab求約束極值問題

Matlab中用於求解約束最優化問題的函數有

fminbnd、fmincon、quadprog、fseminf、fminimax

fminbnd函數

求單變量非線性函數在區間上的極小值

\[\min _x f(x),x\in[x_1,x_2] \]

[x,fval]=fminbnd(fun,x1,x2,options)

返回值是極小點x和函數的極小值。fun是用M文件定義的函數、匿名函數或Matlab中的單變量數學函數

fseminf函數

\[\min f(x),\\ s.t. \begin{cases} A \cdot x \leq b,\\ Aeq \cdot x =beq,\\ lb \leq x \leq ub,\\ c(x) \leq 0,\\ ceq(x)\leq 0,\\ K_i(x,\omega_i) \leq 0,1 \leq i \leq n \end{cases} \]

c(x), ceq(x)為向量函數;K_i(x, \(\omega_i\))為標量函數,\(\omega_1,\dots,\omega_n\)為附加的便令

Matlab命令格式為

[x,fval]=fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)

fminimax函數

求解

\[\min _x \max _i F_i(x),\\ s.t. \begin{cases} A \cdot x \leq b,\\ Aeq \cdot x =beq,\\ c(x) \leq 0,\\ ceq(x) = 0,\\ lb \leq x \leq ub,\\ \end{cases} \]

matlab命令為

[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM