• 沒有找到結果。

MATLAB 求函數極小(大)值

N/A
N/A
Protected

Academic year: 2021

Share "MATLAB 求函數極小(大)值"

Copied!
12
0
0

加載中.... (立即查看全文)

全文

(1)

MATLAB 求函數極小(大)值

(2)

函數的極值

n

函數的極值(極大值或極小值)可從兩個角度來談,一為 絕對的極值 (absolute or global extreme value),另一 為相對的極值(relative or local extreme value)

n 絕對的極值:在所有定義域內中的極大值或極小值

n 相對的極值:在定義域內某一區間中的極大值或極小值

(3)

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 x

y = 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

(4)

求單變數函數之極小值

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

£ £

u

f x f x x x x

0 £ £ x 8 ( ) cos( ) =

-2x

f x x e

ymin = -0.0076 index =

26 xmin =

2.0202 f(x) 稱為目標函數 (objective function)

(5)

求單變數函數之極小值

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( ) =

-2x

f x x e 0 £ £ x 8

x =

2.0344 fval =

-0.0076

(6)

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);

(7)

求多變數函數之極小值

n

尋找多變數之函數 f(x

1

,x

2

,…) 之極小值

n

利用前述方法一過於複雜,不建議使用

n

利用MATLAB內建函數 fminsearch

( )

1 2

* *

1

, ,

2

= min ( , , )

, , 1 2

L

x x L

L

f x x f x x

[x, fval] = fminsearch(@fun, x0)

x: 使函數值最小之 x 值 fval: 函數之極小值

fun: 定義目標函數的 function m-file 檔名 x0: 起始猜值

(8)

求多變數函數之極小值

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

)

2

f x x x x x

x =

1.0000 1.0000 fval =

2.1718e-010

(9)

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

(10)

求多變數函數之極小值

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. >

(11)

求函數之極大值

n

尋找函數 f(x) 之極大值

n

方法一:在區間內取點,計算這些點的函數值,然 後利用 max 指令找出其極大值

n

方法二:利用MATLAB內建函數 fminbnd (單變數) 或 fminsearch (多變數)

n

將找極大值之問題轉換成找極小值之問題

n

fmax = -fmin

( )

*

= max ( )

x

f x f x

( )

*

= max ( )

x

Þ ( )

*

= min

x

( - ( ) )

f x f x f x f x

f(x) -f(x)

(12)

Exercise

n

f (x

1

,x

2

) = 12x

1

- 4x

2

- 2x

12

+ 2x

1

x

2

- x

22

,求 f 之極大值

4, 2, -20

參考文獻

相關文件

- 絕對數值為零

[r]

於是我們若想要在已知函數值的某一點,了解附近大概的函

以下簡單介紹魔術三角形: 如圖 1, 若三角形每邊有 三個數且數字和都是定值, 稱為 3 階 (傳統) 魔術三角形; 如圖 2, 若每邊有三 個數且較大兩數和減最小數的差都是定值, 稱為

對任意連續函數,每個小區間上的取樣點 x 都選擇在函數最 大值與最小值發生的點。如下圖,淺色方塊的高度都挑選小

此極限便是觀察分子或者分母誰「跑得比較快」。若是分子 趨近無窮大的速度快很多,則極限為無窮大 ,若是分母快很 多,則極限便是

先看 lim h-&gt;0 (sin h)/h ,這個極限值其實也不是很明顯,但透

對於給定的一個 x 值,經過某一對應方式後得到「唯一」的 y 值,這種對應方式我們稱 為函數,其中 x 是自變數,y 是應變數。. 而在表