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