2011-09-08 14 views
7

Próbuję użyć NDSolve do rozwiązania równania falowego, aby sprawdzić, czy jest łatwiej i/lub szybciej go używać zamiast moje stare cechy charakter. wdrożenie metody.Niestabilność podczas NDSolving równanie falowe

Staje się dużo niestabilności, której nie otrzymuję za pomocą metody charakterystyki, a ponieważ są to proste równania, zastanawiam się, co jest nie tak ... (mam nadzieję, że nie jest to fizyczny aspekt problemu) .)

ans = [email protected][{ 
u[t, x]*D[d[t, x], x] + d[t, x]*D[u[t, x], x] + D[d[t, x], t] == 0, 
D[d[t, x], x] + u[t, x]/9.8*D[u[t, x], x] + 
1/9.8*D[u[t, x], t] + 0.0001 u[t, x]*Abs[u[t, x]] == 0, 
u[0, x] == 0, 
d[0, x] == 3 + x/1000*1, 
u[t, 0] == 0, 
u[t, 1000] == 0 
}, 
d, {t, 0, 1000}, {x, 0, 1000}, DependentVariables -> {u, d} 
] 

Animate[Plot[(d /. ans)[t, x], {x, 0, 1000}, 
     PlotRange -> {{0, 1000}, {0, 6}}], {t, 0, 1000} 
] 

enter image description here

Czy ktoś może mi pomóc?

EDIT:

umieściłem rozwiązanie NDSolve (po edycji JxB) ze moim roztwór charakterystyka, razem na tej samej animacji. Pasują do siebie wystarczająco blisko, z wyjątkiem początkowych szybkich oscylacji. Z czasem zaczynają się zdesynchronizować, ale uważam, że jest to prawdopodobnie spowodowane małym uproszczeniem, które musimy przyznać, gdy dedukujemy te cechy.

simulation

Czerwony: NDsolve; Niebieski: metoda "ręczna";

naciśnij F5 (odśwież okno przeglądarki), aby ponownie uruchomić animację z t=0.

(skala xx jest liczbą punktów, że stosowane w moim „ręcznego” metody, gdzie każda litera oznacza 20 jednostek NDSolve/skali fizycznej)

Gra z NDSolve próbek siatki powoduje całkowicie różny wpływ drgań. Czy ktoś ma lub zna technikę zapewniającą właściwą integrację?

+0

Myślę, że dostaniesz więcej odpowiedzi z pytaniem na stronie Math: http://math.stackexchange.com/ –

+0

@dario Dziękuję za sugestię (spróbuję). Ale ponieważ te równania powinny być stabilne, pomyślałem, że jest to raczej kwestia Mathematica, chociaż nie jestem ekspertem w tej dziedzinie ... –

+0

Jeśli podejrzewasz, że skoro nigdy nie korzystałem z Mathematica, wszystko, co mogę zasugerować, to aktualizowanie go do Najnowsza wersja. To może naprawić twój problem, jeśli jest spowodowany przez błąd w Mathematica –

Odpowiedz

4

zmieniając współczynniki do nieskończonej precyzji (np 1/9.8-> 10/98), a ustawienie WorkingPrecision->5 (wartość 6 jest zbyt wysoka), już nie pojawia się komunikat o błędzie:

ans = [email protected] 
    NDSolve[{D[u[t, x] d[t, x], x] + D[d[t, x], t] == 0, 
    D[d[t, x], x] + u[t, x] 10/98*D[u[t, x], x] + 
     10/98*D[u[t, x], t] + 1/10000 u[t, x]*Abs[u[t, x]] == 0, 
    u[0, x] == 0, d[0, x] == 3 + x/1000, u[t, 0] == 0, 
    u[t, 1000] == 0}, d, {t, 0, 1000}, {x, 0, 1000}, 
    DependentVariables -> {u, d}, WorkingPrecision -> 5] 

Animate[ 
Plot[(d /. ans)[t, x], {x, 0, 1000}, 
    PlotRange -> {{0, 1000}, {0, 6}}], {t, 0, 1000}] 

Nie znam tego równania, więc nie wierzę w rozwiązanie: oscylacje na małą skalę rosną początkowo, a następnie są tłumione.

+0

Robi się znacznie lepiej i do pewnego momentu wierzę, że to dowodzi, że wysoki efekt oscylacyjny jest jakąś numeryczną anomalią NDSolve. To powinna być fala wody. Warunki brzegowe zostały ustawione tak, aby symulowały wodę wewnątrz zamkniętej "puli", podskakującej między ścianami, po tym, jak woda została upuszczona ze stanu nie poziomego. Dlatego też nie wierzę w oscylacje na małą skalę ... także dlatego, że moja "ręczna" charakterystyka nie pokazuje tego zachowania (pokazują one tylko długą wolną falę). Jeśli dodasz wypełnienie -> dół, staje się bardziej jasne, co jest symulowane ... –

+0

@JxB Byłoby dobrze, gdybyś wyjaśnił, dlaczego WorkingPrecision powinna być niska (i dlaczego 6 jest zbyt wysoka). –

Powiązane problemy