一、概述
fmincon是MATLAB中的一個優化函數,它的作用是在約束條件下求解無約束或有約束的非線性優化問題。它使用了基於內點法的算法來實現對優化問題的求解。
fmincon的定義為:[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
二、函數參數
fmincon的參數較為複雜,以下是各參數的解釋:
- fun:定義了優化目標函數,可以接受一個參數x,並返回一個標量值f。即,f = fun(x)。
- x0:定義了目標函數的初始點,x0可以是向量或矩陣。如果fun定義了一個n維目標函數,x0可以是一個n維向量,如果fun定義了一個n維目標函數的向量,x0可以是一個m×n的矩陣,其中每一行代表一個向量。
- A:定義了不等式約束矩陣,是一個m×n的矩陣,其中每一行代表一個約束條件。約束條件的矩陣表示為:A*x≤b。
- b:定義了不等式約束的值,是一個m維向量。約束條件的矩陣表示為:A*x≤b。
- Aeq:定義了等式約束矩陣,是一個p×n的矩陣,其中每一行代表一個等式約束條件。約束條件的矩陣表示為:Aeq*x=beq。
- beq:定義了等式約束的值,是一個p維向量。約束條件的矩陣表示為:Aeq*x=beq。
- lb:定義了x的下界。lb可以是一個n維向量或一個標量,其中標量表示針對所有的x。
- ub:定義了x的上界。ub可以是一個n維向量或一個標量,其中標量表示針對所有的x。
- nonlcon:定義了一個非線性約束函數,它可以使用約束向量。即,c(x)≤0表示非線性小於等於約束,c(x)>=0表示非線性大於等於約束,c(x)=0表示非線性等於約束。
- options:定義了優化時的選項參數。
三、使用示例
1. 無約束優化
function y=fmincon_nlb_demo() y = fmincon(@fun,[-0.5,1.0],[],[],[],[],[],[],@nonlcon); function [fun_value,grad] = fun(x) fun_value = x(1)^4-2*x(1)^2*x(2)+x(1)^2+x(1)+x(2)^2-2*x(1)+4; grad = [4*x(1)^3-4*x(1)*x(2)+2*x(1)+1;-2*x(1)^2+2*x(2)]; end function [cineq,ceq,gcineq,gceq]=nonlcon(x) cineq = [2*x(2)-x(1)^2-1.0;3-x(1)]; ceq = []; if nargout > 2 gcineq = [-2*x(1),2; -1,0]; gceq = []; end end end
上面的例子演示了如何使用fmincon函數實現一個無約束優化問題。在此例子中,定義了一個目標函數fun(x),而它的梯度在約束函數nonlcon(x)中被設置為一個空矩陣。通過調用fmincon函數,可以得到產生最小值的向量作為結果。
2. 有約束優化
function y=fmincon_lb_demo() A = []; b = []; Aeq = []; beq = []; lb = [-1;-1]; ub = [1;1]; y = fmincon(@fun,[-0.5,1.0],A,b,Aeq,beq,lb,ub,@nonlcon); function [fun_value,grad] = fun(x) fun_value = x(1)^4-2*x(1)^2*x(2)+x(1)^2+x(1)+x(2)^2-2*x(1)+4; grad = [4*x(1)^3-4*x(1)*x(2)+2*x(1)+1;-2*x(1)^2+2*x(2)]; end function [cineq,ceq,gcineq,gceq]=nonlcon(x) cineq = [2*x(2)-x(1)^2-1.0;3-x(1)]; ceq = []; if nargout > 2 gcineq = [-2*x(1),2; -1,0]; gceq = []; end end end
上面的例子演示了如何使用fmincon函數實現一個帶約束的優化問題。在此例子中,設置了不等式約束矩陣A和向量b以及上下界lb和ub。通過調用fmincon函數,可以得到產生最小值的向量作為結果。
四、方法選擇
fmincon提供了不同的方法來進行優化,這些方法可以通過options參數來設置。以下是fmincon中可用優化方法的列表。
- active-set:針對有線性似的約束,使用基於我們稱之為Active Set的方法。它是適用於中等規模問題的一種方法。
- interior-point:使用基於內點法的方法,它能夠求解大規模的非線性優化問題。
- sqp:使用Sequential Quadratic Programming(SQP)方法,該方法特別適用於帶非線性約束的優化問題。
為了選擇最適合您問題的方法,請首先嘗試使用默認方法。如果默認方法不起作用,或者您需要更快的方法,您可以考慮使用其他的方法。請注意,除了默認方法之外,其他方法可能需要更多的內存或更長的計算時間。以下是選擇方法的代碼示例:
options=optimset('Algorithm','active-set'); [x,fval,exitflag,output]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
五、輸出參數
fmincon的輸出包含了最優解、最優值、退出標誌、迭代次數、迭代輸出、拉格朗日乘子和目標函數的梯度和黑塞矩陣(一般情況下,黑塞矩陣不能直接使用)。
- x:代表最優解向量
- fval:代表目標函數的最小值
- exitflag:代表終止標誌,如果它為正值,則表示找到了滿足約束條件的最小值,值越接近0代表越卡在邊界上,如果小於0則表明沒有找到解。
- output:是一個結構,包含了一些額外的輸出參數
- lambda:是一個結構,在最優解的位置處計算一個較低層次的函數的梯度。每個輸出都是一個向量或是矩陣。
- grad:代表目標函數的梯度
- hessian:代表Hessian矩陣。它是目標函數二階導數的導數,因此只有在目標函數是二次函數時才能使用。
六、總結
fmincon是MATLAB中一個非常重要的函數,它可以實現各種類型的優化問題的求解,包括無約束和帶約束優化問題。使用fmincon可以快速且可靠地求解一些複雜的最優化問題。熟練掌握fmincon的使用方法,可以提高工程開發效率。
原創文章,作者:GIDZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148302.html