신군의 역학사전

[Simulink] 솔버(Solver) 본문

Mechanical Engineering/Matlab & Simulink

[Simulink] 솔버(Solver)

긔눈 2025. 2. 3. 12:00
반응형

솔버(Solver)

모든 시뮬레이션에서 주요 쟁점은 정확도(Accuracy)와 속도(Speed)로, 시간 스텝(Time Step)을 통해 정확도와 속도 간의 트레이드 오프를 고려해야 합니다. 여기서 솔버(Solver)란 시간 스텝을 결정하여 시뮬레이션의 정확도와 성능을 결정하는 핵심 요소입니다.

 

모델링 성능 관련해서 고려해야할 요소는 다음의 3가지가 있습니다. 각각에 대한 자세한 내용은 별도로 정리하도록 하겠습니다.

 1. 시스템 동역학 및 강성(System Dynamics & Stiffness)

 2. 불연속성(Discontinuities)

 3. 대수 루프(Algebraic Loops)

 

솔버 선택(Solver Selection)

우선 솔버에 대한 설정은 [모델 설정] - [솔버 선택]에서 할 수 있습니다.

여기서 디폴트 설정은 가변 스텝(Variable-Step) 입니다.

 

솔버의 종류는 크게 2가지 기준에 따라 분류할 수 있는데, 기준은 다음과 같습니다.

1. Continuous Vs Discontinuous

2. Fixed Step Vs Variable Step

이외에도 Stiff Vs Non-Stiff로 분류가 가능한데, 이는 아래에서 따로 정리하겠습니다.

여기서 Fixed-Step 솔버란 시간 스텝을 고정된 값으로 활용하는 솔버를 말하며

Variable-Step 솔버란 시간 스텝 별 오차가 허용 오차(tolerance)를 초과할 경우

중간에 minor한 시간 스텝을 넣어 계산하는 솔버를 말합니다.

 

연속 시스템은 주로 미분방정식에 의해 기술되므로 ODE 솔버가 주로 활용됩니다.

ODE3, ODE45와 같이 솔버에 따라 ODE 뒤에 숫자가 붙기도 하는데

이는 테일러 전개시 최고차항 차수를 의미합니다.

즉, 차수가 높을수록 계산 정확도는 올라가지만, 연산 시간이 오래걸리는 것이죠.

 

다만, ODE45와 같이 숫자가 두개 붙는 경우

5차 전개로 정확도 계산 → 4차 전개 결과와 비교 후 오차 추정

의 과정에 따라 연산을 수행합니다.

솔버 선택 창에서 솔버 유형별 다양한 솔버를 선택할 수 있으며

자동(Auto)를 선택 시 자동으로 최적의 솔버를 탐색하여 선택해줍니다.

마찬가지로 고정 스텝에 대해서도 자동 솔버 선택이 가능합니다.

가변 스텝 솔버의 경우, 타입 스텝별 오차와 허용 오차를 비교하는 연산이 추가로 이루어지므로

해당 허용 오차값을 지정해주어야 합니다.

 

여기서 절대, 상대오차의 정의는 아래와 같은데 

절대오차(Absolute Error) : 통합 과정에서 발생한 오차의 크기 자체를 의미

상대오차(Relative Error) : 상태 변수의 크기와 비교한 오차

 

상대 오차의 경우

초기 전이(Transient) 상태에서는 허용 오차를 크게 설정하여 빠른 계산이 가능하도록 하며

후기 정상(Steady) 상태에서는 허용 오차를 작게 설정하여 정밀도를 높이도록 연산합니다.

다만, State가 어느정도 수렴한 후에도 Tolerance가 작아 시간 스텝을 작게 유지하게 되는데

이로 인해 시뮬레이션 시간이 증가한다는 단점이 있습니다.

 

절대 오차의 경우

항상 동일한 허용 오차(Tolerance)로 시뮬레이션을 진행하므로

시뮬레이션 초기부터 (상대적으로) 작은 시간 스텝을 유지해야합니다.

마찬가지로 이로인해 시뮬레이션 시간이 증가하게 됩니다.

 

따라서 이런부분을 해결하기 위해 솔버를 통해 절대 & 상대오차를 혼용하여 사용하게 됩니다.

 

시스템 동역학 & 강성(System Dynamics & Stiffness)

Stiff System이란, 시간에 따라 빠르게 변하는 구성요소와 느리게 변하는 구성요소 모두를 포함한 시스템으로

Stiff Solver를 활용하여 안정적인 시뮬레이션을 구현할 수 있습니다.

 

위의 2가지 모두에서 불연속점 1근방에서 빠르게 시스템 상태가 변화하는데

1근방의 구성요소를 주로 포함하고 있는 오른쪽과 달리

그 외적인 요소 모두를 포함하는 왼쪽과 같은 시스템을 Stiff System이라 하며

이 경우 별도의 최적 솔버를 사용하는 것이 좋습니다.

솔버 종류에 대한 구분은 위의 표와 같습니다.

시스템의 강성(Stiffness)는 [디버그(Debug]-[성능]-[Solver Profiler]에서

스텝크기(Step Size)를 통해 확인이 가능합니다.

여기서 위의 사진과 같이

y축(스텝 크기)의 변동이 극심한 경우 Stiff System이라 판단할 수 있으며

반대로 y축의 변동이 적은 경우 Non-Stiff System이라 판단할 수 있습니다.

 

불연속점(Discontinuity)

가장 대표적인 불연속점에 대한 설정으로는 영점교차(Zero Cross Detection)가 있습니다.

여기서 적응형(Adaptive)에 대한 설정을 할 수 있는데

이는 정해진 threshold내의 불연속점은 Zero-Crossing으로 카운트하지 않도록 하여

Zero-Crossing으로 부터 발생하는 에러를 해결하도록 지원합니다.

관련 진단에 대한 설정은 Configuration 아래쪽 진단 탭에서 설정할 수 있습니다.

오류부분을 경고로 수정해주면, 불연속점에 걸려도 시뮬레이션은 우선적으로 돌아가게끔 설정할 수 있습니다.

 

대수 루프(Algebraic Loop)

Direct Feedthrough란 현재 스텝에서의 입력이, 현재 스텝에의 출력에 즉각적으로 반영되는 구조를 말하며, 대수루프(Algebraic Loop)란 Direct feedthrough로 구성된 루프구조를 의미합니다. 수학적으로는 아래와 같이 정의되는 시스템을 의미하며, 이 경우 입출력이 동시에 연산되어 시스템의 안정성과 관련된 이슈의 발생 가능성이 높습니다.

대수 루프가 포함된 시스템은 위와 같이 간단히 구성해볼 수 있습니다.

이러한 루프를 제거하기 위해서는 주로 Unit Delay블록을 활용하는데

이를 통해 현재 State의 연산에 이전 스텝의 값을 활용하여 대수 루프를 효과적으로 제거할 수 있습니다.

다만 이 경우 시스템의 Dynamics가 바뀐다는 단점 역시 존재합니다.

이런 문제점을 해결하기 위해 타임 스텝을 매우 작게 수정하여 Dynamics를 유지하는 방안이 있지만

이 경우 시뮬레이션 타임스텝이 매우 작게 설정되어, 연산 시간이 급격하게 증가한다는 단점이 있습니다. 

간단한 모델의 경우, 직관적으로 대수루프의 존재를 알 수 있지만

복잡한 모델의 경우. 대수 루프의 존재를 한번에 알기 쉽지 않습니다.

이 경우 아래의 커맨드를 통해 대수 루프의 존재를 시각적으로 확인할 수 있습니다.

 

Simulink.BlockDiagram.getAlgebraicLoops(‘모델명’)

매트랩 커맨드 창에 입력해주면 됩니다.

그 결과, 다음과 같이 대수 루프 구조가 가시화됩니다.

반응형