Obliczenia iteracyjne

Transkrypt

Obliczenia iteracyjne
Strona 1 z 9
Lekcja 8
Obliczenia iteracyjne
Zmienne iteracyjne (wyliczeniowe)
Obliczenia iteracyjne wymagają zdefiniowania specjalnej zmiennej nazywanej iteracyjną lub
wyliczeniową. Zmienną iteracyjną od zwykłej zmiennej różni to, że zwykłe zmienne mogą przyjmować
jedynie jedną wartość. Zmienne iteracyjne natomiast przyjmują wiele wartości z pewnego zakresu z
określonym stałym krokiem. Krok, z jakim zmienna iteracyjna przyjmuje wartości z danego przedziału
może być domyślnie jeden, lub też możemy go dowolnie zdefiniować. W obliczeniach, gdy użyjemy w
wyrażeniu zmiennej iteracyjnej, MathCad oblicza wartość wyrażenia dla każdej wartości zmiennej
iteracyjnej z definiowanego przedziału. Definiując zmienną iteracyjną korzystamy z klawisza ; lub z menu
"Calculator Toolbar", przycisk m..n. W każdym z tych przypadków uzyskamy .. , będącym
zaproszeniem do wpisania dolnej (znacznik po lewej stronie ..) i górnej (znacznik po prawej stronie ..)
granicy definiowanej zmiennej. Definicja zmiennej iteracyjnej musi zawierać:
(i) nazwę zmiennej;
(ii) znak := lub ≡ ;
(iii) poprawnie określony zakres zmian dla zmiennej iteracyjnej.
j := 0 .. 5
k := 1 , 1.1 .. 2
piszemy: j:0;5
Ten zapis oznacza, że zmienna j przyjmuje wartości
0, 1, 2, 3, 4, 5. Czyli kolejne 6 wartości z przedziału od 0 do 5 z
domyślnym krokiem 1.
Piszemy k:1,1.1;2
Ten zapis oznacza, że zmienna k przyjmuje kolejne
wartości od 1 do 2 z krokiem wyliczonym jako różnica
dwóch pierwszych liczb, czyli krok wynosi
1.1 - 1 = 0.1
j =
0
1
2
3
4
5
k=
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
Jeśli użyjemy zmiennej iteracyjnej, MathCad przeprowadzi obliczenia dla każdej wartości tej zmiennej
zawartej w definiowanym przedziale. Jednym z możliwych zastosowań zmiennej iteracyjnej jest niejawne
definiowanie (wypełnianie elementów) wektora lub macierzy.
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 2 z 9
Lekcja 8
xtj := j 2 + 1
Piszemy xt[j:^2{spacja}+1
xtj =
W tym przypadku MathCad oblicza kolejne
elementy wektora xtj począwszy od indeksu 0,
a skończywszy na indeksie 5 dla każdej wartości j
zgodnie z podaną formułą.
1
2
5
10
17
26
Uwaga! Nie można definiować zmiennych iteracyjnych w oparciu o inne zmienne iteracyjne. Zapis i:=j+1,
gdzie j jest wcześniej zdefiniowaną zmienną iteracyjną jest błędny i prowadzi do wygenerowania przez
MathCad odpowiedniego komunikatu.
i := j + 1
Definiując zmienne iteracyjne, do podawania zakresu zmian, używać możemy zarówno liczb jak i innych
wcześniej zdefiniowanych zmiennych. Zmienne iteracyjne definiować możemy zarówno jako rosnące jak i
malejące.
Zmienna kk1 zmienia się
malejąco
N := 10
Zmienna kk2 zmienia się
rosnąco
kk1 := N , N − 1 .. 0
kk2 := 0 , 1 .. N
kk1 =
kk2 =
10
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
10
Zmienne iteracyjne pozwalają na tablicowanie funkcji, oraz wyświetlanie zawartości tablic etapami. Chcąc
wyświetlić elementy tablicy możemy skorzystać z zmiennej indeksowanej lub nie indeksowanej.
Tablicujemy funkcję sin(x)
Wartości funkcji sin(x) zapisujemy w wektorze xp. Wektor xp zawiera wartości funkcji sin(x) dla x
należącego do przedziału [0,2π] i zmieniającego się z krokiem π/6.
i := 0 .. 12
⎛ π⎞
⎝ 6⎠
xpi := sin ⎜ i ⋅
ii := 0 , 2 .. 12
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 3 z 9
Lekcja 8
Stosujemy zmienne indeksowane
Wyświetlamy wszystkie
elementy wektora xp
i =
0
1
2
3
4
5
6
7
8
9
10
11
12
xpi =
0
0.5
0.866
1
0.866
0.5
0
-0.5
-0.866
-1
-0.866
-0.5
0
Wyświetlamy co drugi
element wektora xp
ii =
0
2
4
6
8
10
12
xpii =
Stosujemy zmienną nie indeksowaną
Jeżeli stosujemy nazwę wektora bez
indeksów, nasze działania dotyczą
wszystkich elementów wektora.
0
0.866
0.866
0
-0.866
-0.866
0
0
xp =
0
1
2
3
4
5
6
7
8
9
10
11
12
0
0.5
0.866
1
0.866
0.5
0
-0.5
-0.866
-1
-0.866
-0.5
0
Wielokrotne przedziały zmiennych. Podwójne indeksy dolne
Jeżeli w równaniu użyjemy dwóch lub więcej przedziałów zmiennych (zmiennych iteracyjnych) MathCad
wykona obliczenia dla każdej wartości z każdego przedziału zmian oddzielnie. Można to wykorzystać przy
definiowaniu macierzy. Kolejność definiowania zmiennych iteracyjnych (indeksów w macierzy) nie ma
wpływu na przebieg obliczeń. Należy tylko pamiętać, że MathCad przyjmuje domyślną numerację wierszy i
kolumn od 0 (zera).
i := 0 .. 4
j := 0 .. 4
xxi , j := i + j
yyi , i := i
⎛⎜ 0
⎜1
xx = ⎜ 2
⎜3
⎜4
⎝
1 2 3 4
⎛⎜ 0
⎜0
yy = ⎜ 0
⎜0
⎜0
⎝
0 0 0 0
2 3 4
3 4 5
4 5 6
⎞
5
⎟
6⎟
7⎟
5 6 7 8
⎠
⎞
⎟
0⎟
0⎟
1 0 0 0
0 2 0
0 0 3
0 0 0 4
Kolejnym elementom macierzy xx
nadawane są wartości i+j. Macierz xx
wypełniana jest wierszami od góry
⎠
Miejsca w wektorze lub
macierzy, które nie zostaną
przez nas zdefiniowane,
MathCad wypełni zerami
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 4 z 9
Lekcja 8
Obliczenia iteracyjne
Obliczenia iteracyjne polegają na wykonaniu obliczeń dla zmiennej przyjmującej wartości z danego
przedziału z określonym krokiem.
N := 10
ri := cos ( Θ i) + 1
r=
2⋅π
N
Ten zapis oznacza, że zmienna Θ przyjmuje N
wartości z przedziału [0,2*π] z założonym krokiem
2π/N.
⋅i
xi := ri⋅ cos ( Θ i)
0
0
1
2
3
4
5
6
7
8
9
10
Θ i :=
i := 0 .. N
yi := ri⋅ sin ( Θ i)
0
2
1.809
1.309
0.691
0.191
0
0.191
0.691
1.309
1.809
2
x=
0
1
2
3
4
5
6
7
8
9
10
Sposób postępowania jest następujący:
tworzymy zmienną iteracyjną i, a
następnie obliczamy Θ i r oraz x i y. W
tym przykładzie zmienną iteracyjną jest
i przyjmujące 11 wartości całkowitych z
przedziału od 0 do N.
0
2
1.464
0.405
-0.214
-0.155
0
-0.155
-0.214
0.405
1.464
2
y=
0
1
2
3
4
5
6
7
8
9
10
0
1.063
1.245
0.657
0.112
0
-0.112
-0.657
-1.245
-1.063
0
Podobny efekt jak powyżej uzyskać można stosując operator wektoryzacji
⎯⎯⎯⎯⎯
→
r1 := ( cos ( Θ ) + 1)
⎯⎯⎯⎯→
x1 := ( r1 ⋅ cos ( Θ ) )
0
r1 =
0
1
2
3
4
5
6
7
8
9
10
2
1.809
1.309
0.691
0.191
0
0.191
0.691
1.309
1.809
2
⎯⎯⎯⎯
→
y1 := ( r ⋅ sin ( Θ ) )
0
x1 =
0
1
2
3
4
5
6
7
8
9
10
2
1.464
0.405
-0.214
-0.155
0
-0.155
-0.214
0.405
1.464
2
0
y1 =
0
1
2
3
4
5
6
7
8
9
10
0
1.063
1.245
0.657
0.112
0
-0.112
-0.657
-1.245
-1.063
0
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 5 z 9
Lekcja 8
Zamiast używać zmiennej iteracyjnej przyjmującej wartości całkowite, zastosować możemy zmienną iteracyjną
przyjmującą wartości ułamkowe. W tym przypadku zamiast wektorów wygodniej jest użyć funkcji
ΘΘ := 0 ,
N := 10
2⋅π
N
r ( Θ ) := cos ( Θ ) + 1
.. 2 ⋅ π
x( Θ ) := r ( Θ ) ⋅ cos ( Θ )
y( Θ ) := r ( Θ ) ⋅ sin ( Θ )
ΘΘ =
r ( ΘΘ ) =
x( ΘΘ ) =
y( ΘΘ ) =
0
0.628
1.257
1.885
2.513
3.142
3.77
4.398
5.027
5.655
6.283
2
1.809
1.309
0.691
0.191
0
0.191
0.691
1.309
1.809
2
2
1.464
0.405
-0.214
-0.155
0
-0.155
-0.214
0.405
1.464
2
0
1.063
1.245
0.657
0.112
0
-0.112
-0.657
-1.245
-1.063
0
Iteracja rekurencyjna
Iteracja rekurencyjna jednej zmiennej. W tym przypadku należy ustalić pierwszy element układu, a
następnie obliczyć następne, bazujące na wcześniejszych wynikach.
Algorytm Newtona znajdywania pierwiastka kwadratowego zadanej liczby a
a := 3
Definiujemy liczbę a
N := 10
i := 0 .. N
pierw 0 := a
Definiujemy liczbę kroków iteracyjnych N
Definiujemy wartość startową procedury iteracyjnej
pierw i +
pierw i+1 :=
2
a
pierw i
Obliczamy kolejne przybliżenia pierwiastka kwadratowego
z liczby a
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 6 z 9
Lekcja 8
Sprawdzenie obliczeń
i =
0
1
2
3
4
5
6
7
8
9
10
pierw i =
( pierw i) 2
( pierw i) 2 − a
3
2
1.75
1.732
1.732
1.732
1.732
1.732
1.732
1.732
1.732
9
4
3.063
3
3
3
3
3
3
3
3
6
1
0.063
3.189·10 -4
8.473·10 -9
0
0
0
0
0
0
Zmieniając wartość zmiennej a przeprowadzić
obliczenia sprawdzając jak wielkość liczby a
wpływa na szybkość uzyskania poprawnego
przybliżenia
Należy zwrócić uwagę na to, że wartość początkowa zdefiniowana jest jako zerowy element ciągu rozwiązań.
Każde nowe przybliżenie zdefiniowane jest w oparciu o poprzednio obliczony element. Ta zależność kolejnych
rozwiązań od poprzednio obliczonych jest charakterystyczna dla iteracji rekurencyjnej.
Iteracja rekurencyjna kilka zmiennych
Korzystając z wektorów i macierzy definiować można obliczenia iteracji rekurencyjnej realizowane
równocześnie dla kilku zmiennych. Pozwala to na równoczesne rozwiązywanie układów równań
przyrostowych. W przypadku obliczeń iteracyjnych dla pojedynczych równań, obliczenia
wykonywane są niezależnie i kolejno dla każdego z tych równań. Stosując wektory i macierze.
obliczenia dla kilku równań wykonywane są równocześnie.
Prowadzimy obliczenia równocześnie dla wszystkich czterech równań
N := 10
⎛ i0 ⎞
⎜
⎜ s0 ⎟ :=
⎜ d0 ⎟
⎜
⎝ r0 ⎠
t := 0 .. N
⎛ 50 ⎞
⎜ 22000
⎜
⎟
⎜ 0
⎝ 0 ⎠
⎛ it+1 ⎞
⎜
⎜ st+1 ⎟ :=
⎜ dt+1 ⎟
⎜
⎝ rt+1 ⎠
⎛ 0.0001 ⋅ st ⋅ it ⎞
⎜
⎜ st − 0.0001 ⋅ st ⋅ it ⎟
⎜ dt + 0.55 ⋅ it ⎟
⎜
⎝ rt + 0.45 ⋅ it ⎠
W powyższym układzie równań indeksy dolne t+1 znajdują się po lewej stronie znaku równości, natomiast po
prawej indeksy t. MathCad najpierw oblicza wartość wyrażeń po prawej stronie, a następnie podstawia pod
zmienne zapisane po stronie lewej.
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 7 z 9
Lekcja 8
Wyniki obliczeń
t=
0
1
2
3
4
5
6
7
8
9
10
it =
50
110
240.79
521.291
1.101·10 3
2.206·10 3
3.931·10 3
5.46·10 3
4.603·10 3
1.762·10 3
363.936
st =
2.2·10 4
2.189·10 4
2.165·10 4
2.113·10 4
2.003·10 4
1.782·10 4
1.389·10 4
8.43·10 3
3.828·10 3
2.066·10 3
1.702·10 3
dt =
rt =
0
27.5
88
220.435
507.145
1.113·10 3
2.326·10 3
4.488·10 3
7.491·10 3
1.002·10 4
1.099·10 4
0
22.5
72
180.356
414.937
910.558
1.903·10 3
3.672·10 3
6.129·10 3
8.2·10 3
8.993·10 3
Proszę sprawdzić, czy jest możliwe
rozwiązanie tego problemu jako
cztery niezależne równania.
Iteracja rekurencyjna wektora
Podobnie jak dla pojedynczych zmiennych iterację rekurencyjną można przeprowadzać na całych wektorach.
W tym przypadku mając dany wektor startowy kolejny obliczamy wykorzystując z wektora poprzedniego. W
obliczeniach korzystamy z indeksów górnych. Sposób postępowania jest następujący:
1. Definiujemy tzw. macierz przejścia od jednego wektora do drugiego;
2. Definiujemy wektor początkowy z indeksem górnym <>;
3. Definiujemy zmienną iteracyjną określającą liczbę iteracji;
4. Definiujemy regułę rekurencyjną korzystając z indeksów górnych;
5. Wyświetlamy wynik obliczeń.
Macierz przejścia:
⎛ 0.5
A := ⎜ 0.25
⎜
⎝ 0.25
0
0.2
⎞
0.9 0.1
0.1 0.7
⎠
⎛ 10 ⎞
Wektor początkowy:
v〈0〉 := ⎜ 25
⎜
⎝ 15 ⎠
Liczba iteracji:
k := 1 .. 8
Reguła rekurencyjna:
〈 〉
〈 〉
v k := A⋅ v k−1
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 8 z 9
Lekcja 8
⎛ 10
v = ⎜ 25
⎜
⎝ 15
Wyniki:
8
7.1
6.65
6.398
6.242
6.139
6.068
6.017
⎞
26.5 27.4 27.985 28.386 28.668 28.871 29.018 29.124
15.5 15.5 15.365 15.216
15.09
14.99
14.915 14.859
⎠
〈 〉
Operator z indeksem górnym określa jedną kolumnę macierzy. Definiując każdą kolumnę v k jako funkcję
〈 〉
v k−1 właściwie definiujemy kolejne kolumny macierzy jako funkcję poprzednich. W efekcie uzyskujemy
macierz, w której kolejne kolumny stanowią kolejne przybliżenia naszych obliczeń.
Jednostki i wymiary w obliczeniach iteracyjnych
Jednostek używać możemy również w przypadku zmiennych iteracyjnych, wektorów i macierzy. Jeżeli
wynik w tablicy ma jakiś wymiar MathCad pokaże jednostkę wymiaru dla każdej wartości w tablicy. Jeżeli
uważamy to za niepożądane, to wynik taki należy podzielić przez jednostkę.
f( x) := cos ( x) 2
φ := 0deg , 60deg .. 360deg
sin ( φ ) =
f( φ ) =
0
0.866
0.866
0
-0.866
-0.866
1.531·10 -15
1
0.25
0.25
1
0.25
0.25
1
g := 9.81
t := 0sec , 2sec .. 10sec
f( t) :=
1
2
⋅ g⋅ t
2
f( t) =
0 m
19.62
78.48
176.58
313.92
490.5
m
sec
2
f( t)
=
m
0
19.62
78.48
176.58
313.92
490.5
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa
Strona 9 z 9
Lekcja 8
Problemy do samodzielnego rozwiązania
Wykonać obliczenia dla następujących formuł rekurencyjnych:
1. F(0) = 1, F(1) = 1, F(N) = F(N-1) + F(N-2);
2. F(0) = 1, F(N) = F(N-1) * N;
3. F(0) = 1, F(N) = 1 + 1/F(N-1);
4. F(0) = 1, F(N) = N + F(N-1).
Tablicować funkcje
⎛ 2⋅ x ⎞
⎝ x ⎠
1. ⎜
−3
⋅ ⎡⎣( x⋅ x)
−1
− 1⎤ 2
⎦
, dla x zmieniającego się od 0.01 do 5 z krokiem 0.1;
2. 2 5 2 ⋅ x − 3 2 ⋅ x + 5, dla x zmieniającego się od 0 do 10 z krokiem 1;
3.
5
3
⋅ x5⋅ 5 2 −
4. f( x) :=
5. f( α ) :=
6.
3
x−1
3
4
⋅ x3⋅ 3 2 + 5 ⋅ x, dla x zmieniającego się od -5 do 5 z krokiem 3/4
sin ( x) − cot( x)
, dla x zmieniającego się od -2π do 2π z krokiem π/12;
acos ( x)
1
cot( α )
⋅ x3 −
2
8
x−1
, dla x zmieniającego się od 0 do 2π z krokiem π/4;
⋅ x2 +
2
x−1
⋅x +
4
x−1
+ x2 − 2 ⋅ x − 2, dla x zmieniającego się od 2 do 3 z krokiem π/10
Metoda Eulera rozwiązywanie równań różniczkowych postaci
d
x
dt
f( x) ma postać
xi − xi−1
f( x), gdzie x.i oraz x.i-1 są kolejnymi przybliżeniami rozwiązania, a h krokiem całkowania,
h
zwykle h < 0.1. Znaleźć rozwiązanie następujących równań:
d
1. x e x, x.o = 1;
dt
d
2. x x2 − 1, x.0 = 0;
dt
d
3. x sin ( x), x.0 = 0.
dt
22.09.2008
Mariusz B, Bogacki
Technologia Informacyjna
Pracownia Projektowa