Main Content

일반적인 ODE 문제 해결하기

이 항목에서는 솔버 함수(ode45, ode15s 등)를 사용하여 ODE를 풀 때 흔히 발생할 수 있는 문제를 설명합니다.

허용오차

질문이나 문제대답

오차 임계값 RelTolAbsTol을 어떻게 선택해야 합니까?

상대 정확도 허용오차인 RelTol은 계산된 답에서 정확한 자릿수의 개수를 제어합니다. 절대 정확도 허용오차인 AbsTol은 계산된 답과 참(True) 해 사이의 차이를 제어합니다. 각 스텝에서 해 성분 i의 오차 e는 다음을 충족합니다.

|e(i)| ≤ max(RelTol*abs(y(i)),AbsTol(i))

간단히 말해, 이는 임계값 AbsTol(i)보다 작은 성분을 제외한 모든 해 성분에서 RelTol에 따른 정확한 자릿수를 원한다는 뜻입니다. y(i)의 작은 성분에 관심이 없다 하더라도 더 관심이 있는 성분을 정확히 계산할 수 있으려면 y(i)가 어느 정도 정확한 자릿수를 갖도록 AbsTol(i)의 값을 충분히 작게 지정해야 할 수 있습니다.

컴퓨터의 정밀도에 맞는 답을 구하고 싶습니다. RelTol을 간단히 eps로 설정할 수 없는 이유는 무엇입니까?

기계 정밀도에 가까운 답을 구할 수는 있지만, 그렇다고 일치할 정도로 가깝게는 안 됩니다. 솔버는 연속 함수의 근삿값을 구하려고 하기 때문에 eps에 가깝게 RelTol을 사용하는 것을 허용하지 않습니다. eps에 가까운 허용오차에서는 컴퓨터의 산술 연산으로 인해 모든 함수가 불연속으로 보일 수 있습니다.

특정 해 성분 하나에 대한 정확한 답을 구하는 것을 원치 않는다는 점을 솔버에 어떻게 알릴 수 있습니까?

이 해 성분에 대한 절대 허용오차 AbsTol을 늘리면 됩니다. 허용오차가 해 성분보다 큰 경우 이는 성분의 어떠한 자릿수도 정확할 필요가 없음을 지정합니다. 솔버가 다른 성분을 정확히 계산하려면 이 성분에서 어느 정도 정확한 자릿수를 구해야 할 수 있지만, 일반적으로 이러한 작업은 자동으로 처리됩니다.

문제 스케일

질문이나 문제대답

ODE 함수군으로 얼마나 큰 문제를 풀 수 있습니까?

기본 제약 조건은 메모리와 시간입니다. 각 시간 스텝에서 비경직성(Nonstiff) 문제에 대한 솔버는 길이가 n인 벡터를 할당합니다. 여기서 n은 연립방정식에 포함된 방정식의 개수입니다. 경직성(Stiff) 문제에 대한 솔버는 길이가 n인 벡터를 할당할 뿐만 아니라, n×n 야코비 행렬도 할당합니다. 이러한 솔버의 경우, odesetJPattern 옵션을 사용하여 야코비 행렬의 희소성 패턴을 지정하는 것이 유리할 수 있습니다.

문제가 비경직성 문제이거나 JPattern 옵션을 사용하는 경우, 미지수가 매우 많이 포함된 문제를 푸는 것도 가능합니다. 하지만, 이 경우 결과를 저장하는 것이 문제가 될 수 있습니다. 솔버에 특정 지점에서만 해를 구하도록 요청하거나, 출력 인수 없이 솔버를 호출하고 출력 함수를 사용하여 해를 모니터링하십시오.

매우 큰 시스템을 푸는 중이지만, y 성분 중 몇 개에만 관심이 있습니다. 요소를 모두 저장하지 않아도 되는 방법이 있습니까?

예. OutputFcn 옵션이 이러한 용도로 특별히 설계되었습니다. 출력 인수 없이 솔버를 호출할 경우, 솔버는 전체 해 내역을 보관하기 위한 저장 공간을 할당하지 않습니다. 대신, 각 시간 스텝마다 OutputFcn(t,y,flag)를 호출합니다. 특정 요소의 내역을 유지하려면 관심 있는 요소만 저장하거나 플로팅하는 출력 함수를 작성하십시오.

적분을 시작하는 데 드는 비용은 얼마나 되고 이를 어떻게 하면 줄일 수 있습니까?

솔버가 문제의 스케일에 적합한 스텝 크기를 찾으려고 할 때 가장 큰 시작 비용이 발생합니다. 적합한 스텝 크기를 안다면 InitialStep 옵션을 사용하십시오. 예를 들어, 이벤트 위치 루프에서 적분기를 반복적으로 호출하는 경우 해당 이벤트 직전에 수행되는 마지막 스텝이 다음 적분에 맞게 올바르게 스케일링될 것입니다. 예제를 보려면 edit ballode를 입력하십시오.

적분기가 사용하는 첫 번째 스텝 크기가 너무 커서 중요한 동작을 놓칩니다.

InitialStep 옵션을 사용하여 첫 번째 스텝 크기를 지정할 수 있습니다. 적분기는 이 스텝 크기를 사용해 본 후 필요한 경우 스텝 크기를 줄입니다.

해 성분

질문이나 문제대답

해가 예상한 것과 다르게 나타납니다.

예상한 값이 올바른 경우, 허용오차를 디폴트 값보다 낮추십시오. '긴' 구간을 적분하는 문제와 적당히 불안정한 문제에 대한 정확한 해를 구하려면 더 작은 상대 허용오차가 필요합니다.

특정 시간 동안 절대 허용오차보다 작게 유지되는 해 성분이 있는지 여부를 확인하십시오. 그러한 성분에서는 정확한 자릿수가 필요하지 않습니다. 참고로, 이런 계산이 그러한 성분에 대해서는 허용될 수 있지만 해 성분을 정확히 계산할 수 없으면 이에 종속되는 다른 성분의 정확도가 떨어질 수 있습니다.

플롯이 충분히 매끄럽지 않습니다.

Refine의 디폴트 값을 ode45에서의 4, ode78ode89에서의 8, 다른 솔버에서의 1에서 더 높여 봅니다. Refine 값이 클수록 솔버가 생성하는 출력 점이 많아집니다. 실행 속도는 디폴트 값에서 Refine 값을 높여도 영향을 많이 받지 않습니다.

계산된 해를 플로팅하니 괜찮게 표시되기는 하는데, 코드가 특정 지점에서 중지됩니다.

먼저, 코드가 중지되는 지점 근처에서 ODE 함수가 매끄러운지 확인합니다. 매끄럽지 않은 경우, 이를 처리하기 위해 솔버는 작은 스텝을 취해야 합니다. 적분 구간을 ODE 함수가 매끄러운 구간으로 분할하면 도움이 될 수 있습니다.

함수가 매끄럽고 코드가 매우 작은 스텝을 취하고 있다면, 사용자가 경직성(Stiff) 문제용으로 개발되지 않은 솔버를 사용하여 경직성 문제를 풀려고 시도하는 것일 수 있습니다. 경직성 솔버 ode15s, ode23s, ode23t, ode23tb 중 하나를 사용해 보십시오.

최종 값은 갖고 있지만 초기값은 갖고 있지 않을 경우 어떻게 해야 합니까?

ODE 함수군의 모든 솔버는 시간의 순방향이나 역방향으로 해를 구할 수 있습니다. 솔버 구문은 [t,y] = ode45(odefun,[t0 tf],y0);이고, 이 구문은 t0 > tf를 허용합니다.

적분이 너무 많은 시간 스텝을 사용하여 매우 느리게 진행됩니다.

먼저, tspan이 너무 길지 않은지 확인합니다. 솔버는 매끄러운 해를 생성하는 데 필요한 많은 시간 지점을 사용한다는 사실을 명심하십시오. ODE 함수가 tspan에 비해 매우 짧은 시간 스케일에서 변하는 경우 솔버는 많은 시간 스텝을 사용합니다. 긴 시간에 대한 적분은 어려운 문제입니다. tspan을 더 작은 구간으로 분할하십시오.

ODE 함수가 tspan 구간에서 눈에 띌 정도로 변하지 않을 경우 문제가 경직성 문제일 수 있습니다. 경직성 솔버 ode15s, ode23s, ode23t, ode23tb 중 하나를 사용해 보십시오.

마지막으로, ODE 함수가 효율적인 방식으로 작성되었는지 확인하십시오. 솔버는 ODE 함수에서 도함수를 여러 번 계산합니다. 수치 적분 비용은 ODE 함수를 계산하는 비용에 따라 상당히 달라집니다. 각 계산에서 복잡한 상수 파라미터를 다시 계산하는 대신, 전역 변수에 저장하거나 한 번만 계산하고 이를 중첩 함수로 전달하십시오.

해가 t0 <= t <= tf 를 충족하는 시간 t에서 급격히 변하는 것을 알고 있지만, 적분기 스텝이 이를 "확인"하지 않고 넘어갑니다.

시간 t에서 급격한 변화가 있다는 사실을 알고 있으면 tspan 구간을 두 구간 [t0 t][t tf]로 분할한 후 적분기를 두 번 호출하거나 odextend를 사용하여 적분을 계속하십시오.

미분 방정식에 주기적인 계수 또는 해가 있는 경우 최대 스텝 크기를 주기의 길이로 제한하여 솔버가 주기를 스텝 오버하지 않도록 하십시오.

문제 유형

선 풀이 방법으로 이산화된 편미분 방정식(PDE)을 솔버가 처리할 수 있습니까?

예, 그 이유는 이산화는 연립 ODE을 생성하기 때문입니다. 이산화에 따라서는 질량 행렬을 포함하는 형식을 얻을 수 있는데, 그럴 경우 ODE 솔버가 이를 지원합니다. 주로, 이러한 시스템은 경직성(Stiff)을 가집니다. PDE가 포물선 방정식인 경우와 유체 흐름의 화학 반응과 같은 매우 다른 시간 스케일에서 발생하는 현상이 있는 경우 그렇습니다. 이 경우, 경직성 솔버 ode15s, ode23s, ode23t, ode23tb 중 하나를 사용하십시오.

방정식이 많이 있는 경우 JPattern 옵션을 사용하여 야코비 행렬의 희소성 패턴을 지정하십시오. 그러면 계산 비용이 너무 많이 들지 않게 되므로 계산이 실패하는 문제를 방지할 수 있습니다. JPattern을 사용하는 예제를 보려면 edit burgersode를 입력하십시오.

시스템이 경직성을 가지지 않거나 매우 심한 경직성을 가지지 않는 경우, 경직성 솔버 ode15s, ode23s, ode23t, ode23tb보다 ode23ode45가 더 효율적입니다.

1차원의 포물형 타원 편미분 방정식의 경우 MATLAB® PDE 솔버 pdepe를 사용하여 직접 풀 수 있습니다.

샘플링된 데이터 세트를 적분할 수 있습니까?

직접적으로는 할 수 없습니다. 대신, 보간이나 기타 데이터 피팅 방식을 사용하여 이러한 데이터를 함수로 나타내야 합니다. 이 함수를 매끄럽게 나타내는 것이 중요합니다. 스플라인과 같은 조각별 다항식 피팅은 눈으로 보기에는 매끄럽지만, 솔버에게는 거칠게 보입니다. 솔버는 피팅의 도함수가 비약(Jump)하는 부분에서 작은 스텝을 취합니다. 매끄러운 함수를 사용하여 데이터를 나타내거나 매끄러움에 덜 민감한, 차수가 더 낮은 솔버(ode23, ode23s, ode23t, ode23tb) 중 하나를 사용하십시오. 예제는 시간 종속적인 항을 갖는 ODE 항목을 참조하십시오.

참고 항목

| | |

관련 항목