2016-10-03 11 views
5

Mam system, który wygląda jakMATLAB rozwiązać ODE na niezmiennego kolektora

dn/dt=f(n,v) 
dh/dt=g(h,v) 

chcę rozwiązać to równanie na kolektorze F(v,n,h)=0, nieliniowej funkcji w v. Próbowałem użyć czegoś takiego, jak v=fzero(@(x) F(x,n,h),0), aby rozwiązać wartość v na manifoldzie za każdym razem. Ale jest to niesamowicie powolne, a ode15s (mój system jest oscylatorem relaksacyjnym) nie spełnia tolerancji integracji. Jak znaleźć rozwiązanie ODE na kolektorze zdefiniowanym przez F(v,n,h)=0?

+1

Powinieneś użyć solwerka DAE, ponieważ twój system jest różniczkowo-algebraiczny. – LutzL

Odpowiedz

2

Uważam, że komentarz @ LutzL jest bardzo pomocny. Możliwe jest ustawienie solwera DAE przy użyciu ode15s. przykład: „rozwiązać Robertson problem jako półprodukty Explicit różnicowe równań algebraicznych (DAE)” w https://www.mathworks.com/help/matlab/ref/ode15s.html

W moim przypadku będzie konfiguracja macierz:

M=[zeros(1,3);0,1,0;0,0,1]; 
options = odeset('Mass',M,'RelTol',1e-5,'AbsTol',1e-6,'MaxStep',0.01); 
y0=[v0,n0,h0]; 
[T,Y]=ode15s(@slow,[0 50],y0,options); 

I slow jest funkcją zdefiniowany jako :

function dy = slow(t,y) 
    v=y(1); n=y(2); h=y(3); 
    dy=zeros(3,1); 
    dy(1)=F(v,n,h); 
    dy(2)=f(n,v); 
    dy(3)=g(h,v); 
end 
0

Jednym z możliwych sposobów rozwiązania tego problemu jest rozróżnienie się F(v,n,h)=0 równania:

Teraz możemy uzyskać system ODE

lub

, które można rozwiązać w zwykły sposób.

+0

Próbowałem w ten sposób. Jednak pojęcie dF/dv staje się bardzo bliskie 0 w pobliżu struktury zagięcia w systemie. Dlatego dokładność rozwiązania nie jest zbyt dobra. – Badoe

Powiązane problemy