주요 콘텐츠

lsim

임의 입력에 대한 동적 시스템의 시간 응답 시뮬레이션 데이터 계산

설명

응답 데이터

y = lsim(sys,u,t)는 입력과 동일한 시간 t에 샘플링된, 입력 u에 대한 시스템 응답 y를 반환합니다. 단일 출력 시스템의 경우 yt와 동일한 길이의 벡터입니다. 다중 출력 시스템의 경우 y는 시간 샘플 개수만큼의 행과 sys의 출력 개수만큼의 열을 갖는 배열입니다.

예제

y = lsim(sys,u,t,IC)sys가 상태공간 모델일 경우 t(1)에서의 초기 조건 IC를 추가로 지정합니다.

y = lsim(sys,u,t,IC,p)sys가 LPV 모델인 경우 파라미터 궤적 p를 지정합니다. (R2023a 이후)

예제

[y,tOut] = lsim(___)은 시뮬레이션에 사용된 시간 샘플 tOut을 반환합니다.

[y,tOut,x] = lsim(___)sys가 상태공간 모델인 경우 상태 궤적 x도 반환합니다.

예제

[y,tOut,x,pOut] = lsim(sys,u,t,IC,p)sys가 LPV 모델인 경우 파라미터 궤적을 반환합니다. (R2023a 이후)

입력 보간 방법

[___] = lsim(___,method)sys가 연속시간 모델인 경우 lsim이 샘플 간의 입력값을 어떻게 보간하는지 지정합니다.

상태 스냅샷 POD

R2024b 이후

[y,tOut,x,~,xPODOut] = lsim(___,xPODIn)은 LTI 상태공간 모델 sys의 상태 스냅샷에 대한 적합 직교 분해(POD)를 수행합니다. 여기서 xPODincrementalPOD 객체입니다. 새 POD 분석을 시작하거나 이전 POD 결과에 추가할 수 있습니다. 예제 및 모델 축소 응용 사례는 incrementalPOD 항목과 reducespec 항목을 참조하십시오.

예제

[y,tOut,x,~,xPODOut] = lsim(___,xPODIn,method)sys가 연속시간 모델인 경우 입력 신호 보간 방법을 지정합니다.

응답 플롯

lsim(___)은 상태 스냅샷 POD를 제외하고 위에 열거된 모든 입력 인수의 조합에 대해 입력 이력(u,t)에 대한 sys의 시뮬레이션된 시간 응답을 플로팅합니다. 플롯은 디폴트 플로팅 옵션을 사용합니다. 플롯 사용자 지정 옵션이 더 필요하면 lsimplot을 대신 사용하십시오.

  • 여러 동적 시스템의 응답을 동일한 플롯에 플로팅하려면 sys를 쉼표로 구분된 모델 목록으로 지정할 수 있습니다. 예를 들어, lsim(sys1,sys2,sys3,u,t)는 세 모델의 응답을 동일한 플롯에 플로팅합니다.

  • 플롯에 있는 각 시스템의 색, 선 스타일 및 마커를 지정하려면 각 시스템의 LineSpec 값을 지정합니다. 예를 들어, lsim(sys1,LineSpec1,sys2,LineSpec2,u,t)는 두 모델을 플로팅하고 각각의 플롯 스타일을 지정합니다. LineSpec 값 지정에 대한 자세한 내용은 lsimplot 항목을 참조하십시오.

선형 시뮬레이션 툴

lsim(sys)sys 시뮬레이션을 위해 선형 시뮬레이션 툴을 엽니다. 선형 분석에 이 툴을 사용하는 방법에 대한 자세한 내용은 선형 시뮬레이션 툴로 작업하기를 참조하십시오.

예제

모두 축소

다음과 같은 전달 함수가 있다고 가정하겠습니다.

sys = tf(3,[1 2 3])
sys =
 
        3
  -------------
  s^2 + 2 s + 3
 
Continuous-time transfer function.
Model Properties

임의의 입력 신호에 대해 이 시스템의 응답을 계산하려면, 응답을 계산할 시간 t로 구성된 벡터와 해당 신호 값을 포함하는 벡터 ulsim에 제공하십시오. 예를 들어 시간 t = 0일 때 0으로 시작한 다음, t = 1일 때 0에서 증가하여 t = 2일 때 1에 도달한 후 1에서 정상 상태를 유지하는 램프 계단 신호에 대한 시스템 응답을 플로팅해 보겠습니다. t를 정의하고 u의 값을 계산합니다.

t = 0:0.04:8;  % 201 points
u = max(0,min(t-1,1));

출력 인수 없이 lsim을 사용하여 신호에 대한 시스템 응답을 플로팅합니다.

lsim(sys,u,t)
grid on

MATLAB figure

플롯은 적용된 입력 (u,t)를 회색으로 표시하고 시스템 응답을 파란색으로 표시합니다.

출력 인수와 함께 lsim을 사용하여 시뮬레이션된 응답 데이터를 얻습니다.

y = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

벡터 y에는 t의 대응하는 시간에 시뮬레이션된 응답이 포함됩니다.

gensig를 사용하여, lsim과 함께 사용할 사인파 및 구형파 같은 주기적 입력 신호를 만듭니다. 다음 SISO 상태공간 모델의 구형파에 대한 응답을 시뮬레이션합니다.

A = [-3 -1.5; 5 0];
B = [1; 0];
C = [0.5 1.5];
D = 0;
sys = ss(A,B,C,D);

이 예제에서는 주기 10초와 지속 시간 20초의 구형파를 만듭니다.

[u,t] = gensig("square",10,20);

gensig는 시간 스텝으로 구성된 벡터 t와 입력 신호의 대응되는 값을 포함하는 벡터 u를 반환합니다. t에 샘플 시간을 지정하지 않을 경우 gensig는 주기당 64개 샘플을 생성합니다. 이러한 벡터를 lsim과 함께 사용하고 시스템 응답을 플로팅합니다.

lsim(sys,u,t)
grid on

MATLAB figure

플롯은 적용된 구형파를 회색으로 표시하고 시스템 응답을 파란색으로 표시합니다. 출력 인수와 함께 lsim을 호출하여 t에 있는 각 점에서의 응답 값을 얻습니다.

[y,~] = lsim(sys,u,t);

이산시간 시스템의 응답을 시뮬레이션할 때 시간 벡터 tTi:dT:Tf 형식이어야 합니다. 여기서 dT는 모델의 샘플 시간입니다. 램프 계단 입력에 대한 다음 이산시간 전달 함수의 응답을 시뮬레이션합니다.

sys = tf([0.06 0.05],[1 -1.56 0.67],0.05);

이 전달 함수의 샘플 시간은 0.05초입니다. 동일한 샘플 시간을 사용하여 시간 벡터 t와 램프 계단 신호 u를 생성합니다.

t = 0:0.05:4;  
u = max(0,min(t-1,1));

시스템 응답을 플로팅합니다.

lsim(sys,u,t)

MATLAB figure

주기적 입력 신호에 대한 이산시간 시스템의 응답을 시뮬레이션하려면 동일한 샘플 시간을 gensig와 함께 사용하여 입력을 생성하십시오. 예를 들어, 주기 1초와 지속 시간 4초의 사인파에 대한 시스템 응답을 시뮬레이션해 보겠습니다.

[u,t] = gensig("sine",1,4,0.05);

시스템 응답을 플로팅합니다.

lsim(sys,u,t)

MATLAB figure

lsim을 사용하면 여러 동적 시스템의 시뮬레이션된 응답을 동일한 축에 플로팅할 수 있습니다. 예를 들어 PI 제어기를 가진 시스템과 PID 제어기를 가진 시스템의 폐루프 응답을 비교해 보겠습니다. 이 시스템의 전달 함수를 만들고 이 제어기들을 조정합니다.

H = tf(4,[1 10 25]);
C1 = pidtune(H,'PI');
C2 = pidtune(H,'PID');

폐루프 시스템을 형성합니다.

sys1 = feedback(H*C1,1);
sys2 = feedback(H*C2,1);

주기 4초의 구형파에 대한 두 시스템의 응답을 플로팅합니다.

[u,t] = gensig("square",4,12);
lsim(sys1,sys2,u,t)
grid on
legend("PI","PID")

MATLAB figure

기본적으로 lsim은 플로팅하는 각 시스템에 대해 다른 색을 선택합니다. LineSpec 입력 인수를 사용하여 색과 선 스타일을 지정할 수 있습니다.

 lsim(sys1,"r--",sys2,"b",u,t)
 grid on
 legend("PI","PID")

MATLAB figure

첫 번째 LineSpec "r--"은 PI 제어기 응답에 빨간색 파선을 지정합니다. 두 번째 LineSpec "b"는 PID 제어기 응답에 파란색 실선을 지정합니다. 지정된 색과 선 스타일이 범례에 반영됩니다. 플롯 사용자 지정 옵션이 더 필요하면 lsimplot을 사용하십시오.

MIMO 시스템의 경우 각 시간 스텝 t에서 입력 u(t)는 입력 개수를 길이로 갖는 벡터입니다. lsim을 사용하려면 uNt×Nu 차원의 행렬로 지정하십시오. 여기서 Nu는 시스템 입력 개수이고 Ntt의 길이입니다. 즉, u의 각 열은 대응하는 시스템 입력에 적용되는 입력 신호입니다. 예를 들어 입력이 4개인 시스템을 201개 시간 스텝에 대해 시뮬레이션하려면 u를 4개 열과 201개 행을 갖는 행렬로 제공하십시오. 여기서 각 행 u(i,:)i번째 시간 스텝에서의 입력값으로 구성된 벡터이고 각 열 u(:,j)j번째 입력에 적용되는 신호입니다.

마찬가지로 lsim에 의해 계산된 출력 y(t)는 행렬이며, 그 열들은 각 시스템 출력에서의 신호를 나타냅니다. lsim을 사용하여 시뮬레이션된 응답을 플로팅할 경우, lsim은 각 출력에 대해 개별 좌표축을 제공하여 모든 입력에 적용된 입력 u(t)에 대한 각 출력 채널의 시스템 응답을 표현합니다.

다음과 같은 상태공간 행렬을 갖는 2-입력, 3-출력 상태공간 모델이 있다고 가정하겠습니다.

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0    -0.5 -0.1;
      0.35 -0.1 -0.15
      0.65  0    0.6];
  
D = [ 0.5  0;
      0.05 0.75
      0    0];

sys = ss(A,B,C,D);

첫 번째 입력 sys에 적용된 주기 4초의 구형파와 3초마다 두 번째 입력에 적용된 펄스에 대한 sys의 응답을 플로팅합니다. 이를 위해 gensig를 사용하여 구형파와 펄스 신호를 나타내는 열 벡터를 만듭니다. 그런 다음 열을 입력 행렬로 누적합니다. 두 신호의 샘플 수가 동일하도록 동일한 종료 시간과 샘플 시간을 지정합니다.

Tf = 10;
Ts = 0.1;
[uSq,t] = gensig("square",4,Tf,Ts);
[uP,~] = gensig("pulse",3,Tf,Ts);
u = [uSq uP];
lsim(sys,u,t)

MATLAB figure

각 축에는 모든 입력에 적용된 신호 u에 대한 3개 시스템 출력 중 하나의 응답이 표시됩니다. 또한 각 플롯에는 모든 입력 신호가 회색으로 표시됩니다.

기본적으로 lsim은 모든 상태가 시뮬레이션 시작 시 0이라고 가정하며 모델을 시뮬레이션합니다. 상태공간 모델의 응답을 시뮬레이션할 경우 0이 아닌 초기 상태 값을 지정하려면 선택적 x0 입력 인수를 사용하십시오. 다음과 같은 2-상태 SISO 상태공간 모델이 있다고 가정하겠습니다.

A = [-1.5 -3;
      3   -1];
B = [1.3; 0];
C = [1.15 2.3];
D = 0;
          
sys = ss(A,B,C,D);

시스템이 2초 동안 아무런 입력 없이 이미 알고 있는 초기 상태로부터 변할 수 있도록 한 후, 단위 계단 변동을 적용한다고 가정하겠습니다. 초기 상태 값으로 구성된 벡터 x0을 지정하고 입력 벡터를 생성합니다.

x0 = [-0.2 0.3];
t = 0:0.05:8;
u = zeros(length(t),1);
u(t>=2) = 1;
lsim(sys,u,t,x0)
grid on

MATLAB figure

플롯의 전반부에서 시스템이 초기 상태 값 [-0.2 0.3]으로부터 자유롭게 변하는 것을 볼 수 있습니다. t = 2에서 입력에 대한 계단 변동이 있으며, 그 시점의 상태 값에서 시작하는 이 새 신호에 대한 시스템 응답이 표시됩니다.

출력 인수와 함께 lsim을 사용하면 시뮬레이션된 응답 데이터가 배열로 반환됩니다. SISO 시스템의 경우, 응답 데이터는 t와 동일한 길이의 열 벡터로 반환됩니다. 예를 들어 구형파에 대한 SISO 시스템의 응답을 추출해 보겠습니다. gensig를 사용하여 구형파를 만듭니다.

sys = tf([2 5 1],[1 2 3]);
[u,t] = gensig("square",4,10,0.05);
[y,t] = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

벡터 yt의 각 시간 스텝에서 시뮬레이션된 응답을 포함합니다(편의를 위해 lsim이 시간 벡터 t를 반환함).

MIMO 시스템의 경우, 응답 데이터는 N×Ny×Nu 차원의 배열로 반환됩니다. 여기서 NyNu는 동적 시스템의 출력 개수와 입력 개수입니다. 예를 들어 2-입력, 3-출력의 3-상태 시스템을 나타내는 다음과 같은 상태공간 모델이 있다고 가정하겠습니다.

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0   -0.1 -0.2;
      0.7 -0.2 -0.3
     -0.65 0   -0.6];
  
D = [ 0.1  0;
      0.1  1.5
      0    0];

sys = ss(A,B,C,D);

두 입력에 적용된 구형파에 대한 3개 출력 채널의 응답을 추출합니다.

uM = [u u];
[y,t] = lsim(sys,uM,t);
size(y)
ans = 1×2

   201     3

y(:,j)는 두 입력에 적용된 구형파에 대한 j번째 출력에서의 응답을 포함하는 열 벡터입니다. 한편 y(i,:)는 3개 값 즉, i번째 시간 스텝에서의 출력값들로 구성된 벡터입니다.

sys가 상태공간 모델이므로, 입력 신호에 대한 응답에서 상태 값의 시간 변화를 추출할 수 있습니다.

[y,t,x] = lsim(sys,uM,t);
size(x)
ans = 1×2

   201     3

x의 각 행에는 t의 대응하는 시간에서의 상태 값 [x1,x2,x3]이 포함됩니다. 즉, x(i,:)번째 시간 스텝에서의 상태 벡터입니다. 상태 값을 플로팅합니다.

plot(t,x)

Figure contains an axes object. The axes object contains 3 objects of type line.

동일한 입력에 대한 여러 시스템의 응답 플로팅하기 예제에서는 여러 시스템의 응답을 하나의 축에 플로팅하는 방법을 보여줍니다. 하나의 모델 배열 안에 여러 동적 시스템이 정렬되어 있는 경우 lsim은 시스템의 모든 응답을 한 번에 플로팅합니다.

모델 배열을 만듭니다. 이 예제에서는 서로 다른 고유 주파수를 가진 2차 전달 함수로 구성된 1차원 배열을 사용합니다. 먼저, 모델 배열에 대해 메모리를 사전할당합니다. 다음 명령은 영이득 SISO 전달 함수로 구성된 1×5 행을 만듭니다. 처음 두 차원은 모델 출력과 모델 입력을 나타냅니다. 나머지 차원은 배열 차원입니다. (모델 배열에 대한 자세한 내용과 모델 배열을 만드는 방법은 Model Arrays 항목을 참조하십시오.)

sys = tf(zeros(1,1,1,5));

배열을 채웁니다.

w0 = 1.5:1:5.5;    % natural frequencies
zeta = 0.5;        % damping constant
for i = 1:length(w0)
   sys(:,:,1,i) = tf(w0(i)^2,[1 2*zeta*w0(i) w0(i)^2]);
end

구형파 입력에 대해 배열에 있는 모든 모델의 응답을 플로팅합니다.

[u,t] = gensig("square",5,15);
lsim(sys,u,t)

MATLAB figure

lsim은 배열에 있는 모든 요소의 응답에 대해 동일한 선 스타일을 사용합니다. 요소를 구분하는 한 가지 방법은 동적 시스템 모델의 SamplingGrid 속성을 사용하여 배열의 각 요소를 대응하는 w0 값과 연결하는 것입니다.

sys.SamplingGrid = struct('frequency',w0);

이제 MATLAB® Figure 창에서 응답을 플로팅할 때, 각 응답선을 클릭하면 요소가 어떤 주파수 값에 대응하는지 확인할 수 있습니다.

모델 추정을 위해 추정 데이터를 불러옵니다.

load dcmotordata
z = iddata(y,u,0.1,'Name','DC-motor');

z는 샘플 시간이 0.1초인 1-입력 2-출력 추정 데이터를 저장하는 iddata 객체입니다.

추정 데이터 z를 사용하여 차수 4의 상태공간 모델을 추정합니다.

[sys,x0] = n4sid(z,4);

sys는 추정된 모델이고 x0은 추정된 초기 상태입니다.

추정에 사용된 것과 동일한 입력 데이터와 추정 명령으로 반환된 초기 상태를 사용하여 sys의 응답을 시뮬레이션합니다.

[y,t,x] = lsim(sys,z.InputData,[],x0);

여기서 y는 시스템 응답이고, t는 시뮬레이션에 사용된 시간 벡터이며, x는 상태 궤적입니다.

두 출력에 대해 시뮬레이션된 응답 y를 측정된 응답 z.OutputData와 비교합니다.

subplot(211), plot(t,z.OutputData(:,1),'k',t,y(:,1),'r')
legend('Measured','Simulated')
subplot(212), plot(t,z.OutputData(:,2),'k',t,y(:,2),'r')
legend('Measured','Simulated')

Figure contains 2 axes objects. Axes object 1 contains 2 objects of type line. These objects represent Measured, Simulated. Axes object 2 contains 2 objects of type line. These objects represent Measured, Simulated.

이 예제에서는 fcnMaglev.m이 자기부상 시스템의 오프셋과 행렬을 정의합니다. 자기부상은 공에 대한 자기력을 생성하는 코일 전류를 사용하여, 공중 부양한 공의 높이를 제어합니다. 이 예제에서는 모델을 개루프에서 시뮬레이션합니다.

LPV 모델을 만듭니다.

lpvSys = lpvss('h',@fcnMaglev)
Continuous-time state-space LPV model with 1 outputs, 1 inputs, 2 states, and 1 parameters.
Model Properties

점 표기법을 사용하여 추가 속성을 설정할 수 있습니다.

lpvSys.StateName = {'h','hdot'};
lpvSys.InputName = 'current';
lpvSys.InputName = 'height';

임의의 정현파 입력 전류에 대한 이 모델의 응답을 시뮬레이션합니다.

h0 = 1;
[~,~,~,~,~,~,x0,u0,~] = fcnMaglev([],h0);
ic = findop(lpvSys,0,h0,x=x0,u=u0);
t = 0:1e-3:1;
u = u0*(1+0.1*sin(10*t));
y = lsim(lpvSys,u,t,ic,@(t,x,u) x(1));

응답을 플로팅합니다.

plot(t,y,t,u/u0)
legend('height','current')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent height, current.

처음 전류가 증가하면(h는 감소) 공이 자석으로 끌어당겨집니다. 이후에 전류가 감소하지만 공이 다시 되돌아갈 만큼 충분하지 않습니다.

h = 0은 이 모델의 특이점으로, 공이 자석에 닿았음을 의미합니다. 이 시점에서 LPV 모델은 더 이상 유효하지 않습니다.

어떤 샘플 시간을 선택하느냐에 따라 시뮬레이션 결과에 크게 영향을 줄 수 있습니다. 그 이유를 설명하기 위해 다음과 같은 2차 모델이 있다고 가정하겠습니다.

sys(s)=ω2s2+2s+ω2,ω=62.83.

샘플 시간 0.1초를 사용하여 주기 1초의 구형파에 대한 이 모델의 응답을 시뮬레이션합니다.

w2 = 62.83^2;
sys = tf(w2,[1 2 w2]);

tau = 1;
Tf = 5;
Ts = 0.1;
[u,t] = gensig("square",tau,Tf,Ts);
lsim(sys,u,t)

lsim warning message: The input signal is undersampled.

lsim이 지정된 입력 신호를 사용하여 모델을 시뮬레이션하지만, 입력 신호가 언더샘플링되었다는 경고를 표시합니다. lsim은 입력 u의 주기당 최소 64개 샘플을 생성하는 샘플 시간을 권장합니다. 이 권장 사항이 중요한 이유를 살펴보기 위해 권장된 최댓값보다 작은 샘플 시간을 사용하여 sys를 다시 시뮬레이션해 보겠습니다.

figure
Ts2 = 0.01;
[u2,t2] = gensig("square",tau,Tf,Ts2);
lsim(sys,u2,t2)

이 응답을 통해 언더샘플링된 버전에는 강한 진동 동작이 숨겨져 있음을 알 수 있습니다.

이 예제에서는 사용자 지정 시뮬레이션을 사용하여 상태 스냅샷 데이터를 가져오고 POD 모델 차수 축소를 수행하는 방법을 보여줍니다. 기본적으로 POD 알고리즘에는 시뮬레이션을 수행하기 위한 3가지 유형의 가진 신호(처프, 임펄스 및 PRBS)가 내장되어 있습니다. 소프트웨어에서 모델이 시뮬레이션되고 상태 스냅샷 데이터가 추출되며 가제어성 및 가관측성 그람 행렬이 근사됩니다. 또는 incrementalPODlsim을 사용하여 시뮬레이션에서 생성된 사용자 지정 POD 데이터를 직접 제공할 수도 있습니다.

30개의 상태, 1개의 입력, 1개의 출력이 있는 임의의 상태공간 모델을 생성하고 모델 차수 축소 작업을 만듭니다.

rng(0)
sys = rss(30,1,1);
R = reducespec(sys,"pod");

이 예제에서는 중첩된 정현파 신호를 시뮬레이션 실행을 위한 입력 신호로 만듭니다.

t = linspace(0,100,10000);
u = 0.5*(sin(1.*t)+sin(3.*t)+sin(5.*t)+sin(8.*t)+sin(10.*t));

가도달성 및 가관측성 그람 행렬에 대한 근사를 저장할 증분 POD 객체를 생성합니다.

rPOD = incrementalPOD;
oPOD = incrementalPOD;

사용자 지정 입력 신호 u를 사용하여 플랜트 모델과 수반 모델의 시뮬레이션을 수행합니다.

[~,~,~,~,rPOD] = lsim(sys,u,t,rPOD);
asys = adjoint(sys);
[~,~,~,~,oPOD] = lsim(asys,u,t,oPOD);

lsim이 상태 스냅샷 데이터를 생성하고, 사용자 지정 POD 데이터를 출력으로 반환합니다. 이 데이터는 R.Options와 호환되는 형식으로 생성됩니다.

사용자 지정 데이터를 지정하고 모델 축소 알고리즘을 실행합니다. 옵션 CustomLrCustomLo를 지정할 경우 내장된 시뮬레이션을 건너뛰고 현재 데이터가 그대로 사용됩니다.

R.Options.CustomLr = rPOD;
R.Options.CustomLo = oPOD;
R = process(R);

이제 일반적인 워크플로에 따라 차수를 선택하고 차수 축소 모델을 구할 수 있습니다.

총 에너지 중 0.01%를 무시하는 차수 축소 모델을 구합니다.

rsys = getrom(R,MaxLoss=1e-4);
order(rsys)
ans = 
9
bodeplot(sys,rsys,"r--")
legend("Original","Reduced")

MATLAB figure

ans = 
  Legend (Original, Reduced) with properties:

         String: {'Original'  'Reduced'}
       Location: 'northeast'
    Orientation: 'vertical'
       FontSize: 8.1000
       Position: [0.7707 0.8532 0.1875 0.0923]
          Units: 'normalized'

  Show all properties

이 축소 모델은 전차수(full-order) 모델을 적절하게 근사합니다.

복소 계수를 갖는 상태공간 모델을 만듭니다.

A = [-2-2i -2;1 0];
B = [2;0];
C = [0 0.5+2.5i];
D = 0;
sys = ss(A,B,C,D);

주기 4초의 구형파에 대한 시스템의 응답을 계산합니다.

[u,t] = gensig("square",4,12);
[y,tout] = lsim(sys,u,t);

결과로 얻은 응답 데이터에 복소수 출력값이 포함되어 있습니다.

y
y = 193×1 complex

   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
   0.0000 + 0.0000i
      ⋮

입력 인수

모두 축소

동적 시스템으로, SISO 또는 MIMO 동적 시스템 모델로 지정되거나 동적 시스템 모델로 구성된 배열로 지정됩니다. 다음과 같은 유형의 동적 시스템을 사용할 수 있습니다.

  • 연속시간 또는 이산시간 수치적 LTI 모델(예: tf, zpk 또는 ss 모델).

  • 일반화된 LTI 모델 또는 불확실 LTI 모델(예: genss 또는 uss 모델). (불확실 모델을 사용하려면 Robust Control Toolbox™가 필요합니다.)

    • 조정 가능한 제어 설계 블록의 경우, 이 함수는 응답 데이터를 플로팅할 때 및 반환할 때 모두 현재 값에서 모델을 실행합니다.

    • 불확실한 제어 설계 블록의 경우, 이 함수는 모델의 공칭 값과 임의 샘플을 플로팅합니다. 출력 인수를 사용할 경우, 이 함수는 공칭 모델에 대해서만 응답 데이터를 반환합니다.

  • 희소 상태공간 모델(예: sparssmechss 모델).

  • 식별된 LTI 모델(예: idtf, idss 또는 idproc 모델). 이러한 모델의 경우, 이 함수는 신뢰구간을 플로팅하고 주파수 응답의 표준편차를 반환할 수도 있습니다. 신뢰영역이 있는 식별된 모델의 계단 응답 항목을 참조하십시오. (식별된 모델을 사용하려면 System Identification Toolbox™가 필요합니다.)

  • 선형 시변(ltvss) 모델 및 선형 파라미터 가변(lpvss) 모델.

이 함수는 주파수 응답 데이터 모델(예: frd, genfrd 또는 idfrd 모델)을 지원하지 않습니다.

sys가 모델로 구성된 배열인 경우, 이 함수는 배열에 있는 모든 모델의 응답을 동일한 축에 플로팅합니다. 모델 배열에 있는 시스템의 계단 응답 항목을 참조하십시오.

시뮬레이션을 위한 입력 신호로, 다음 중 하나로 지정됩니다.

  • 단일 입력 시스템의 경우 ut와 동일한 길이의 벡터입니다.

  • 다중 입력 시스템의 경우 u는 시간 샘플 개수(length(t))만큼의 행과 sys의 입력 개수만큼의 열을 갖는 배열입니다. 즉, 각 행 u(i,:)는 시간 t(i)에서 sys의 입력에 적용된 값을 나타냅니다. 각 열 u(:,j)sysj번째 입력에 적용된 신호입니다.

응답을 계산할 시간 샘플로, T0:dT:Tf 형식의 벡터로 지정됩니다. lsim 명령은 t를 모델 sysTimeUnit 속성에 지정된 단위를 갖는 것으로 해석합니다.

연속시간 sys의 경우 lsim 명령은 시간 스텝 dT를 사용하여 모델을 이산화합니다. dT가 시스템 동역학에 비해 너무 큰 경우(언더샘플링), lsim은 더 빠른 샘플링 시간을 사용하도록 권장하는 경고를 표시합니다. 샘플링 시간이 시뮬레이션에 미치는 영향에 대한 추가 설명은 샘플 시간이 시뮬레이션에 미치는 영향 항목을 참조하십시오.

이산시간 sys의 경우 시간 스텝 dTsys의 샘플 시간과 같아야 합니다. 또는 t를 생략하거나 이를 []로 설정할 수 있습니다. 이 경우 lsimsys.Ts와 같은 시간 스텝으로 0에서 시작하는 u와 동일한 길이의 벡터로 t를 설정합니다.

R2024b 이후

상태공간 모델 시뮬레이션에 대한 초기 조건으로, 다음 중 하나로 지정됩니다.

  • sys의 상태마다 하나의 요소를 갖는 벡터 xinit

  • findop를 사용하여 얻은 동작 조건. 동작점 객체를 사용하면 0이 아닌 이전 u 값, w 값, y 값으로 이루어진 정상 상태 동작 조건에서 시뮬레이션을 시작할 수 있습니다. 예를 들어, 0이 아닌 y 값에서 시뮬레이션을 시작하려면 다음을 지정하면 됩니다.

    op = findop(sys,y=3);
    y = lsim(sys,u,t,op)

이 인수를 생략하거나 []로 지정할 경우 시뮬레이션은 0으로만 이루어진 초기 조건에서 시작됩니다.

LPV 모델의 파라미터 궤적으로, 행렬 또는 함수 핸들로 지정됩니다.

  • 외생적 궤적 또는 명시적 궤적의 경우, pN×Np 차원의 행렬로 지정합니다. 여기서 N은 시간 샘플 개수이고 Np는 파라미터 개수입니다.

    따라서 행 벡터 p(i,:)i번째 시간 스텝에서의 파라미터 값을 포함합니다.

  • 내생적 궤적 또는 묵시적 궤적의 경우, p를 연속시간에서는 p = F(t,x,u) 형식의 함수 핸들로 지정하고, 이산시간에서는 p = F(k,x,u) 형식의 함수 핸들로 지정합니다. 이때 파라미터를 시간 t 또는 시간 샘플 k, 상태 x, 입력 u의 함수로 제공합니다.

    이 옵션은 준LPV 모델을 시뮬레이션려는 경우에 유용합니다.

연속시간 모델 샘플링을 위한 이산화 방법으로, 다음 중 하나로 지정됩니다.

  • "zoh" — 영차 유지

  • "foh" — 일차 유지

sys가 연속시간 모델인 경우 lsimt의 시간 스텝 dT = t(2)-t(1)과 동일한 샘플 시간을 사용하여 모델을 이산화하는 방법으로 시간 응답을 계산합니다. 이산화 방법을 지정하지 않을 경우 lsim은 신호 u의 매끄러운 정도를 기준으로 이산화 방법을 자동으로 선택합니다. 그러한 두 가지 이산화 방법에 대한 자세한 내용은 Continuous-Discrete Conversion Methods 항목을 참조하십시오.

R2024b 이후

적합 직교 분해 분석으로, incrementalPOD 객체로 지정됩니다. ProperOrthogonalDecomposition 모델 차수 사양을 통해 제공된 내장 가진을 건너뛰고 사용자 지정 가진을 통해 생성된 고유한 상태 스냅샷 데이터를 제공하고자 하는 경우, lsim과 함께 POD 분석을 사용하십시오.

입력 xPODIn을 빈 incrementalPOD 객체로 지정하여 새 분석을 시작하거나, 이전 시뮬레이션에서 반환된 객체에 추가할 수 있습니다. 시뮬레이션할 때마다 더 많은 상태 데이터로 POD가 업데이트되고 향상됩니다.

출력 인수

모두 축소

시뮬레이션된 응답 데이터로, 배열로 반환됩니다.

  • 단일 입력 시스템의 경우 yt와 동일한 길이의 열 벡터입니다.

  • 다중 출력 시스템의 경우 y는 시간 샘플 개수(length(t))만큼의 행과 sys의 출력 개수만큼의 열을 갖는 배열입니다. 따라서 yj번째 열(y(:,j))은 모든 입력에 적용된 u에 대한 j번째 출력에서의 응답을 포함합니다.

  • 복소 계수를 갖는 시스템의 경우, y는 복소수 값으로 구성된 배열입니다. (R2025a 이후)

시뮬레이션에 사용되는 시간 벡터로, 열 벡터로 반환됩니다. 0:dT:Tf 형식의 입력 시간 벡터 t를 지정할 경우 tOut = t입니다. t가 거의 일정한 간격으로 샘플링되면 lsim은 시뮬레이션에 대한 샘플 시간을 조정하고 그 결과를 tOut에 반환합니다. 이산시간 sys의 경우 t를 생략하거나 이를 []로 설정할 수 있습니다. 이 경우 lsimsys.Ts와 같은 시간 스텝으로 0에서 시작하는 u와 동일한 길이의 벡터로 t를 설정하고, 그 결과를 tOut에 반환합니다.

상태 궤적으로, 배열로 반환됩니다. sys가 상태공간 모델인 경우 x는 입력에 대한 응답으로 sys의 상태 변화를 포함합니다. x는 시간 샘플 개수(length(t))만큼의 행과 sys의 상태 개수만큼의 열을 갖는 배열입니다.

복소 계수를 갖는 시스템의 경우, x는 복소수 값으로 구성된 배열입니다. (R2025a 이후)

파라미터 궤적으로, 배열로 반환됩니다. sys가 선형 파라미터 가변(lpvss) 모델인 경우 pOutsys의 파라미터 변화를 포함합니다. pOut은 시간 샘플 개수(length(t))만큼의 행과 sys의 파라미터 개수만큼의 열을 갖는 배열입니다.

R2024b 이후

적합 직교 분해 분석으로, incrementalPOD 객체로 반환됩니다.

lsim은 시뮬레이션을 기반으로 더 많은 상태 데이터로 xPODIn을 업데이트하고 그 결과를 xPODOut에 반환합니다. POD 상태를 추가로 업데이트하고 향상시키려면 xPODOut을 이후의 lsim 시뮬레이션에 전달하십시오.

  • 플롯 사용자 지정 옵션이 추가로 필요하면 대신 lsimplot을 사용하십시오.

  • lsim을 사용하여 생성된 플롯은 string형 배열이나 문자형 벡터로 구성된 셀형 배열을 사용해서 여러 줄로 된 제목이나 레이블을 지정하는 것을 지원하지 않습니다. 여러 줄로 된 제목과 레이블을 지정하려면 newline 문자가 포함된 단일 문자열을 사용하십시오.

    lsim(sys,u,t)
    title("first line" + newline + "second line");

알고리즘

다음과 같은 이산시간 전달 함수의 경우

sys(z1)=a0+a1z1++anzn1+b1z1++bnzn,

lsim은 이 전달 함수와 관련된 재귀를 기준으로 입력값을 필터링합니다.

y[k]=a0u[k]++anu[kn]b1y[k1]bn[kn].

이산시간 zpk 모델의 경우 lsim은 일련의 1차 또는 2차 섹션을 통해 입력을 필터링합니다. 이 방식에서는 분자 다항식과 분모 다항식을 형성하지 않는데, 이로 인해 고차 모델의 경우 수치적으로 불안정해질 수 있습니다.

이산시간 상태공간 모델의 경우 lsim은 다음과 같은 이산시간 상태공간 방정식을 전파합니다.

x[n+1]=Ax[n]+Bu[n],y[n]=Cx[n]+Du[n].

연속시간 시스템의 경우 lsim은 먼저 c2d를 사용하여 시스템을 이산화한 다음, 그 결과로 생성된 이산시간 상태공간 방정식을 전파합니다. 사용자가 method 입력 인수로 별도로 지정하지 않는 한, lsim은 입력 신호가 매끄러운 경우에는 일차 유지 이산화 방법을 사용하고 펄스 또는 구형파같이 입력 신호가 불연속적인 경우에는 영차 유지를 사용합니다. 이산화에 대한 샘플 시간은 사용자가 t에 제공한 시간 샘플 간의 간격 dT입니다.

연속시간 희소 모델과 LTV 및 LPV 모델의 경우 lsimtrbdf 또는 hht 방법에 따라 고정 스텝 솔버를 사용합니다(sparssmechss 모델의 SolverOptions 속성 참조).

버전 내역

R2006a 이전에 개발됨

모두 확장