Matlab Przykłady prostych metod obliczeniowych
-
Upload
lavinia-vincent -
Category
Documents
-
view
60 -
download
0
description
Transcript of Matlab Przykłady prostych metod obliczeniowych
1
Matlab
• Przykłady prostych metod obliczeniowych
Wykład 3
MOiPP
2
M=-3:0.1:2ile=0; %koniecznie inicjujemy zmienną!N=length(M) % funkcja length zwraca liczbę kolumn tablicyfor i=1:N % pętla
if M(i)>0 % test warunku ile=ile+1;end
end;disp(ile)
Zliczanie warunkowe w tablicy 1-wymiarowej
Ile w tablicy jest elementów dodatnich?
3
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
end
end
disp(iledod)
Zliczanie elementów dodatnich w tablicy dwuwymiarowej
3
4
M=-3:0.1:2suma_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 dodatnich) w tablicy 1-wymiarowej
5
clear; clca=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 endenddisp('suma dodatnich:'),disp(suma_d)disp('suma ujemnych:'), disp(suma_u)
Sumowanie warunkowe elementów tablicy 2-wymiarowej
6
Obliczenia kinematyczneRuch jednostajnie przyspieszony(opóźniony)
v=v0+a*(t-t0)
7
Ruch jednostajnie przyspieszony
t0=0, v0=0, tk=5,vk=20%tworzymy dwa wektoryt=[t0 tk]v=[v0 vk]plot(t, v, 'k')xlabel('t'), ylabel('v')
Wykres v(t) – prędkość jest funkcją liniową, więc wystarczą dwa punkty dla wykresu
0 1 2 3 4 50
2
4
6
8
10
12
14
16
18
20
t
v
8
t0=0, v0=0, tk=5,vk=20a=(vk-v0)/(tk-t0)% "gęsta" oś czasut=t0 : 0.1 : tks=v0*t+a*t.^2/2plot(t, s,'r')hold on %zatrzymanie wykresuv=v0+a*(t-t0)plot(t, v, 'k')title('s(t)-czerwony v(t) - czarny')
Ruch jednostajnie przyspieszony
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 50
5
10
15
20
25
30
35
40
45
50s(t)-czerwony v(t) - czarny
s(t) to parabola, więc potrzebujemy więcej punktów
9
t0=0, v0=20, tk=4, vk=0a=(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)')
Ruch jednostajnie opóźniony
0 0.5 1 1.5 2 2.5 3 3.5 40
10
20
30
40
t
s(t)
0 0.5 1 1.5 2 2.5 3 3.5 40
5
10
15
20
tv(t
)
10
t0=0, t1=t0+5, t2=t1+2*60, t3=t2+4a1=4, a2=0, a3=-5v0=0v1=a1*(t1-t0)+v0v2=a2*(t2-t1)+v1v3=a3*(t3-t2)+v2t=[t0 t1 t2 t3] %kolejne punkty czasowev=[v0 v1 v2 v3] %odpowiednie prędkościplot(t, v)title('v(t)')axis([0 140 0 25])
Wykorzystanie macierzy w ruchu złożonym – odcinki czasowe- jednostajnie przyspieszony, - jednostajny,- jednostajnie opóźniony,
0 20 40 60 80 100 120 1400
5
10
15
20
25v(t)
11
[x,y] = fplot('1/sqrt(1+2e-7*x^2)',[1,1e6]);figure(1)plot(x,y)grid onfigure(2)semilogx(x,y) %skala logarytmiczna dla osi xgrid on
100
101
102
103
104
105
106
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Wykres w skali półlogarytmicznej osi x
… na marginesie … czasem wygodniejsza skala logarytmiczna
semilogx
0 1 2 3 4 5 6 7 8 9 10
x 105
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
plot
12
t0=0, t1=t0+5, t2=t1+2*60, t3=t2+4a1=4, a2=0, a3=-5t=[t0, t0, t1, t1, t2, t2, t3, t3]a=[0, a1, a1, a2, a2, a3, a3, 0]figure(2)plot(t,a), grid
0 20 40 60 80 100 120 140-5
-4
-3
-2
-1
0
1
2
3
4
Trochę inaczej tworzymy wykres przyspieszenia
13
A jak narysować wykres s(t) ?
Zadanie: Trzy przedziały czasowe:
1) t(0,10) v0=0 v1=60
2) t(10 20) v1=60 v2=60
3) t(20 30) v2=60 v3=0
14
clc,clear%danet0=0;t1=10;t2=20; t3=30;v0=0; v1=60; v2=60; v3=0;%1 przedziałT01=t0:0.1:t1;a01=(v1-v0)/(t1-t0);S01=a01*T01.^2/2;%2 przedział – tylko 2 punkty!T12=[t1 t2];a12=0;S12=S01(length(S01))+v1*(T12-t1)+a12 *(T12-t1).^2/2;%3 przedziała23=(v3-v2)/(t3-t2);T23=t2:0.1:t3;S23=S12(length(S12))+v2*(T23-t2)+a23*(T23-t2).^2/2%scalamy wektory z przedziałowT=[T01 T12 T23 ];S=[S01 S12 S23];plot(T,S)sk=S(length(S)) %końcowa droga
0 5 10 15 20 25 300
200
400
600
800
1000
1200
uwaga: dużymi literami nazwano zmienne wektorowe, a małymi dane elementarne (skalarne)
S(length(S)) – to ostatni element wektora
15
clc,clear%danet=[0 10 20 30];v=[0 60 60 0];s0=0;N=100; %liczba podprzedziałów, na jakie dzielimy każdy przedział jazdy%====="pętla" dla 3-ch przedziałówfor k=1:3 fprintf('Przedzial:%d\n',k) T(k,:)=t(k):(t(k+1)-t(k))/N:t(k+1); %podwektor czasu w wierszu k-tym i wszystkie jego kolumny a(k)=(v(k+1)-v(k))/(t(k+1)-t(k)); % przyspieszenie w k-tym przedziale S(k,:)=s0(k)+ v(k)*(T(k,:)-t(k)) + a(k)*(T(k,:)-t(k)).^2/2; %podwektor drogi w k-tym wierszu s0(k+1)=S(k,N+1); %przechowanie ostatniej wartości drogi dla następnego przedziału fprintf('Przebyto drogê:%f\n', s0(k+1))end %koniec pętli%przygotowanie danych do wykresuT=reshape(T',1,3*(N+1)); % rekonfiguracja 3-wierszowej macierzy T w macierz 1-wierszowąS=reshape(S',1,3*(N+1)); % to samo dla macierzy Splot(T,S) %rysujemy wykres%całkowita przebyta droga fprintf('Inny sposób - przebyto całkowita droge:%f\n', S(length(S))) %ostatni element tablicy S
.. a teraz bardziej "elegancki" kod…do samodzielnej analizy
16
Zróżnicowanie metod obliczeniowych
Zadanie: Obliczyć wartości drogi wykonanej przez ciało od prędkości początkowej V0=0, poruszającym się z przyspieszeniem a=4m/s2, w przedziale czasu t=[0, 5] s.Utworzyć wykres s(t).
17
t=0 : 0.1 : 5a=4s=a*t.^2/2plot(t,s)
Sposób 1: dwie tablice
18
a=0; b=5; n=50;h=(b-a)/n;for i=1:n+1t(i)=a+(i-1)*h;s(i)=2*t(i)^2;endplot(t,s)
Sposób 2: podział przedziału czasu i wykorzystanie iteracji
19
Składnia funkcji anonimowej:
nazwa_funkcji=@(lista_argumentów)(wyrażenie)
Obliczenia przy pomocy tzw. funkcji anonimowej
Sposób 3.
20
Przykład
sinusoida=@(t)(sin(t))fplot(sinusoida,[0,4*pi])
0 2 4 6 8 10 12-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
a=4;t=0:0.1:5f = @(t)(a*t.^2/2);s=f(t)plot(t, s)0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
0
5
10
15
20
25
30
35
40
45
50
Nasze zadanie
21
Sposób 4. Definicja funkcji w osobnym pliku Tworzymy osobny m-plik funkcyjny o nazwie fs.m:
function y = fs(t)
y=2*t^2;
t=[0:0.5:5];n=length(t);for i=1:ns (i)=fs(t(i));endplot(t,s), grid
Teraz możemy wykorzystać naszą funkcję z pliku:
2222
function y = fs(t)
y=2*t.^2;
t=[0:0.5:5];s=fs(t);plot(t,s), grid funkcja w m-pliku o nazwie fs.m musiałaby być zdefiniowana następująco:
Aby wykorzystać naszą funkcję w poniższy sposób:
argumentem funkcji jest tutaj wektor
bo elementowe podnoszenie do kwadratu
23
w(x)=a0xn + a1xn-1 + a2xn-2 + ∙∙∙+ aixn-i + ∙∙∙+ an-2x2 + an-1x + an
Zapis wielomianu w matematyce:
Matlab – zmiana indeksowania współczynników
ponieważ w Matlabie indeksy macierzy zaczynają się od 1
24
5x4 + 4x2 – x + 2 = 0
A= [5 0 1 -1 2]X=roots(A)%sprawdzenieS= A(1)*X(1)^4+ A(3)*X(1)^2+ A(4)*X(1) +A(5)%alboS=0;for k=1:5
S=S+A(k)*X(1)^(5-k);enddisp(S)
Wektor współczynników:
Poznany przykład ilustrujący indeksowanie tablicy