1
Laboratorium komputerowe 5 – przykładowe rozwiązania
zad. 1.
a)
function c=dwawektory1(a,b)
n = length(a); % liczba elementów w wektorze a m = length(b); % liczba elementów w wektorze b if n==m
for i=1:n
c(2*i-1) = a(i); % elementy nieparzyste,
% do których wpisujemy
% kolejne elementy z a c(2*i) = b(i); % elementy parzyste,
% do których wpisujemy
% kolejne elementy z b end
else
disp('Wektory maja rozna liczbe elementow.');
end end
Uwaga
W ramach sprawdzenia, w Command Window albo w innym skrypcie, utworzyć dwa wektory i sprawdzić działanie funkcji.
a = [1 2 3 4 5];
b = [-1 -2 -3 -4 -5];
dwawektory1(a,b) Wynik:
[1 -1 2 -2 3 -3 4 -4 5 -5]
2 b)
function c=dwawektory2(a,b)
n = length(a); % liczba elementów w wektorze a m = length(b); % liczba elementów w wektorze b if n==m % ten sam przypadek co w podpunkcie a)
for i=1:n
c(2*i-1) = a(i);
c(2*i) = b(i);
end
elseif n>m % wektor a jest dłuższy
for i=1:m % tak samo jak w podpunkcie a) c(2*i-1) = a(i);
c(2*i) = b(i);
end
for i=m+1:n % zostały do wpisania tylko
% elementy z wektora a c(m+i) = a(i);
end
else % wektor b jest dłuższy
for i=1:n % tak samo jak w podpunkcie a) c(2*i-1) = a(i);
c(2*i) = b(i);
end
for i=n+1:m % zostały do wpisania tylko
% elementy z wektora b c(n+i) = b(i);
end
end end
3 zad. 2.
a)
function A = macierz1(n)
num = 1; % liczba, która będzie wpisywana
% jako kolejny element macierzy A(i,j) for i=1:n
for j=1:n
A(i,j) = num;
num = num + 1; % definiujemy kolejną liczbę end
end end
b)
function A = macierz2(n)
num = 1; % liczba, która będzie wpisywana do A(i,j) for j=1:n % dla kolejnych kolumn
for i=1:n % przechodzimy po wierszach A(i,j) = num;
num = num + 1; % definiujemy kolejną liczbę
end end
end
Alternatywnie możemy wykorzystać funkcję z podpunktu a):
function A = macierz2(n)
A = macierz1(n)'; % transpozycja macierzy
% zwróconej przez funkcję
% macierz1() end
4 c)
function A = macierz3(n)
p = 1; % zmienna, za pomocą której będziemy
% sterowali porządkiem wpisywanych liczb
% w kolejnych wierszach:
% od początku albo od końca
num = 1; % liczba, która będzie wpisywana do A(i,j) for i=1:n
if p>0
for j=1:n % od początku wiersza A(i,j) = num;
num = num + 1;
end else
for j=n:-1:1 % od końca wiersza A(i,j) = num;
num = num + 1;
end end
p = -p; % w następnym wierszu porządek
% będzie przeciwny niż w obecnym end
end
zad. 3.
s1 = 0; % zmienna do obliczenia sumy s2 = 1; % zmienna do obliczenia iloczynu for i=3:15
s1 = s1 + (i+3)/(i+7);
end
for j=4:16
s2 = s2 * (j+2)/(j+6);
end
s = (2+s1)/(3*sqrt(2)+s2);
disp(s);
Wynik:
2.7120
5 Uwaga:
Trochę matematyki – w tym konkretnym przypadku możemy zamienić tożsamościowo zakres indeksów w sumie lub iloczynie i następnie uprościć program. Przykładowo możemy zrobić podstawienie 𝑗 = 𝑖 + 1, czyli 𝑖 = 𝑗 − 1. Stosujemy to podstawienie do iloczynu i otrzymujemy:
2 + ∑ 𝑖 + 3 𝑖 + 7
15𝑖=3
3√2 + ∏ 𝑗 + 2 𝑗 + 6
16𝑗=4
= 2 + ∑ 𝑖 + 3 𝑖 + 7
15𝑖=3
3√2 + ∏ 𝑖 + 1 + 2 𝑖 + 1 + 6
16−1𝑖=4−1
= 2 + ∑ 𝑖 + 3 𝑖 + 7
15𝑖=3
3√2 + ∏ 𝑖 + 3 𝑖 + 7
15𝑖=3
Teraz zakresy indeksów sumy i iloczynu, jak również samo wyrażenie są takie same. Program można zapisać następująco:
s1 = 0; % zmienna do obliczenia sumy s2 = 1; % zmienna do obliczenia iloczynu for i=3:15
w = (i+3)/(i+7);
s1 = s1 + w;
s2 = s2 * w;
end
s = (2+s1)/(3*sqrt(2)+s2);
disp(s);
zad. 4.
n = 1;
an = (sin(n)–0.1*n*n+20)/(n+1);
while an>0 n = n+1;
an = (sin(n)–0.1*n*n+20)/(n+1);
end
disp('Numer wyrazu: ');
disp(n);
disp('Wyraz ciągu: ');
disp(an);
Wyniki:
Numer wyrazu:
15
Wyraz ciągu:
-0.11561
6 zad. 5.
Metoda 1
Najpierw znajdujemy wszystkie elementy większe od 10, a w drugim kroku znajdujemy najmniejszy z nich. Jest to metoda mniej efektywna, wymaga zapamiętania wszystkich elementów większych od 10, a następnie przeglądnięcie ich w celu znalezienia najmniejszego.
tmp=[]; % wektor pusty, do którego będą wpisywane
% elementy an większe od 10 for n = 1:100
an = 0.5*cos(n-2)+10;
if an>10
tmp = [tmp an]; % dopisujemy na koniec
% wektora tmp element an end
end
m = min(tmp);
disp('Szukany element to: ');
disp(m);
Metoda 2
Przeglądamy po kolei wszystkie elementy i od razu wybieramy najmniejszy z tych, z które są większe od 10.
m = Inf; % szukany element najmniejszy większy od 10
% na początku przypisujemy wartość
% nieskończoność for n = 1:100
an = 0.5*cos(n-2)+10;
if an>10 && an<m % jeśli aktualny an jest większy
% od 10 i mniejszy od dotychczas
% znalezionego elementu najmn.
m = an; % uaktualniamy wartość m end
end
disp('Szukany element to: ');
disp(m);
Wynik: 10.002