Main Content

수치 데이터에 대한 적분

이 예제에서는 주행 거리에 대한 근삿값을 계산함으로써 수치적으로 이산 속도 데이터 세트를 적분하는 방법을 보여줍니다. integral 함수군은 함수 핸들만 입력으로 받으므로, 이러한 함수는 이산 데이터 세트에 사용할 수 없습니다. 함수 표현식을 적분에 사용할 수 없을 경우 trapzcumtrapz를 사용하십시오.

속도 데이터 보기

다음과 같은 속도 데이터와 이에 대응되는 시간 데이터가 있다고 가정하겠습니다.

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

Figure contains an axes object. The axes object with title Automobile Velocity, xlabel Time (s), ylabel Velocity (m/s) contains an object of type line.

이 기울기는 가속 기간 동안은 양수이고, 항속 기간 동안은 0이며, 감속 기간 동안은 음수입니다. 시간 t = 0에서 차량은 vel(1) = 0m/s로 정지된 상태입니다. 차량은 t = 8초에서 최대 속도 vel(9) = 29.05m/s에 도달할 때까지 가속하고 4초 동안 이 속도를 유지합니다. 그런 후, 3초 동안 vel(14) = 17.9m/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);

Figure contains an axes object. The axes object with title Automobile Velocity, xlabel Time (s), ylabel Velocity (m/s) contains 2 objects of type line, patch.

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

Figure contains an axes object. The axes object with title Cumulative Distance Traveled Per Second, xlabel Time (s), ylabel Distance (m) contains an object of type line.

참고 항목

| |

관련 항목