mam problem z rozwiązaniem rownania rożniczkowego metodą numeryczna w jezyku pascal.
zadanie jakie otrzymałem to:
W reaktorze przepływowym o stałej temperaturze koncentrację składnika określa równianie
\(\displaystyle{ Q \frac{dc}{dV}=-R(c), c(0)=c_{in},
R(c)= \frac{k c}{c+v}}\)
gdzie \(\displaystyle{ Q=50, c_{in}=2, k=0,198, v=3,8}\). znaleźć zależnośc stęzenia składnika od bezwymiarowej objętości \(\displaystyle{ V}\) w przedziale \(\displaystyle{ [0, 2000]}\)
[Pascal] Równanie różniczkowe metodą numeryczną
-
- Użytkownik
- Posty: 1
- Rejestracja: 8 kwie 2015, o 08:43
- Płeć: Mężczyzna
- Lokalizacja: warszawa
[Pascal] Równanie różniczkowe metodą numeryczną
Ostatnio zmieniony 8 kwie 2015, o 09:34 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania. Całe wyrażenia matematyczne umieszczaj w tagach[latex] [/latex] .
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania. Całe wyrażenia matematyczne umieszczaj w tagach
-
- Użytkownik
- Posty: 4211
- Rejestracja: 25 maja 2012, o 21:33
- Płeć: Mężczyzna
- Lokalizacja: Kraków PL
- Podziękował: 2 razy
- Pomógł: 758 razy
[Pascal] Równanie różniczkowe metodą numeryczną
Przy numerycznym rozwiązywaniu równań różniczkowych przy pomocy komputera od samych równań ważniejsza jest używana (zaimplementowana) metoda, a ta może być różnego rzędu (im wyższy rząd tym większa dokładność i stabilność), jawna lub niejawna, stałokrokowa lub zmiennokrokowa (adaptacyjna), bez korekcji, predykcyjna, korekcyjna lub kombinowana.
Czy wydający temat zadania określił jaka metoda rozwiązania ma być użyta?
W grę wchodzą (jako najprostsze) metody: Eulera (jawna i niejawna) oraz Rungego-Kutty 2-go rzędu.
Generalnie numeryczne rozwiązywanie równań różniczkowych odbywa się iteracyjnie, tzn. na podstawie pochodnej i wartości rozwiązania uzyskanej w kroku \(\displaystyle{ n}\) (poprzednim) oblicza się wartość w kroku \(\displaystyle{ n+1}\) (bieżącym).
Przekształca się układ równań różniczkowych do postaci:
Gdy jest jedno równanie różniczkowe pierwszego rzędu, to ww. postać jest skalarna.
Dla najprostszej metody (jawnej Eulera) iteracje są zdefiniowane w sposób następujący:
W Twoim przypadku będzie:
Gdy przyjmiemy \(\displaystyle{ h=\Delta V=20}\) to w przedziale \(\displaystyle{ \left[0;2000\right]}\) będzie 100 iteracji.
Gdy uzyskana w ten sposób wartość \(\displaystyle{ c(2000)}\) będzie różnić się znacząco od analogicznej wartości uzyskanej np. dla \(\displaystyle{ h=10}\) (200 iteracji) oznacza, że krok \(\displaystyle{ h=20}\) był za duży i wynik uzyskany dla kroku \(\displaystyle{ h=10}\) należy porównać z wynikiem dla kroku jeszcze mniejszego (np. \(\displaystyle{ h=5}\)).-- 16 kwi 2015, o 16:20 --Zarys kodu programu z zaimplementowana jawną metodą Eulera będzie wyglądał następująco:Oczywiście deklaracje trzeba rozpisać, a program rozbudować o to co „zakomentowałem”, oraz np. o ocenę dokładności etc.
Oczywiście jądro programu można zakodować jako procedurę, aby można było ją wykonywać wielokrotnie, a podczas iteracji wypełniać tablicę z kolejnymi wartościami rozwiązania, aby można było wykonać wykres, etc.
Jeśli znasz choć trochę Pascal i potrafisz ułożyć proste algorytmy przetwarzające np. tablice jednowymiarowe (szukanie minimum, liczenie elementów należących do pewnego przedziału, sortowanie, etc.) to krok po kroku osiągniesz zadowalający efekt.
Czy wydający temat zadania określił jaka metoda rozwiązania ma być użyta?
W grę wchodzą (jako najprostsze) metody: Eulera (jawna i niejawna) oraz Rungego-Kutty 2-go rzędu.
Generalnie numeryczne rozwiązywanie równań różniczkowych odbywa się iteracyjnie, tzn. na podstawie pochodnej i wartości rozwiązania uzyskanej w kroku \(\displaystyle{ n}\) (poprzednim) oblicza się wartość w kroku \(\displaystyle{ n+1}\) (bieżącym).
Przekształca się układ równań różniczkowych do postaci:
- \(\displaystyle{ \vec{y}(x)'=f(\vec{y}(x);x)}\)
Gdy jest jedno równanie różniczkowe pierwszego rzędu, to ww. postać jest skalarna.
Dla najprostszej metody (jawnej Eulera) iteracje są zdefiniowane w sposób następujący:
- \(\displaystyle{ \vec{y}(x_{n+1})=f(\vec{y}(x_n);x_n)\mbox{·}h+\vec{y}(x_n)}\)
W Twoim przypadku będzie:
- \(\displaystyle{ \frac{dc(V)}{dV}=f(c(V);V)=\frac{-kc(V)}{Q\left(c(V)-v\right)} \\
V_0=0 \\
c(V_0)=c_{in}}\)
Gdy przyjmiemy \(\displaystyle{ h=\Delta V=20}\) to w przedziale \(\displaystyle{ \left[0;2000\right]}\) będzie 100 iteracji.
Gdy uzyskana w ten sposób wartość \(\displaystyle{ c(2000)}\) będzie różnić się znacząco od analogicznej wartości uzyskanej np. dla \(\displaystyle{ h=10}\) (200 iteracji) oznacza, że krok \(\displaystyle{ h=20}\) był za duży i wynik uzyskany dla kroku \(\displaystyle{ h=10}\) należy porównać z wynikiem dla kroku jeszcze mniejszego (np. \(\displaystyle{ h=5}\)).-- 16 kwi 2015, o 16:20 --Zarys kodu programu z zaimplementowana jawną metodą Eulera będzie wyglądał następująco:
Kod: Zaznacz cały
Program RRREuler;
{ Deklaracje }
Function F (c, V : extended ) : extended; { extended: na PC najszerszy typ float }
begin
F := -k*c/Q/(c-vvv) { vvv=3,8 }
end;
begin
{ Inicjacja i wczytanie danych }
h := cmax/itenum; { itenum: liczba kroków }
V := V0; c := cin; { V0=0 }
for i = 1 to itenum
do
begin
nextV := F(c,V)*h+V; { tu można bezpośrednio przypisać do V }
c := c + h;
V := nextV; { patrz komentarz powyżej }
end;
{ Zakończenie }
end.
Oczywiście jądro programu można zakodować jako procedurę, aby można było ją wykonywać wielokrotnie, a podczas iteracji wypełniać tablicę z kolejnymi wartościami rozwiązania, aby można było wykonać wykres, etc.
Jeśli znasz choć trochę Pascal i potrafisz ułożyć proste algorytmy przetwarzające np. tablice jednowymiarowe (szukanie minimum, liczenie elementów należących do pewnego przedziału, sortowanie, etc.) to krok po kroku osiągniesz zadowalający efekt.