수치 데이터에 대한 적분
이 예제에서는 주행 거리에 대한 근삿값을 계산함으로써 수치적으로 이산 속도 데이터 세트를 적분하는 방법을 보여줍니다. integral
함수군은 함수 핸들만 입력으로 받으므로, 이러한 함수는 이산 데이터 세트에 사용할 수 없습니다. 함수 표현식을 적분에 사용할 수 없을 경우 trapz
나 cumtrapz
를 사용하십시오.
속도 데이터 보기
다음과 같은 속도 데이터와 이에 대응되는 시간 데이터가 있다고 가정하겠습니다.
vel = [0 .45 1.79 4.02 7.15 11.18 16.09 21.90 29.05 29.05 ... 29.05 29.05 29.05 22.42 17.9 17.9 17.9 17.9 14.34 11.01 ... 8.9 6.54 2.03 0.55 0]; time = 0:24;
이 데이터는 24초 동안 1초 간격으로 측정한 자동차의 속도(m/s)를 나타냅니다.
속도 데이터 점을 플로팅하고 각 점을 직선으로 연결합니다.
figure plot(time,vel,'-*') grid on title('Automobile Velocity') xlabel('Time (s)') ylabel('Velocity (m/s)')
이 기울기는 가속 기간 동안은 양수이고, 항속 기간 동안은 0이며, 감속 기간 동안은 음수입니다. 시간 t = 0
에서 차량은 vel(1) = 0
m/s로 정지된 상태입니다. 차량은 t = 8
초에서 최대 속도 vel(9) = 29.05
m/s에 도달할 때까지 가속하고 4초 동안 이 속도를 유지합니다. 그런 후, 3초 동안 vel(14) = 17.9
m/s로 감속하고 결국 정지합니다. 이 속도 곡선에는 여러 불연속이 있기 때문에 하나의 연속 함수로 이를 나타낼 수 없습니다.
총 주행 거리 계산하기
trapz
는 데이터 점을 사용하여 사다리꼴을 만들어 이산 적분을 수행하므로 불연속이 있는 데이터 세트를 처리하는 데 적합합니다. 이 방법은 데이터 점 사이의 동작을 선형 동작으로 가정하므로, 데이터 점 사이의 동작이 선형이 아닌 경우 정확도가 떨어질 수 있습니다. 이를 확인하기 위해 데이터 점을 꼭짓점으로 사용하여 사다리꼴을 그래프에 그릴 수 있습니다.
xverts = [time(1:end-1); time(1:end-1); time(2:end); time(2:end)]; yverts = [zeros(1,24); vel(1:end-1); vel(2:end); zeros(1,24)]; p = patch(xverts,yverts,'b','LineWidth',1.5);
trapz
는 영역을 사다리꼴로 분할하여 이산 데이터 세트 아래 부분의 면적을 계산합니다. 그런 다음, 각 사다리꼴의 면적을 더하여 총 면적을 계산합니다.
trapz
를 사용하여 속도 데이터를 수치적으로 적분해 자동차가 주행한 총 거리(음영 처리된 영역에 해당)를 계산합니다. 기본적으로, 구문 trapz(Y)
를 사용하는 경우 점 사이 간격은 1
이라고 가정합니다. 하지만 구문 trapz(X,Y)
에서는 균일하거나 균일하지 않은 간격 X
를 지정할 수 있습니다. 이 경우, time
벡터의 측정값 사이의 간격은 1
입니다. 따라서 디폴트 간격을 사용해도 괜찮습니다.
distance = trapz(vel)
distance = 345.2200
t = 24
에서 자동차가 주행한 거리는 약 345.22m입니다.
누적 주행 거리 플로팅하기
cumtrapz
함수는 trapz
와 밀접한 관련이 있습니다. trapz
는 최종 적분값만 반환하지만, cumtrapz
는 중간값도 벡터로 반환합니다.
누적 주행 거리를 계산하고 결과를 플로팅합니다.
cdistance = cumtrapz(vel); T = table(time',cdistance','VariableNames',{'Time','CumulativeDistance'})
T=25×2 table
Time CumulativeDistance
____ __________________
0 0
1 0.225
2 1.345
3 4.25
4 9.835
5 19
6 32.635
7 51.63
8 77.105
9 106.15
10 135.2
11 164.25
12 193.31
13 219.04
14 239.2
15 257.1
⋮
plot(cdistance) title('Cumulative Distance Traveled Per Second') xlabel('Time (s)') ylabel('Distance (m)')