1
Laboratorium komputerowe 3 – przykładowe rozwiązania
zad. 1.
for x = 0:0.1:2
f = exp(x)*sin(x);
disp([x f]);
end
zad. 2.
for n = 1:100
s = 0;
for i = 1:n
s = s + i;
end
disp([n s]);
end
Alternatywnie możemy skorzystać ze wzoru na sumę wyrazów ciągu arytmetycznego i uprościć skrypt zmieniając część w ramce. Otrzymujemy:
for n = 1:100
s = (1+n)/2*n;
disp([n s])
end
2 zad. 3.
for p = 1:10 % oprocentowanie
kwota = 100;
for i = 1:5 % okres 5 lat
kwota = kwota*(1 + p/100);
end
kwota = round(100*kwota)/100; % zaokrąglenie do
% drugiego miejsca
% po przecinku disp([p kwota]);
end
Alternatywnie możemy skorzystać ze wzoru na dowolny wyraz ciągu geometrycznego i uprościć skrypt zmieniając część w ramce. Otrzymujemy:
for p = 1:10
kwota = 100;
kwota = kwota*(1 + p/100)^5;
kwota = round(100*kwota)/100;
disp([p kwota]);
end
zad. 4 (zad. 5 ze skryptu)
for i = 1:10
x = (5*i)^2;
disp(x);
end
3 zad. 5 (zad. 12 ze skryptu)
Ilustracja:
𝐢 \ 𝐣 𝟏 𝟐 𝟑 𝟒 𝟓 𝟔
𝟏 0 3 4 5 6 7
𝟐 3 0 5 6 7 8
𝟑 4 5 0 7 8 9
𝟒 5 6 7 0 9 10
𝟓 6 7 8 9 0 11
𝟔 7 8 9 10 11 0
Przy sumowaniu pomijamy elementy na przekątnej tablicy (taka sama liczba oczek – wartość równa zero). Poza przekątną w każdym elemencie tablicy mamy wartość i+j (i – wynik na pierwszej kostce, numer wiersza tablicy; j – wynik na drugiej kostce, numer kolumny tablicy).
s = 0;
for i = 1:6 % pierwsza kostka = numer wiersza for j = 1:6 % druga kostka = numer kolumny
if i ~= j % warunek dla elementów
% poza przekątną
s = s + i+j;
end
end end
s = s/36;
disp(s);
4
Alternatywnie możemy skorzystać z symetrii otrzymanej tablicy i ograniczyć się do zsumowania elementów pod przekątną (lub nad przekątną), a następnie podwojenia sumy.
W tym celu zmieniamy zakresy pętli. Instrukcja warunkowa nie jest już potrzebna.
Dla przypadku sumowania elementów pod przekątną otrzymujemy:
s = 0;
for i = 2:6 % numer wiersza tablicy
for j = 1:i-1 % numer kolumny tablicy
s = s + i+j;
end
end
s = s/18;
disp(s);
zad. 6.
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
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:
5 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. 7.
A = [2 2 -1 1; -1 1 2 3; 3 -1 4 -1; 1 4 -2 2];
b = [7; 3; 31; 2];
x = A\b;
6 zad. 8.
function s = sumapodprzekatna(A)
[n,m] = size(A); % odczytujemy rozmiar macierzy s = 0; % suma elementów
if n == m % sprawdzamy, czy macierz jest kwadratowa for i=2:n % i – numer wiersza
for j=1:i-1 % j – numer kolumny s = s + A(i,j);
end end
else
disp('Podana macierz nie jest kwadratowa');
end end
W ramach dodatkowego ćwiczenia zmodyfikować powyższą funkcję, aby sumowała:
- elementy nad przekątną, - elementy na przekątnej.