5. Matlab równania różniczkowe, aproksymacja Równania różniczkowe - funkcja dsolve() Funkcja oblicza symbolicznie rozwiązania równań różniczkowych zwyczajnych. Równania są określane przez symboliczne wyrażenia zawierające literę D do oznaczenia stopnia. Symbole D2, D3... DN, odnoszą się do drugiej, trzeciej,..., n-tej pochodnej. D2y jest zatem odpowiednikiem symbolicznym. Zmienna niezależna domyślna to t. Nazwy zmiennych symbolicznych nie powinny zatem zawierać litery D. Zmienną niezależną można zmienić i podać jako ostatni argument. Warunki początkowe mogą być określone przez dodatkowe równania. Jeśli nie określono warunków początkowych, rozwiązania zawierają stałe całkowania: C1, C2, itp. Przykład 1. Rozwiązać równanie różniczkowe: () = + () f=dsolve dsolve('dy=1+y^2') tan(t+c1) f=dsolve dsolve('dy=1+y^2','x') tan(x+c1) Po wstawieniu przykładowego warunku początkowego: dsolve('dy=1+y^2','y()=1') %sprawdzenie spr= diff(f,t)-1-f^2 tan(t+1/4*pi) s= Przykład 2. Rozwiązać równanie: 5() = 75() r=dsolve dsolve('dx = -a*x') r = C1*exp(-a*t) Przykład 3. Równanie różniczkowe drugiego stopnia: (5) 5 = 89:(5) z dwoma warunkami początkowymi: y()=1; y'()= y = dsolve('d2y=cos(2*x)-y','y()=1','dy()=', 'x') y = 4/3*cos(x)-1/3*cos(2*x) simplify(y) %uproszczenie ans = 4/3*cos(x)-2/3*cos(x)^2+1/3 Przykład 4. Rozwiązać równanie: = >? =5 > =? warunki początkowe: u()=1, u'()=-1, u"()=π 1
u = dsolve('d3u=u','u()=1','du()=-1','d2u() = pi','x') u = 1/3*pi*exp(x)-1/3*(pi+1)*3^(1/2)*exp(-1/2*x)*sin(1/2*3^(1/2)*x)+ (1-1/3*pi)*exp(-1/2*x)*cos(1/2*3^(1/2)*x) D3u reprezentuje d 3 u/dx 3, D2u() odpowiada u"() Układ równań różniczkowych Funkcja dsolve rozwiązuje także układ równań różniczkowych zwyczajnych kilku zmiennych, z warunkami początkowymi lub bez. Przykład Dwa równania liniowe, pierwszego rzędu: @ = 3A(B) + 4C(B) ; D() S = dsolve('d 3*f+4*g', 'Dg = -4*f+3*g') = 4A(B) + 3C(B) S = f: [1x1 sym] g: [1x1 sym] Rozwiązania są zwracane w strukturze S. Można określić wartości f i g, wpisując: S.f exp(3*t)*(c1*sin(4*t)+c2*cos(4*t)) g = S.g g = exp(3*t)*(c1*cos(4*t)-c2*sin(4*t)) Jeśli chcemy uzyskać f i g bezpośrednio, oraz uwzględnić także warunki początkowe, wpisujemy: [f,g] = dsolve('df=3*f+4*g, Dg =-4*f+3*g', 'f() =, g() = 1') g = exp(3*t)*sin(4*t) exp(3*t)*cos(4*t) Poniżej jeszcze jeden przykład składni w Symbolic Math Toolbox. + 4I(B) = JK ; y()=1 y = dsolve('dy+4*y = exp(-t)', 'y() =1') spr=diff diff(y,t)+4*y %sprawdzenie rozwiązania spr = simplify(spr) t=; %sprawdzenie warunku początkowego wp=subs subs(y) y = spr = spr = wp = (1/3*exp(3*t)+2/3)*exp(-4*t) exp(-4*t)*exp(3*t) exp(-t) 1 2
Zadanie Równanie oscylatora harmonicznego bez tłumienia to: +ω 2 I(B) = gdzie: y(t) położenie ciała, ω O częstość drgań, zaś oscylatora z tłumieniem: P Q I PI + 2β PBQ PB +ω O Q I(B) = gdzie: β współczynnik tłumienia. Rozwiązać obydwa równania przyjmując różne warunki początkowe. Utworzyć wykresy y(t) dla założonych wartości ω i β oraz różnych warunków początkowych. Zadanie z ćw. 3 wykonane metodą rozwiązania równania różniczkowego: Samochód startuje w chwili t = od prędkości v = i przyspiesza ruchem jednostajnie przyspieszonym do prędkości v 1 = 2m/s w czasie 5 sekund. Jedzie ze stałą prędkością przez 1 sekund, a następnie hamuje przez 4 sekundy i zatrzymuje się. Przeanalizować i zrozumieć etapy wykonania zadania. %Ruch złożony, a=const clc,clear syms t tp sp vp a V %dane T=[ 5 15 19] V=[ 2 2 ] sp=; %droga początkowa N=length(T)-1; %liczba przedziałów s=dsolve('d2s=a','s(tp)=sp','ds(tp)=vp') %Obliczenie S(t) w przedziałach A(k)=(V(k+1)-V(k))/(T(k+1)-T(k)); % przyspieszenia tp=t(k); vp=v(k); a=a(k); if k==1 sp=sp; S(k)=subs(s); t=t(k+1); sp=subs(s(k)); %obliczenie war. pocz. dla nast. przedziału syms t %czas z powrotem symboliczny S % wypisz tablicę wyrażeń symb. S(t) w przedziałach %wykresy subplot(3,1,1) ezplot(s(k),[t(k) T(k+1)]) t=t(k+1); %końcowy czas przedziału zasieg(k)=subs(s(k)); %wstaw do wzoru zasieg %tablica zasięgów w przedziałach 3
z=max(zasieg) %na wypadek gdyby auto się cofało fprintf('auto przejechało %d m\n',zasieg()); axis([t(1) T() z]) title('s(t)'); %wykres prędkości syms t subplot(3,1,2) v(k)=diff(s(k)) ezplot(v(k),[t(k) T(k+1)]) axis([t(1) T() min(v)-5 max(v)+5]) title('v(t)'); %wykres przyspieszeń subplot(3,1,3) syms a a(k)=diff(v(k)) ezplot(a(k),[t(k) T(k+1)]); axis([t(1) T() min(a)-2 max(a)+2]); title('a(t)'); s(t) 2 1 5 1 15 t v(t) 2 1 5 1 15 t a(t) 5-5 5 1 15 x Aproksymacja Metoda aproksymacji polega na znalezieniu funkcji f(x), której wykres przechodzi w pobliżu zbioru zadanych punktów, zaś sama funkcja minimalizuje wartość pewnego kryterium dopasowania, najczęściej sformułowanego w postaci: 4
g c = d[i e A(f e )] Q ehi gdzie f e to wartości zmiennej niezależnej, I e to wartości zmiennej zależnej. Tego typu aproksymacja nazywana jest aproksymacją średniokwadratową. Niech w naszym przypadku funkcją aproksymującą f(x) będzie wielomian n-tego stopnia w(x). Wtedy do znalezienia współczynników wielomianu używamy funkcji polyfit, której składnia ma postać: a=polyf polyfit it(x,y,n) gdzie: x - jest zbiorem N posortowanych rosnąco wartości współrzędnych zmiennej niezależnej, y - jest zbiorem N odpowiadających wartości zmiennej zależnej, n - jest zadanym stopniem wielomianu aproksymującego, a - jest wektorem poszukiwanych wartości współczynników wielomianu aproksymującego. Obliczyć współczynniki paraboli y=p 1 x 2 +p 2 x+p 3, która przyjmuje wartości na końcach przedziału <,1>, a wartość 1 w połowie przedziału. Z warunków zadania wynika, że: x 1=, y 1= x 2=5, y 2=1 x 3=1, y 3= Zapisujemy wartości współrzędnych x 1,x 2,x 3 wektorze x, a wartości y 1,y 2,y 3 w wektorze y x=[, 5, 1] y=[,1,] Wykonujemy funkcję polyfit p=polyfit(x,y,2) Metoda obliczeń w Matlab-ie: % Obliczenie współczynników paraboli y(x)=p(1)*x^2 + p(2)*x+p(3) x=[,5,1]; y=[,1,]; p=polyfit(x,y,2) plot(x,y,'o') %wykres punktowy % sprawdzenie na wykresie x1=:.1:1; y1=p(1)*x1.^2+p(2)*x1+p(3); plot(x1,y1) Obliczyć współczynniki wielomianu 5-go stopnia, stanowiącego aproksymację dla zbioru punktów: p1(, ), p2(1, 1), p3(2, 1), p4(3, 1), p5(4, 1), p6(5,) Przeanalizować poniższe rozwiązanie: clear clc N=5 %stopień wielomianu x1=[ 1 2 3 4 5] y1=[ 1 1 1 1 ] p=polyfit polyfit(x1,y1,n) x=:.1:5; 5
y=; %pętla sumująca elementy wielomianu for m=1:n+1 y=y+p(m)*x.^(n-m+1); ; %dwa wykresy plot(x1,y1,'o',x,y) axis([ 5-1 2]) Obliczenie wartości wielomianu o znanych współczynnikach Wartości otrzymanego wielomianu, w dowolnych zadanych punktach wektorem xx oblicza funkcja polyval. ypi = polyval(p,xx) gdzie p - wektor współczynników wielomianu ypi - wektor wartości wielomianu w zadanych punktach xx Realizacja obliczeń: xx=[:.1:1]; p= [1 3 1]; ypi=polyval(p,xx); plot(xx,ypi) % rysowanie wykresu paraboli w przedziale (,1) Zbadać wielomiany stopnia od n=5 do 7, aproksymujące losowo wybrane wartości y z przedziału (,1) dla punktów x=[1 2 3 4 5] oraz zgromadzić wykresy funkcji wielomianowych w jednym układzie współrzędnych. Realizacja obliczeń: clc x=1:5; y=round(1*rand(1,5)) plot(x, y, 'o') for k=4:7 % pętla stopni wielomianu p=polyfit polyfit(x,y,k) xx=:.1:5; yy=polyval polyval(p,xx); plot(xx,yy) Jak można zauważyć jednoznaczność rozwiązania istnieje dla stopnia wielomianu n mniejszego od liczby punktów N. Zadania 1. Napisać program, który wczytuje stopień wielomianu n instrukcją: n = input('n = ') oblicza wektor P współczynników wielomianu instrukcją polyfit dla danych: x=[1:12]; y=[1.2 3.7 4.7 4.5 3.4 1.9 1.7 1.8 2.3 3.8 5.4 7.5]; oblicza wartości yy wielomianu instrukcją polyval dla danych: xx =[1:.2:12]; oraz wyświetla wykresy y(x) oraz yy(xx) instrukcją plot. 6
2. Obliczyć współczynniki paraboli z=q 1 y 2 +q 2 y+q 3, która przyjmuje wartości na końcach przedziału <,2>, a wartość 1 w połowie przedziału i narysować wykres tej paraboli. 7