MOiPP Wykład 3 Matlab Przykłady prostych metod obliczeniowych
Zliczanie warunkowe w tablicy 1-wymiarowej Ile w tablicy jest elementów dodatnich? M=-3:0.1:2 ile=0; %koniecznie inicjujemy zmienną! N=length(M) % funkcja length zwraca liczbę kolumn tablicy for i=1:N if M(i)>0 ile=ile+1; end end; disp(ile)
Zliczanie elementów dodatnich w tablicy dwuwymiarowej clear; clc a=rand(5,5)-0.5 %elementy dodatnie i ujemne iledod= 0; %inicjujemy zmienną for i= 1:1:5, for j = 1:1:5, if a(i , j)>0 iledod=iledod+1; end disp(iledod) 3
Sumowanie warunkowe (elementów dodatnich) w tablicy 1-wymiarowej suma_d=0; N=length(M) for i=1:N if M(i)>0 suma_d=suma_d+M(i); end end; disp(suma_d)
Sumowanie warunkowe elementów tablicy 2-wymiarowej clear; clc a=rand(5,5)-0.5 suma_d= 0; suma_u=0; for i= 1:1:5, for j = 1:1:5, if a(i , j)>0 suma_d=suma_d+a(i,j); else suma_u=suma_u+a(i,j); end disp('suma dodatnich:'),disp(suma_d) disp('suma ujemnych:'), disp(suma_u)
Obliczenia kinematyczne Ruch jednostajnie przyspieszony(opóźniony) v=v0+a*(t-t0)
Ruch jednostajnie przyspieszony Wykres v(t) – prędkość jest funkcją liniową, więc wystarczą dwa punkty dla wykresu t0=0, v0=0, tk=5,vk=20 %tworzymy dwa wektory t=[t0 tk] v=[v0 vk] plot(t, v, 'k')
Ruch jednostajnie przyspieszony s(t) to parabola, więc potrzebujemy więcej punktów t0=0, v0=0, tk=5,vk=20 a=(v-v0)/(t-t0) % "gęsta" oś czasu t=t0 : 0.1 : tk s=v0*t+a*t.^2/2 plot(t, s,'r') hold on %zatrzymanie wykresu v=v0+a*(t-t0) plot(t, v, 'k') title('s(t)-czerwony v(t) - czarny')
Ruch jednostajnie opóźniony t0=0, v0=20, tk=4, vk=0 a=(vk-v0)/(tk-t0) t=t0 : 0.1 : tk; s=v0*t+a*t.^2/2; subplot(2,1,1),plot(t, s) xlabel('t'),ylabel('s(t)') v=v0+a*(t-t0); subplot(2,1,2),plot(t, v) xlabel('t'),ylabel('v(t)')
Wykorzystanie macierzy w ruchu złożonym – odcinki czasowe - jednostajnie przyspieszony, - jednostajny, - jednostajnie opóźniony, t0=0, t1=t0+5, t2=t1+2*60, t3=t2+4 a1=4, a2=0, a3=-5 v0=0 v1=a1*(t1-t0)+v0 v2=a2*(t2-t1)+v1 v3=a3*(t3-t2)+v2 t=[t0 t1 t2 t3] %kolejne punkty czasowe v=[v0 v1 v2 v3] %odpowiednie prędkości plot(t, v) title('v(t)') axis([0 140 0 25])
… na marginesie … czasem wygodniejsza skala logarytmiczna [x,y] = fplot('1/sqrt(1+2e-7*x^2)',[1,1e6]); figure(1) plot(x,y) grid on figure(2) semilogx(x,y) semilogx plot Wykres w skali logarytmicznej
Trochę inaczej tworzymy wykres przyspieszenia t0=0, t1=t0+5, t2=t1+2*60, t3=t2+4 a1=4, a2=0, a3=-5 t=[t0, t0, t1, t1, t2, t2, t3, t3] a=[0, a1, a1, a2, a2, a3, a3, 0] figure(2) plot(t,a), grid
A jak narysować wykres s(t) ? Zostawiamy problem do samodzielnego rozwiązania
Zróżnicowanie metod obliczeniowych Zadanie: Obliczyć wartości drogi wykonanej przez ciało dla przyspieszenia a=4 w przedziale czasu t=[0, 5]. Utworzyć wykresy.
Sposób 1 t=0 : 0.1 : 5 a=4 s=a*t.^2/2 plot(t,s)
Sposób 2 a=0; b=5; n=50; h=(b-a)/n; for i=1:n+1 t(i)=a+(i-1)*h; s(i)=2*t(i)^2; end plot(t,s)
Obliczenia przy pomocy tzw. funkcji anonimowej Sposób 3 Obliczenia przy pomocy tzw. funkcji anonimowej Składnia funkcji anonimowej: nazwa_funkcji=@(lista_argumentów)(wyrażenie)
sinusoida=@(t)(sin(t)) fplot(sinusoida,[0,4*pi]) Przykład sinusoida=@(t)(sin(t)) fplot(sinusoida,[0,4*pi]) Nasze zadanie t=0:0.1:5 f = @(t)(2*t.^2); s=f(t) plot(t, s)
Sposób 4 t=[0:0.5:5]; n=length(t); for i=1:n s (i)=fs(t(i)); end Tworzymy osobny m-plik funkcyjny o nazwie fs.m: function y = fs(t) y=2*t^2; Teraz możemy wykorzystać naszą funkcję t=[0:0.5:5]; n=length(t); for i=1:n s (i)=fs(t(i)); end plot(t,s), grid
Aby wykorzystać naszą funkcję w poniższy sposób: s=fs(t); plot(t,s), grid argumentem funkcji jest tutaj wektor funkcja w m-pliku o nazwie fs.m musiałaby być zdefiniowana następująco: function y = fs(t) y=2*t.^2; bo elementowe podnoszenie do kwadratu 20
Zapis wielomianu w matematyce: w(x)=a0xn + a1xn-1 + a2xn-2 + ∙∙∙+ aixn-i + ∙∙∙+ an-2x2 + an-1x + an Matlab – zmiana indeksowania współczynników ponieważ w Matlabie indeksy macierzy zaczynają się od 1
w(x)=5x4 + 4x2 – x + 2 Wektor współczynników: A= [5 0 1 -1 2] Co już zauważyliśmy wykorzystując funkcję roots() znajdującą pierwiastki wielomianu n-tego stopnia