πŸ‘Ύ CS

[μˆ˜μΉ˜ν”„λ‘œκ·Έλž˜λ°] ν™©κΈˆλΆ„ν•  탐색법

Mu Gyum 2023. 10. 28. 17:54

ν™©κΈˆλΆ„ν•  탐색법

ν•΄λ‹Ή 탐색법은 말 κ·ΈλŒ€λ‘œ Euclid의 ν™©κΈˆλΉ„λ₯Ό μ΄μš©ν•˜μ—¬ μš°λ¦¬κ°€ μ›ν•˜λŠ” μ΅œμ κ°’μ— λ„λ‹¬ν•˜λŠ” 방식이닀.

 

ν™©κΈˆλΉ„μ˜ μ •μ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

 


νŠΉμ§•

- ν•œ 개의 μ΅œμ†Œκ°’μ„ ν¬ν•¨ν•˜κ³  μžˆλŠ” κ΅¬κ°„μ—μ„œ μ΅œμ†Œκ°’μ„ νƒμƒ‰ν•˜λŠ” 방법 쀑 ν•˜λ‚˜

- 이뢄법(Bisection Method)μ—μ„œ ν•œ 개의 쀑간값을 μ‚¬μš©ν•˜λŠ” κ²ƒκ³ΌλŠ” λ‹€λ₯΄κ²Œ, ν™©κΈˆλ°˜ν•  탐색법은 μ΅œμ†Œκ°’μ˜ λ°œμƒ μ—¬λΆ€λ₯Ό μ•ŒκΈ° μœ„ν•΄ 두 개의 쀑간 ν•¨μˆ«κ°’μ΄ ν•„μš”ν•˜λ‹€

- μ΄λŸ¬ν•œ 방법이 효율적이기 μœ„ν•΄μ„œλŠ” 쀑간점듀은 ν˜„λͺ…ν•˜κ²Œ 선택해야 ν•˜λ©°, μ΄λΆ„λ²•μ—μ„œμ²˜λŸΌ 이전값을 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ μΉ˜ν™˜ν•¨μœΌλ‘œμ¨ ν•¨μˆ˜ 계산을 μ΅œμ†Œν™”μ‹œν‚¨λ‹€.

 


μ•Œκ³ λ¦¬μ¦˜

 

ν•΄λ‹Ή 그림을 보자

μš°λ¦¬λŠ” xl, xr을 톡해 μ•„λž˜μ²˜λŸΌ x1, x2λ₯Ό 계산할 수 μžˆλ‹€.

그리고 x1, x2에 ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ«κ°’ λ˜ν•œ 계산이 κ°€λŠ₯ν•˜λ‹€. 

1. 이미지 (b)λ₯Ό 보면 f(x2) > f(x1)인 λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

2. 이후 ν•΄λ‹Ή x2λ₯Ό xl둜 μΉ˜ν™˜ν•˜λŠ” 과정을 톡해 λ²”μœ„λ₯Ό 쒁힐 수 μžˆλ‹€. 

{f(x2) < f(x1)라면 xr=x1 μΉ˜ν™˜}

 

μœ„μ˜ 과정을 iterativeν•˜κ²Œ λ°˜λ³΅ν•˜μ—¬ μ–΄λŠμ •λ„ μš°λ¦¬κ°€ μ›ν•˜λŠ” error rate에 μ§„μž…ν–ˆλ‹€λ©΄, xlκ³Ό xrλ₯Ό λ°˜ν™˜ν•˜μ—¬ κ²°κ³Όλ₯Ό λ‚Ό 수 μžˆλ‹€. 


μž₯점

- ν™©κΈˆλΉ„λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œμ˜ μž₯점은 이전값이 μƒˆλ‘œμš΄ 값이 λ˜μ–΄ μƒˆλ‘œμš΄ ν•¨μˆ«κ°’μ„ κ°±μ‹ ν•  ν•„μš”κ°€ μ—†μŒμ„ μ˜λ―Έν•œλ‹€.

 

++++

 

ν™©κΈˆλΆ„ν•  νƒμƒ‰λ²•μ—μ„œ ν•¨μˆ˜κ³„μ‚°μ˜ 수λ₯Ό μ΅œμ†Œν™”ν•˜κ³ μžν•˜λŠ” 두 κ°€μ§€ 이유

1. ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ΄ λŒ€ν˜• κ³„μ‚°μ˜ 일뢀인 κ²½μš°κ°€ μžˆλ‹€. μ΄λŸ¬ν•œ 경우 μ—¬λŸ¬ 번 ν™©κΈˆλΆ„ν• νƒμƒ‰μ„ λΆ€ν”„λ‘œκ·Έλž¨μ„ λΆ€λ₯΄κ²Œ λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ κ³„μ‚°μ˜ 수λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

2. μ‹œκ°„μ΄ 많이 λ“œλŠ” 계산을 ν•  λ•Œ μœ λ¦¬ν•˜λ‹€. -> ν™©κΈˆ 뢄할을 μ΄μš©ν–ˆκΈ° λ•Œλ¬Έμ— μ–΄λ–€ μ„ νƒλ˜μ§€ μ•Šμ€ x1, x2의 경우 λ‹€μŒ iterationμ—μ„œμ˜ x1 λ˜λŠ” x2κ°€ 될 수 μžˆλ‹€.


μ—λŸ¬ 계산

ν™©κΈˆλΉ„ νƒμƒ‰μ˜ μ’…λ£ŒνŒμ •κΈ°μ€€μ„ 살짝 νŠΉμ΄ν•œλ° 계산은 λ‹€μŒκ³Ό κ°™λ‹€.

x_optλž€ λ‚΄κ°€ μ„ νƒν•œ x1λ˜λŠ” x2λ₯Ό μ˜λ―Έν•œλ‹€.. 


μ½”λ“œ

function [x,fx,ea,iter]=goldmin(f,xl,xu,es,maxit,varargin)
  phi=(1+sqrt(5))/2;
  iter=0;
  while(1)
    d=(phi-1)*(xu-xl);
    x1=xl+d;
    x2=xu-d;
    if f(x1, varargin{:}) < f(x2, varargin{:})
      xopt=x1;
      xl=x2;
    else
      xopt=x2;
      xu=x1;
    endif
    iter=iter+1;
    if xopt~=0, ea=(2-phi)*abs((xu-xl)/xopt)*100; endif
    if ea <= es || iter >= maxit, break, end
  endwhile
  x=xopt;
  fx=f(xopt, varargin{:});
end

κ²°κ³Ό