Numericke riesenie ODE + Matlab

Programovacie jazyky, rady, poradňa...
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Numericke riesenie ODE + Matlab

Príspevok od používateľa Aiden »

Sedim nad tym uz dva dni a zacinam si pripadat ako idiot, ale mam nasledujuci problem:

Mam takyto system ODE, ktory potrebujem vyriesit:

Kód: Vybrať všetko

dh1/dt = g(h1,h2)
dh2/dt = g(h1,h2,h3)
dh3/dt = g(h2,h3)
kde h1,h2,h3 = f(t) (su to vysky hladin kvapaliny v zasobnikoch)

Mam v Matlabe Simulinkovy model, ktory pocita spravne (pre jednoduchost ako solver je pouzity Euler a fixny krok 0.1). ODE45 (Runge-Kutta) pocita tiez spravne. Problem mam, ked pouzijem vlastny iteracny solver (pre jednoduchost Eulerovou metodou) s uplne zakladnou implementaciou:

Kód: Vybrať všetko

hi+1 = hi + g() * step
Vysledky, ktore dostavam su tu:
chart.jpg
kde ciarkovana ukazuje simulaciu, t.j. ocakavany vysledok a plna je moj solver.
Na jednoduchej ODE napr y'=x^2-y mi funguje zrejme spravne, ale tento system ma uz roky neznasa :D (nie je to prvy krat, co spolu bojujeme)
Nedari sa mi identifikovat problem, rovnice vyzeraju byt napisane spravne a ked aj nie spravne, tak aspon rovnako ako v simulacii; step pouzivam tiez rovnaky a napriek tomu to vychadza takto.

Ma niekto predstavu, kde by som mohol mat problem?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Numericke riesenie ODE + Matlab

Príspevok od používateľa harrison314 »

nebude to v tom, ze funkcia f je uz derivovana, a ty ju v simulacii pouzivas derivovanu este raz?
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: Numericke riesenie ODE + Matlab

Príspevok od používateľa Aiden »

Nepredpokladam to, vstup do simulacie mam tie derivacie g(hi), co je v poriadku a rovnake funckie g(hi) pouzivam aj vo vypocte.
Trochu som to preoznacil.

Celkom ma serie to, ze vsade nachadzam kadejake vztahy pre

Kód: Vybrať všetko

dy/dx = f(x,y)
ale nikde nic o

Kód: Vybrať všetko

dy/dx = f(y,z,a,b..)
Je vobec Euler bez nejakej modifikacie pouzitelny aj takyto system? Alebo to pocita spravne, len ta vysledna chyba je taka obrovska? Preco potom Euler simulacia dava uplne iny vysledok?

//autoeditácia príspevku (06 Máj 2013, 19:16)
Fuh, problem vyrieseny, chybala v simulacii konstanta, ktora sa nejakym sikovnym sposobom zmazala, tak to robilo bordel. Dakujem za myslienku povrtat sa v simulacii :)
KaptMichal
King
King
Používateľov profilový obrázok
Príspevky: 1612
Registrovaný: 26 mar 2009, 17:39
Bydlisko: Boeing 737-700NG

Re: Numericke riesenie ODE + Matlab

Príspevok od používateľa KaptMichal »

Caute, potreboval by som pomoc s jednym prikladom. Ak by ste ma aspon dokazali nejak naviest alebo dat nejaky schopny material vhodny aj pre totalneho informatickeho analfabeta bol by som vam velmi vdacny. Jedna sa o toto zadanie :
Prílohy
RungeKutta.png
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: Numericke riesenie ODE + Matlab

Príspevok od používateľa S.T.E.A.L.T.H »

Takto nejak. Budem predpokaldat, ze vobec nemas tusenia o co ide, tak to skusim v strucnosti popisat. Metoda rypu Runge-Kutta je jednokrokova numericka metoda na riesenie ODR, kde nasledujucu iteracnu hodnotu zratas vyuzitim vztahu
y(x_{n+1}) = y(x_{n}) + h * Sum_{i=1}^{r} (A_i * k_i)
Blizsie a podla mna zrozumitelne info najdes napr na http://en.wikipedia.org/wiki/Runge%E2%8 ... ta_methods, v casti Explicit Runge–Kutta methods respektive este lepsie mozno tu http://en.wikipedia.org/wiki/List_of_Ru ... ta_methods. Na tom druhom linku najdes koeficienty pre metodu 3. radu. Trochu nestandardne lebo najpouzivanejsia je 4. radu. Podla zadania si mate zjavne zvolit koeficient adhoc podla seba, ked som tomu dobre pochopil. Neviem ci 3. radu na wiki je ta ista ako Ralstonova, ale skus sa predsa len vyhnut tym koeficientom, ktore su tam, pre Kutta's third-order method.
Ako na to?
Vseobecna rovnica tam je aj s naznacenymi koeficientami. Realne koeficienty k jednotlivym metodam najdes tiez tam v tabulkach (aby si videl ako to funguje a aby si sa ako som spominal vyhol tym pre 3. rad). V premennej x_0 = x = 0 dosadis za y pociatocnu hodnotu a tou je 1. Vypocitas y(x_1) pomocou vztahu, ktory Ti vznikne doplnenim koeficientov do vseobecneho vzorca. V dalsom iteracnom kroku vypocitas y(x_2) s vyuzitim x_1 = x_0 + krok za x a y(x_1) za y. Znova podla toho isteho vztahu. A tak stale dokola.
Napísať odpoveď