MATLAB 求函數極小(大)值
函數的極值
n
函數的極值(極大值或極小值)可從兩個角度來談,一為 絕對的極值 (absolute or global extreme value),另一 為相對的極值(relative or local extreme value)
n 絕對的極值:在所有定義域內中的極大值或極小值
n 相對的極值:在定義域內某一區間中的極大值或極小值
n
單一變數函數
n
多變數函數
n y = f (x1, x2, …, xn)為一函數。若 f 在 x* 上有極值,則
函數極值的發生處
0 x0 x
y = f (x)
f ¢ (x) = 0 f ² (x) > 0
f '(x) < 0 f '(x) > 0
f '(x) < 0
0
x0 xy = f (x)
f ¢ (x) = 0 f ² (x) < 0
f '(x) > 0
極小值 極大值
* * *
1 2
( ) 0 , ( ) 0 , , ( ) 0
n
f f f
x x x
x x x
¶ = ¶ = ¶ =
¶ ¶ L ¶
求單變數函數之極小值
n
在特定區間尋找單一變數之函數 f(x) 之極小值
n
方法一:在區間內取點,計算這些點的函數 值,然後利用 min 指令找出其極小值
Ex. 求 之極小值,其中
>> x=linspace(0,8,100);
>> y=cos(x).*exp(-2*x);
>> [ymin index]=min(y)
>> xmin=x(index)
( )
*= min ( ) ,
x l£ £
uf x f x x x x
0 £ £ x 8 ( ) cos( ) =
-2xf x x e
ymin = -0.0076 index =
26 xmin =
2.0202 f(x) 稱為目標函數 (objective function)
求單變數函數之極小值
n
方法二:利用MATLAB內建函數 fminbnd
Ex. 求 之極小值,其中
*step 1. edit fun.m
function F=fun(x) F=cos(x)*exp(-2*x);*step 2. 求解(回到 Matlab Command Window )
>> [x, fval]=fminbnd(@fun, 0, 8)
[x, fval] = fminbnd(@fun, x1, x2)
x: 使函數值最小之 x 值 fval: 函數之極小值
fun: 定義目標函數的 function m-file 檔名 x1: 區間下限 , x2: 區間上限
( ) cos( ) =
-2xf x x e 0 £ £ x 8
x =
2.0344 fval =
-0.0076
n
驗證答案
n 計算 df/dx è diff
>> syms x
>> dfdx = diff(cos(x)*exp(-2*x))
n 求解 df/dx = 0 è fzero
2. 求解
>> x = fzero(‘fun’, 1) dfdx =
-sin(x)*exp(-2*x)-2*cos(x)*exp(-2*x)
x =
2.0344
1. edit fun.m
function dfdx = fun(x)
dfdx = -sin(x)*exp(-2*x)-2*cos(x)*exp(-2*x);
求多變數函數之極小值
n
尋找多變數之函數 f(x
1,x
2,…) 之極小值
n
利用前述方法一過於複雜,不建議使用
n
利用MATLAB內建函數 fminsearch
( )
1 2
* *
1
, ,
2= min ( , , )
, , 1 2L
x x LL
f x x f x x
[x, fval] = fminsearch(@fun, x0)
x: 使函數值最小之 x 值 fval: 函數之極小值
fun: 定義目標函數的 function m-file 檔名 x0: 起始猜值
求多變數函數之極小值
Ex: 求 之極小值
*step 1. edit fun.m
function F = fun(x)
F = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
*step 2. 求解(回到Matlab Command Window)
>> [x, fval] = fminsearch(@fun, [2 3])
(
1, 2)
=100(
2 - 12)
2 + -(
1 1)
2f x x x x x
x =
1.0000 1.0000 fval =
2.1718e-010
n
驗證答案
n 計算 df/dx1 與 df/dx2 è diff
>> syms x1 x2
>> dfdx1 = diff(100*(x2-x1^2)^2+(1-x1)^2, x1)
>> dfdx2 = diff(100*(x2-x1^2)^2+(1-x1)^2, x2)
n 求解 df/dx1 = 0 與 df/dx1 = 0 è fsolve
2. 求解
>> x = fsolve('fun', [0 0.5]) dfdx1 =
-400*(x2-x1^2)*x1-2+2*x1
x =1.0000 1.0000 1. edit fun.m
function dfdx = fun(x)
dfdx(1) = -400*(x(2)-x(1)^2)*x(1)-2+2*x(1);
dfdx(2) = 200*x(2)-200*x(1)^2;
dfdx2 =
200*x2-200*x1^2
求多變數函數之極小值
n
欲傳其他參數給 function m-file
n
M-file定義檔格式 : 輸入為 x, p1, p2
[x, fval] = fminsearch(@fun, x0, options, p1, p2)
x: 使函數值最小之 x 值 fval: 函數之極小值
fun: 定義目標函數的 function m-file 檔名 x0: 起始猜值
options: fminsearch之設定選項,若不指定則以 [ ] 代替 p1, p2:傳給 fun.m 之參數
function F = fun(x, p1, p2)
F = < Insert an objective function here. >
求函數之極大值
n
尋找函數 f(x) 之極大值
n
方法一:在區間內取點,計算這些點的函數值,然 後利用 max 指令找出其極大值
n
方法二:利用MATLAB內建函數 fminbnd (單變數) 或 fminsearch (多變數)
n
將找極大值之問題轉換成找極小值之問題
n
fmax = -fmin
( )
*= max ( )
xf x f x
( )
*= max ( )
xÞ ( )
*= min
x( - ( ) )
f x f x f x f x
f(x) -f(x)
Exercise
n
f (x
1,x
2) = 12x
1- 4x
2- 2x
12+ 2x
1x
2- x
22,求 f 之極大值
4, 2, -20