1
Laboratorium komputerowe 4 – przykładowe rozwiązania
część 1: zadania z wykorzystaniem pętli for
Przypomnienie
Definicja funkcji musi zostać zapisana w pliku o takiej samej nazwie, jak nazwa funkcji.
Przy nazwach funkcji proszę zwracać uwagę na małe/wielkie litery oraz ogólne zasady tworzenia nazw. Plik funkcyjny musi zaczynać się od nagłówka funkcji i zawierać definicję tylko jednej funkcji.
zad. 1.
function b = wektor_dodatnie(a)
n = length(a);
b = [];
for i = 1:n
if a(i) > 0
b = [b a(i)];
end
end end
% wywołanie funkcji (np. w Command Window):
x = [2,-1,0.5,1.2,3,-4,5,7,-2]
wektor_dodatnie(x)
2 część 2: zadania z wykorzystaniem pętli while
zad. 2 (zad. 1 z piątego rozdziału skryptu)
x = input('Podaj liczbe: '); % wczytanie pierwszej liczby
maks = x; % liczba największa
while x ~= 0 % wczytanie zera kończy działanie pętli x = input('Podaj liczbe: '); % wczytanie kolejnej
% liczby
if x > maks % jeśli wczytany x jest większy niż
% dotychczasowa liczba największa
maks = x; % to uaktualniamy liczbę największą end
end
disp(maks);
zad. 3 (zad. 2 z piątego rozdziału skryptu)
W celu obliczenia średniej z liczb wprowadzonych z klawiatury należy dodawać kolejne wczytane liczby oraz zliczać ile liczb zostało wczytanych.
x = input('Podaj liczbe: '); % wczytanie pierwszej liczby
n = 1; % licznik wczytanych liczb
s = x; % suma liczb,
% na początku równa pierwszej
% wczytanej liczbie
while x~=0
x = input('Podaj liczbe: '); % wczytanie kolejnej % liczby
n = n + 1; % zwiększenie licznika
s = s + x; % dodanie wczytanej liczby
end
3
% obliczenie średniej
% ostatnią wczytaną liczbą jest zero, które kończy pętlę
% i nie jest uwzględniane przy obliczaniu średniej,
% dlatego wszystkich wczytanych liczb (bez zera) jest n-1
if n > 1
s=s/(n-1);
disp(s);
else
disp('Nie wczytano liczb różnych od zera.') end
zad. 4 (zad. 5 z piątego rozdziału skryptu)
fpp = 1; % wyraz poprzedni poprzedniego
% - numer wyrazu: n-2
fp = 1; % wyraz poprzedni – numer wyrazu: n-1 f = fpp + fp; % wyraz bieżący – numer wyrazu: n n = 2;
while f < 1000
% w każdej iteracji wyraz poprzedni staje się poprzednim
% poprzedniego, wyraz bieżący staje się poprzednim oraz
% obliczamy nowy wyraz bieżący fpp = fp;
fp = f;
f = fpp + fp;
n = n+1;
end
% po wykonaniu ostatniej iteracji
% ostatnim wyrazem mniejszym niż 1000 jest wyraz fp,
% wyraz f jest pierwszym wyrazem większym niż 1000.
disp(n-1);
disp(fp);
Szukanym wyrazem jest wyraz: 𝐹15 = 987 (wyrazy zaczynamy indeksować od zerowego).
4 zad. 5.
eps = 1e-6; % przyjęta dokładność obliczeń
ap = 3; % początkowa wartość wyrazu
% poprzedniego – należy przypisać
% taką wartość, aby pierwsze
% sprawdzenie warunku w pętli
% dało logiczną prawdę n = 0;
a = 1; % pierwszy wyraz ciągu
while abs(a-ap) > eps
n = n+1;
ap = a; % poprzedni wyraz ciągu
a = sqrt(8 + 2*a); % bieżący wyraz ciągu end
disp(a) % wynik – granica ciągu
Uzyskany wynik: 4.0000 (przy format long: 3.999999792882208)
zad. 6.
1
1 − 𝑥= ∑(−1)𝑛+1 (𝑥 − 2)𝑛
∞
𝑛=0
= −1 + (𝑥 − 2) − (𝑥 − 2)2+ (𝑥 − 2)3− (𝑥 − 2)4+ . . .
Ciąg wyrazów szeregu
𝑎𝑛 = (−1)𝑛+1 (𝑥 − 2)𝑛 zapisujemy w postaci rekurencyjnej:
{ 𝑎0 = −1 𝑎𝑛 = − (𝑥 − 2) 𝑎𝑛−1 , 𝑛 > 0
Jeśli nie potrafimy zapisać ciągu wyrazów szeregu w postaci rekurencyjnej analizując kolejne wyrazy, możemy spróbować obliczyć:
𝑎𝑛 𝑎𝑛−1
5
Takie podejście oczywiście nie zawsze będzie działało, ale ograniczamy się tylko do przypadków, kiedy zależność rekurencyjną możemy wyznaczyć właśnie poprzez obliczenie ilorazu dwóch kolejnych wyrazów.
Dla bieżącego przykładu:
𝑎𝑛
𝑎𝑛−1 = (−1)𝑛+1 (𝑥 − 2)𝑛
(−1)𝑛 (𝑥 − 2)𝑛−1 = (−1)𝑛 (−1)(𝑥 − 2)𝑛−1(𝑥 − 2)
(−1)𝑛 (𝑥 − 2)𝑛−1 = − (𝑥 − 2)
Funkcja:
function s = szereg2(x)
eps = 1e-6; % przyjęta dokładność obliczeń
n = 0;
a = -1; % pierwszy wyraz szeregu
s = a; % suma z pierwszym wyrazem
if x > 1 && x < 3 % przedział zbieżności szeregu
while abs(a) > eps
n = n + 1;
a = -(x-2)*a; % wyraz szeregu
s = s + a; % suma szeregu
end
else
disp('Dla podanego x szereg jest rozbiezny');
end
end
Przykładowe wywołanie w Command Window:
format long szereg2(2.7)
% dla porównania możemy sprawdzić wynik ścisły:
x = 2.7;
1/(1-x)
6 zad. 7.
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