Ćwiczenie 5. Matlab – równania różniczkowe, aproksymacja =
Transkrypt
Ćwiczenie 5. Matlab – równania różniczkowe, aproksymacja =
Ćwiczenie 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('Dy=1+y^2') dsolve f= tan(t+C1) f= dsolve('Dy=1+y^2','x') =dsolve f= tan(x+C1) Po wstawieniu przykładowego warunku początkowego: f = dsolve dsolve('Dy=1+y^2','y(0)=1') %sprawdzenie spr= diff(f,t)-1-f^2 f= tan(t+1/4*pi) s= 0 Przykład 2. Rozwiązać równanie: 5( ) = −75( ) r=dsolve = -a*x') r=dsolve('Dx dsolve r= C1*exp(-a*t) Przykład 3. Równanie różniczkowe drugiego stopnia: (5) = 89:( 5) − 5 z dwoma warunkami początkowymi: y(0)=1; y'(0)=0 y = dsolve('D2y=cos(2*x)-y','y(0)=1','Dy(0)=0', 'x') dsolve y= 4/3*cos(x)-1/3*cos(2*x) simplify(y) %uproszczenie simplify ans = 4/3*cos(x)-2/3*cos(x)^2+1/3 Przykład 4. Rozwiązać równanie: => ? =5> =? warunki początkowe: u(0)=1, u'(0)=-1, u"(0)=π 1 u = dsolve('D3u=u','u(0)=1','Du(0)=-1','D2u(0) = pi','x') dsolve 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 d3u/dx3 , D2u(0) odpowiada u"(0) 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( ) = −4A(B) + 3C(B) S = dsolve('Df = 3*f+4*g', 'Dg = -4*f+3*g') dsolve 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: f = S.f 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(0) = 0, g(0) = 1') dsolve f= exp(3*t)*sin(4*t) g= exp(3*t)*cos(4*t) Poniżej jeszcze jeden przykład składni w Symbolic Math Toolbox. + 4I(B) = J K ; y(0)=1 y = dsolve('Dy+4*y dsolve = exp(-t)', 'y(0) =1') spr=diff diff(y,t)+4*y %sprawdzenie rozwiązania diff spr = simplify(spr) simplify t=0; %sprawdzenie warunku początkowego wp=subs subs(y) subs y= (1/3*exp(3*t)+2/3)*exp(-4*t) spr = exp(-4*t)*exp(3*t) spr = exp(-t) wp = 1 2 Zadanie Równanie oscylatora harmonicznego bez tłumienia to: + ω0 2 I(B) = 0 gdzie: y(t) – położenie ciała, ωO – częstość drgań, zaś oscylatora z tłumieniem: PQ I PI + 2β + ωO Q I(B) = 0 PB Q PB 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 ω0 i β oraz różnych warunków początkowych. Ćwiczenie Zadanie z ćw. 3 wykonane metodą rozwiązania równania różniczkowego: Samochód startuje w chwili t0=0 od prędkości v0=0 i przyspiesza ruchem jednostajnie przyspieszonym do prędkości v1 = 20m/s w czasie 5 sekund. Jedzie ze stałą prędkością przez 10 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=[0 5 15 19] V=[0 20 20 0 ] sp0=0; %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 for k=1:N 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=sp0; end 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 end S % wypisz tablicę wyrażeń symb. S(t) w przedziałach %wykresy subplot(3,1,1) for k=1:N ezplot(S(k),[T(k) T(k+1)]) hold on t=T(k+1); %końcowy czas przedziału zasieg(k)=subs(S(k)); %wstaw do wzoru end 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(end)); axis([T(1) T(end) 0 z]) title('s(t)'); %wykres prędkości syms t subplot(3,1,2) for k=1:N v(k)=diff(S(k)) ezplot(v(k),[T(k) T(k+1)]) hold on end axis([T(1) T(end) min(V)-5 max(V)+5]) title('v(t)'); %wykres przyspieszeń subplot(3,1,3) syms a for k=1:N a(k)=diff(v(k)) ezplot(a(k),[T(k) T(k+1)]); hold on end axis([T(1) T(end) min(A)-2 max(A)+2]); title('a(t)'); s(t) 200 100 0 0 5 10 t v(t) 15 0 5 10 t a(t) 15 5 10 x 15 20 10 0 5 0 -5 0 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[Ie − A(fe )]Q ehi gdzie fe to wartości zmiennej niezależnej, Ie 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 polyfit(x,y,n) it 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. Ćwiczenie Obliczyć współczynniki paraboli y=p1x2+p2x+p3, która przyjmuje wartości 0 na końcach przedziału <0,10>, a wartość 1 w połowie przedziału. Z warunków zadania wynika, że: x1=0, y1=0 x2=5, y2=1 x3=10, y3=0 Zapisujemy wartości współrzędnych x1,x2,x3 wektorze x, a wartości y1,y2,y3 w wektorze y x=[0, 5, 10] y=[0,1,0] 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=[0,5,10]; y=[0,1,0]; p=polyfit(x,y,2) plot(x,y,'o') %wykres punktowy % sprawdzenie na wykresie x1=0:0.1:10; y1=p(1)*x1.^2+p(2)*x1+p(3); hold on plot(x1,y1) Ćwiczenie Obliczyć współczynniki wielomianu 5-go stopnia, stanowiącego aproksymację dla zbioru punktów: p1(0, 0), p2(1, 1) , p3(2, 1) , p4(3, 1) , p5(4, 1), p6(5,0) Przeanalizować poniższe rozwiązanie: clear clc N=5 %stopień wielomianu x1=[0 1 2 3 4 5] y1=[0 1 1 1 1 0] p=polyfit polyfit(x1,y1,N) polyfit x=0:0.1:5; 5 y=0; %pętla sumująca elementy wielomianu for m=1:N+1 y=y+p(m)*x.^(N-m+1); end; %dwa wykresy plot(x1,y1,'o',x,y) axis([0 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) polyval gdzie p - wektor współczynników wielomianu ypi - wektor wartości wielomianu w zadanych punktach xx Realizacja obliczeń: xx=[0:0.1:10]; p= [1 3 1]; ypi=polyval(p,xx); plot(xx,ypi) % rysowanie wykresu paraboli w przedziale (0,10) Ćwiczenie Zbadać wielomiany stopnia od n=5 do 7, aproksymujące losowo wybrane wartości y z przedziału (0,10) 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(10*rand(1,5)) plot(x, y, 'o') for k=4:7 % pętla stopni wielomianu hold on p=polyfit polyfit(x,y,k) polyfit xx=0:0.1:5; yy=polyval polyval(p,xx); polyval plot(xx,yy) end 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:0.2:12]; oraz wyświetla wykresy y(x) oraz yy(xx) instrukcją plot. 6 2. Obliczyć współczynniki paraboli z=q1y2+q2y+q3, która przyjmuje wartości 0 na końcach przedziału <0,20>, a wartość 1 w połowie przedziału i narysować wykres tej paraboli. 7