2017-12-21 20 views
0
X0=linspace(-.3,.3,10); 
[T,X] = ode45(@difflossy,[0 10],X0); 
plot(T,X,'-'); 

function dX = difflossy(T,X) 
    if X<-1 
     dX=0; 
    else 
     dX= X.*(1-X); 
    end 
end 

위의 코드는 비선형 미분 방정식을 푸는 코드입니다. 미분 방정식은 시간의 이동 특이점으로 나타납니다. 경고가 표시됩니다. 경고 : 오류가 t=1.466319e+00.입니다. tspan이 [0 1]로 축소되면 그래프가 나타납니다. 그러나 나는 오랫동안 무슨 일이 일어나고 있는지를 알아야합니다. 나는 if와 for 루프가 X의 값이 1보다 작 으면 dX = 0과 같은 조건을 부과한다고 생각한다. 그러나 내가 같은 것을 구현 한 방식은 다소 잘못되었습니다. 제발 도와주세요MATLAB에서 특이점 다루기

+0

아마도 다른 해결사를 시도해보십시오. 자세한 내용은 문서의 [ODE 해결사 선택] (https://uk.mathworks.com/help/matlab/math/choose-anode-solver.html)을 참조하십시오. – am304

+0

문제의 성격에 영향을 미치지 않으므로 'X <-1'는 배열'X'를 정확히 계산합니까? – LutzL

답변

0

미분 방정식이 연속적이지 않습니다. ode45 솔버는 ODE 함수의 최대 4 차 파생어가 연속적이고 "길들"하다고 예상합니다. 그런 경우가 아니기 때문에 내부 단계 크기 컨트롤은 솔루션이 점프 위치에 접근함에 따라 단계 크기를 0으로 조절합니다. 위상/모드 분리 평면.

이벤트를 사용하여 ODE의 두 단계간에 제어 된 전환을 수행 할 수 있습니다.

물론 적응 형 스텝 사이즈를 사용하지 않는 방법이라면 어느 정도 정확한 결과를 얻을 수 있습니다. 점프가 전역 오류에 얼마나 영향을 미치는지 탐색해야합니다.