반응형

 

 

 

Van der Pol Oscillator 의 상태방정식을 표현하면 다음과 같다.

$$ \left[ \matrix{\dot{x}_1 \\ \dot{x}_2} \right] = \left[ \matrix{0 && 1 \\ -1 && \mu (1-x_1^2 ) } \right] \left[\matrix{x_1 \\ x_2} \right] $$

수식만을 분석해보면 시스템 행렬의 $x_1^2$ 항이 커지면서 $x_2$ 상태를 안정하게 만들어주지만, 1보다 작게되면 $\mu$ 성분으로 인해 극점이 허수가 되므로, 안정과 불안정을 넘나들게 된다. 그래서 다음의 거동 분석과 같이 $mu$가 음수인 그래프와 같이 안정해지고, 아니라면 Limit Cycle을 그리면서 위상 평면 상에서 특정 패턴을 그리게 된다.

 

Van der Pol Oscillator 거동 분석

다음 식으로 항 별로 계수를 추가하고 항들에 따른 거동은 다음과 같다.

$$\ddot{x}_1 - \mu \left( 1- a x_1^2 \right) \dot{x}_1 + b x_1 = 0 $$

$$\cases{\dot{x}_1 = x_2 \\ \dot{x}_2 = \mu\left(1-a x_1^2 \right) \ddot{x}_1 - b x_1 } $$

 

mu가 0 이상이면 Limit Cycle이 생성되기 시작하며

mu > 0 이면 Limit Cycle 의 편향이 심해진다.

mu < 0 이면 Limit Cycle을 생성하지 않고 원점으로 수렴한다.

a > 0 이면 Limit Cycle의 크기가 역수배로 증가한다.

b > 0 이면 주기가 빨라진다.

a <= 0 혹은 b<=0 이면 발산한다.

 

다음의 식에서 c를 조절하면 다음과 같다.

$$ \dot{x}_1 =c x_2 $$

 

 

코드는 다음과 같다.

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import numpy as np
import matplotlib.pyplot as plt
 
dt = 0.01
endtime = 5000
 
lists = [00.010.10.5123]
legend_name = list()
for a in lists:
  mu = 1
  a = a
  b = 1
 
  x = [11]
  data = dict()
  data['t'= list()
  data['x1'= list()
  data['x2'= list()
 
  t = 0
  x1 = x[0]
  x2 = x[1]
 
  for idx in np.arange(0, endtime):
    t = t + dt
    dx1 = x2
    dx2 = - b * x1 + mu * (1 - a * x1 * x1) * x2
 
    x1 = x1 + dx1 * dt
    x2 = x2 + dx2 * dt
    data['t'].append(t)
    data['x1'].append(x1)
    data['x2'].append(x2)
 
  plt.plot(data['x1'], data['x2'])
  legend_name.append("a={}".format(a))
 
plt.grid()
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend(legend_name)
plt.axis([-55-55])
plt.title("Van der Pol Oscillator, mu=1, b=1\nx'' - mu (1-a*x*x)x' + b x = 0")
plt.show()
cs

 

비교 : 1차 시스템의 PI 피드백 제어

1차 안정 시스템에 대한 PI 제어기로 음성 피드백을 구성한 시스템

$$\dot{x} = -a x + u$$

제어 입력은 다음과 같으며 상태 공간에서 정리할 수 있다.

$$u = k_p e + \int k_i e dt $$

$$\cases{\dot{e}_I = k_i e \\ u = e_i + k_p e} $$

피드백 시스템의 오차 동역학을 구하고자 다음과 같이 명령을 정의하면

$$\dot{x}_c = 0, x_c = \text{Const}$$

$$e = x_c - x$$

$$\dot{e} = \dot{x}_c - \dot{x} = 0 - \dot{x} = a x - u$$

$$\dot{e} = -a (e-x_c) - u$$

$$\dot{e} = -a (e-x_c) - k_p e - \int k_i e dt $$

$$\cases{\dot{e}_i = 0 + k_i e \\ \dot{e} = - e_i - (k_p + a) e} $$

$$\left[ \matrix{e_i \\ e} \right] = \left[ \matrix{0 && k_i \\ -1 && -(k_p + a) } \right] \left[\matrix{e_i \\ e} \right] $$

 

 

** EOF **

728x90

'G.N.C.' 카테고리의 다른 글

이산 선형 칼만 필터 중간 유도 정리  (0) 2024.04.11
PID, Anti-Windup 구현  (0) 2023.10.16

+ Recent posts