Professional Documents
Culture Documents
MATHCAD 2000
1. Wprowadzenie
Mathcad 2000 to profesjonalny program matematyczny służący do rozwiązywania różnego typu
zagadnień inżynierskich. Umożliwia prowadzenie zaawansowanych obliczeń numerycznych, jak
również przekształceń symbolicznych (m.in. symboliczne obliczenia pochodnych, całek i granic
funkcji), czyli operacji związanych z analizą matematyczną.
W porównaniu do konkurencyjnych produktów Mathcad zajmuje szczególną pozycję. Pomimo
faktu, że w obliczeniach numerycznych jest słabszy od Mathlaba a w obliczeniach symbolicznych
wyraźnie ustępuje Mathematice, to jednak wyróżnia się z pośród innych pakietów:
• łatwością obsługi,
• pracą zbliżoną do naturalnych rachunków prowadzonych na kartce papieru,
• symboliczną prezentacją tworzonych wzorów (zgodną z ogólnie panującymi zwyczajami),
• wygodnym tworzeniem wykresów,
• operowaniem i przeliczaniem jednostek miar,
• pełnym wykorzystaniem graficznego środowiska systemów Windows.
Obszar roboczy
Mathcad używa standardowego interfejsu Windows (zob. rysunek powyżej), dlatego w niniejszym
kursie pominiemy oczywiste elementy „klikologii i klawiszologii stosowanej”, a skupimy się na
charakterystycznych dla Mathcada operacjach edycyjnych. Naszym głównym celem jest zapoznanie
się z ogromnymi możliwościami pakietu i zrozumienie specyfiki obliczeń numerycznych (np.
źródeł powstawania błędów numerycznych).
MATHCAD 2000 2
Jak widać na przedstawionym rysunku, okno robocze Mathcada zawiera oprócz menu głównego
różne paski narzędzi, które podobnie jak w aplikacjach MS-Office można dowolnie rozmieszczać na
pulpicie. Korzystanie z tych narzędzi odbywa się w standardowy sposób, to jest poprzez kliknięcie
myszą lub zastosowanie odpowiedniego skrótu z klawiatury. Mathcad stosuje specyficzny sposób
edycji wyrażeń matematycznych, podobny do używanego w programie Word edytora równań – tu
również operujemy tzw. kursorem dwuwymiarowym, który oprócz punktu wstawiania pokazuje
zakres aktywnego argumentu (szczegóły podane zostaną w przykładach).
Regiony
Wszystkie dane (wzory, wyniki, wykresy) są przechowywane w prostokątnych polach zwanych
regionami. W odróżnieniu od komórek Excela mogą one zajmować dowolną pozycję na arkuszu
roboczym. Regiony przeznaczone są przede wszystkim do przechowywania wzorów matema-
tycznych ale mogą również zawierać zwykły tekst (komentarze itp.), grafikę (np. wykresy funkcji)
oraz obiekty osadzone – tworzone przez inne aplikacje Windows.
Należy wspomnieć, że sposób rozmieszczenia regionów ma wpływ na kolejność wykonywanych
operacji i widzialność definiowanych przez użytkownika zmiennych, powinien więc być
dopasowany do realizowanego algorytmu obliczeniowego. Mathcad przelicza kolejne regiony w
naturalny sposób, począwszy od lewego górnego rogu „idąc” w prawo i w dół. (Wyjątkiem od tej
zasady są tzw. zmienne globalne, o których dowiemy się z przykładów).
Podstawowe operatory
Wykaz stosowanych w Mathcadzie operatorów i odpowiadających im klawiszy funkcyjnych
przedstawiono w załączniku 1. Większość podanych tam skrótów klawiaturowych nie trzeba
pamiętać gdyż można je zastąpić kliknięciem odpowiedniej ikonki z pasków narzędziowych lub z
menu głównego. Operowanie myszką jest jednak wolniejsze i często mniej wygodne, dlatego warto
chociaż pobieżnie zapoznać się z przedstawioną tabelą i zapamiętać kilka kluczowych skrótów
klawiaturowych. Przegląd pozostałych klawiszy funkcyjnych można znaleźć w systemie pomocy
„Resource Center” (hasło: keyboard help).
MATHCAD 2000 3
W wielu przypadkach możemy stosować obydwie metody zamiennie lub równolegle, jednak
istnieją klasy zagadnień do rozwiązania których prowadzi tylko jedna z nich. Na przykład pochodne
lub całki nieoznaczone obliczamy w sposób symboliczny, podczas gdy rozwiązanie równania
przestępnego możemy (w ogólnym przypadku) przeprowadzić jedynie na drodze numerycznej.
Warto zauważyć, że obliczenia symboliczne pozwalają na lepszą ocenę jakościową wyników, ale są
kosztowne i nie zawsze możliwe do przeprowadzenia.
Jednostki miar
Jedną z wyróżniających cech Mathcada jest automatyczne przeliczanie różnych jednostek miar.
Mathcad rozpoznaje systemy miar m.in.: SI (m, s, kg,...), CGI (cm, sec, gm,...), US (ft, sec, lb,...).
Jednostkę miary dodajemy bezpośrednio po liczbie (lub wyrażeniu) z użyciem lub bez operatora
mnożenia (szczegóły podane będą w przykładach). Możemy definiować własne jednostki miar –
jako pochodne od miar pierwotnych. Wykaz predefiniowanych miar i odpowiadających im skrótów
znaleźć można w Resource Center (hasło: units and dimensions).
Liczby zespolone
Mathcad stosuje powszechną notację liczb zespolonych: a + b⋅i, lub a + b⋅j. Literę „i” lub „j”
należy podać podobnie jak jednostkę miary zaraz po liczbie (lub wyrażeniu), jednak nie można ich
stosować oddzielnie, tzn. litera i (lub j) musi być poprzedzona wyrażeniem, w szczególnym
przypadku liczbę urojoną i zapisujemy jako 1i. Mathcad automatycznie rozpoznaje zespolone
argumenty w operatorach i funkcjach oraz stosuje zespolone odpowiedniki tych funkcji.
Wektory i macierze
Wiele zagadnień matematycznych zapisać można w zwartej notacji macierzowej. Mathcad
umożliwia definiowanie wektorów i macierzy na wiele różnych sposobów. Typowe operacje
algebraiczne jak dodawanie czy mnożenie macierzy zapisujemy w naturalny sposób, korzystając ze
standardowych operatorów +, -, *, itd. Jednak istnieje wiele specyficznych operatorów mających
zastosowanie jedynie dla zmiennych wektorowych lub macierzowych. Najważniejsze z nich zostały
przedstawione w załączniku 1, w sekcji operacje macierzowe. Szczegółowe informacje dotyczące
problematyki notacji macierzowej w Mathcadzie zostaną pokazane w przykładach.
Uwaga: Domyślnie, początkowy indeks wektorów i macierzy w Mathcadzie zaczyna się od 0 a nie
od 1, można go zmienić poprzez przedefiniowanie wbudowanej zmiennej globalnej ORIGIN. Aby
początkowe indeksy wektorów i macierzy zaczynały się od 1 należy na początku dokumentu wpisać
następującą definicję: ORIGIN := 1 lub zmienić wartość tej zmiennej w menu Math/Options.
MATHCAD 2000 5
4
Wykresy funkcji 4
−π π
Wykresy w Mathcadzie tworzymy z menu 2 2
Insert/Graph lub z paska narzędziowego Graph. 2
Na jednym wykresie można przedstawić kilka
tan( x)
funkcji oraz dodawać punkty kontrolne lub
asymptoty (rys. obok). Kolejne funkcje dodajemy sin( x)
2 0 2
poprzez wpisanie przecinka w polu opisu funkcji, cos( x)
mogą być one zależne od jednej wspólnej zmiennej
lub każda z funkcji może mieć swój niezależny 2
−π x π
Pola tekstowe
Pola tekstowe służą do dokumentowania prowadzonych obliczeń (komentarze, objaśnienia, itp.).
Domyślnie każdy nowo tworzony region zawiera równanie, jednak po wpisaniu pierwszego wyrazu
i spacji automatycznie zmienia się w region tekstowy. Pewniejszym sposobem jest zastosowanie
cudzysłowu [”] na początku wpisywanego tekstu – jest to sygnał dla Mathcada, że chcemy
wpisywać tekst a nie wzór. Teksty możemy formatować jak w zwykłych edytorach tekstu lub
pośrednio poprzez zastosowanie styli (podobnie jak w Wordzie).
Pozycjonowanie regionów
Przejrzystość tworzonej w Mathcadzie dokumentacji uzyskamy poprzez właściwe rozmieszczenie
regionów, tak aby nie zachodziły na siebie i były odpowiednio wyrównane. Pomocne w tym celu są
funkcje z menu Format/Separate_Regions i Format/Align_Regions.
/ dzielenie
Ctrl+/ dzielenie w wierszu
Ctrl+Enter dodawanie z przeniesieniem do następnego wiersza
^ potęgowanie
(, ), ’apostrof nawiasy: (lewy, )prawy, ‘dwustronny-automatyczny
\ pierwiastek kwadratowy
Ctrl+\ pierwiastek dowolnego stopnia
| wartość bezwzględna lub wyznacznik macierzy
" liczba sprzężona zespolona
! silnia (n!)
< mniejszy
> większy
Operatory
logiczne
Ctrl+Shift+P liczba pi
Ctrl+Shift+Z znak nieskończoności
Insert przełączenie punktu wstawiania (początek-koniec)
Spacja poszerzenie aktywnego wyrażenia
Tab, Shift+Tab aktywacja kolejnego lub poprzedniego pola
Ctrl+D usunięcie aktywnego regionu
7
wzór klawiatura
1 + 2⋅ 3 = 7 1, +, 2, *, 3, =
( 1 + 2) ⋅ 3 = 9 1, +, 2, spacja, *, 3, =
1 1 1
+ + = 0.5 1, /, 6, spacja, +, 1, /, 4, spacja, +, 1, /, 12, =
6 4 12
1 1 1 1
+ + → 1, /, 6, spacja, +, 1, /, 4, spacja, +, 1, /, 12, Ctrl+.
6 4 12 2
sin
π → 1
sin(, Ctrl+Shift+P, /, 6, ),Ctrl+.
6 2
wzór klawiatura
a := 1 b := −5 c := 6 a, : dwukropek, 1 (itd))
a + b = −4 a, +, b, =
a + b ⋅ c = −29 a, +, b, *, c, =
2
f ( x) := a⋅ x + b ⋅ x + c f(x), : dwukropek, a, *, x, ^, 2, spacja, +, b, *, x, +, c
2
∆ := b − 4a⋅ c ∆=1 D, Ctrl+G, :, b^2, spacja, -4a*c
−b − ∆
x1 := x1 = 2 x1, :, -, b, -, \, D, Ctrl+G, spacja, spacja, /, 2a, x1, =
2a
−b + ∆
x2 := x2 = 3 jak wyżej
2a
2
f ( x) = 0 solve , x → f(x), Ctrl+=, 0, Ctrl+Shift+., solve, przecinek, x, Enter
3
−π π
2 2
2
tan ( x)
sin( x)
3 2 1 0 1 2 3
cos( x)
Jednostki miar
m
F := 20kN a := 10 dane
2
s
F
m := m = 2000 kg wynik
a
Uwaga: Definicja zmiennej o takiej samej nazwie jak jednostka miar zasłania jej znaczenie
Wzór Opis
π
a := 0 , .. 2 ⋅ π a, :, 0, przecinek, Ctrl+Shift+P, /, 10, ;średnik, Ctrl+Shift+P
10
a = sin( a) = a, = sin, (, a, ), =
0 0
0.314 0.309 Wyniki prezentowane po lewej są tablicami, a nie - jak dotychczas -
0.628 0.588
skalarem. Aby wyświetlić kolejne elementy tablicy należy ją
uaktywnić (poprzez kliknięcie) i przewinąć do szukanego elementu.
0.942 0.809 Można również zwiększyć liczbę wyświetlanych elementów tablicy
1.257 0.951 rozciągając jej dolną krawędź!!!
1.571 1
Poniżej przedstawiamy wykres stablicowanej funkcji
1.885 0.951
2.199 0.809
2.513 0.588
2.827 0.309
1
3.142 0
3.456 -0.309
3.77 -0.588
4.084 -0.809 0 2 4 6 8
4.398 -0.951
4.712 -1
1
i := 0 .. n
n := 10
0.0625 i =0 2
s :=
∑ ai a = 0.03125
co zaoszczędza zużycie pamięci i zwiększa szybkość
obliczeń. (przedstawiony po lewej sposób obliczeń jest
i 0.01563 nieefektywny - pokazano go jedynie dla celów
s = 1.999023 0.00781 dydaktycznych).
0.00391
0.00195
0.00098
Wektory i macierze
UWAGA: początkowy indeks wektorów i macierzy
to 0 a nie 1. To domyślne zachowanie Mathcada
możemy zmienić definiująć zmienną ORIGIN
ORIGIN := 1
1. wystarczy określić kilka wyrazów wektora lub macierzy (pozostałe elementy przyjmą domyślne wartości zerowe).
Wymiary wektora-macierzy określają maksymalne indeksy użyte do tej pory:
12
1.23
V= 0
3.5
A := 1 A, [, 0, przecinek, 0, :, 1
1, 1
A := 5 A := 3 analogicznie
2, 3 2, 2
1 0 0
A=
0 3 5
2. można zastosować zmienne zakresowe i definicję wektora (macierzy) za pomocą wzoru iteracyjnego (jak
przedstawiono przy omawianiu zmiennych zakresowych) lub podając bezpośrednio kolejne elementy wektora
oddzielone przecinkami.
i := 1 .. 3
2 z :=
w := 2 ⋅ i w = 4 lub i
i
6 1 1
3 z = 3
j := 1 .. 2
7
7
B :=
i, j
1
2 1 2
3 B = 3 4 dla macierzy dane czytane są wierszami!!!
4 5 6
5
6
3. Ctrl+M lub przycisk Insert Matrix na pasku narzędziowym Matrix.lub w menu Insert
A :=
1 2 0
A, :, Ctrl+M, podać wymiary i wpisać kolejne elementy
0 3 4
4. Poprzez generowanie
13
1 0 0 1 0 0
I := diag( z) I = 0 3 0 H := identity ( 3 ) H = 0 1 0
0 0 7 0 0 1
1 2
1 2 0
A= B = 3 4
0 3 4
5 6
T 1 3 5
C := B C= transpozycja macierzy (Ctrl+1)
2 4 6
2 5 5 0 1 5
A+ C= C−A= suma i różnica macierzy
2 7 10 2 1 2
7 10
A⋅ B = iloczyn macierzowy
29 36
1 8 8
D := B ⋅ A D = 3 18 16
5 28 24
43.866
eigenvals( D) = −0.866 wartości własne macierzy
0
〈 2〉 2
A = wyciągnięcie n-tej kolumny (Ctrl+6)
3
14
10
w × z = −8 iloczyn wektorowy (Ctrl+8)
2
Operacje na blokach
sin( x) x2 − 2
M ( x) :=
cos( x) x
1 1 2
⋅π − 2
0.841 −1
M →
π 2 36
M( 1) =
0.54 1 6 1⋅ 3 1
⋅π
2 6
15
Przekształcenia algebraiczne
UWAGA: Obliczenia symboliczne można wywoływać na dwa różne sposoby:
1. poprzez menu Symbolics
2. poprzez przyciski paska narzędziowego Symbolic.
Pierwszy sposób, choć może trochę łatwiejszy w użyciu, jest o wiele mniej elastyczny, dlatego w niniejszym
opracowaniu ograniczamy się do podania przykładów z zastosowaniem paska narzędziowego Symbolic (można też
korzystać z klawiatury ale wygodniejsze w tym przypadku jest używanie myszy).
Wzór Opis
3
f ( x) :=
∏ ( x − i) definicja funkcji
i=1
UWAGA:
X := 4 jeżeli zmienna X została zdefiniowana (tak jak tutaj)
W wielu przypadkach standardowy operator obliczeń symbolicznych -> jest niewystarczający i musimy
"podpowiedzieć" Mathcadowi w jakiej postaci chcemy otrzymać wzór. Poniżej przedstawiamy listę najczęściej
stosowanych modyfikatorów (zob. pasek Symbolic)
1 1 1
− factor →
x−2 x−1 ( x − 2) ⋅ ( x − 1 )
2
x −1
→
(x2 − 1) Jeżeli mogą wystąpić potencjalne osobliwości to Mathcad nie
x−1 (x − 1) upraszcza wyrażeń automatycznie
2
x −1 Musimy mu podpowiedzieć żeby starał się możliwie najlepiej
simplify → x + 1 uprościć wyrażenie
x−1
Materiał dodatkowy
Czasami należy pomóc jeszcze bardziej poprzez ograniczenie dziedziny
( 2)
2
2
x → x tu nie wie co z tym chcemy zrobić
2
x simplify , assume = real → signum( x) ⋅ x dla liczb rzeczywistych - już bez kłopotów
Podobnie, ale bardziej precyzyjnie działa klucz assume bo pozwala określać dziedzinę pojedynczej zmiennej. Przykład
podajemy na końcu tego punktu.
π float , 51 → 3.1415926535897932385
17
Materiał dodatkowy
f ( x) → ( x − 1 ) ⋅ ( x − 2 ) ⋅ ( x − 3 )
Pozostałe modyfikatory stosowane są w bardziej zaawansowanych obliczeniach. Część z nich poznamy w dalszej
części materiału.
Przydatnym skrótem klawiaturowym jest Ctrl+Shift+. (drugi przycisk), który pozwala na wprowadzanie dowolnych
modyfikatorów z klawiatury - trzeba jednak wiedzeć co wpisać.
UWAGA: w jednym regionie można zrealizować serię obliczeń symbolicznych po kolei lub poprzez grupowanie
modyfikatorów
2
x − π factor → ( x − π ) ⋅ ( x + π ) float , 3 → ( x − 3.14) ⋅ ( x + 3.14)
2
Materiał dodatkowy
2 assume , x = RealRange( −∞ , 0 )
x → −x uprość wyrażenie przy założeniu że x ≤ 0
simplify
sin( x)
lim →1 Ctrl+L, sin(x)/x, tab, x, tab, 0, Ctrl+.
x→0 x
d 3 ( 2
)
x + sin( x) → 3 ⋅ x + cos( x) Shift+/, 'apostrof, x^3, spacja, +, sin(x), tab, x, Ctrl+.
dx
18
∞ 1
⌠
2
−x 1 2
e dx → ⋅π Shift+7, e^-x^2, tab, x, tab, 0, tab, Ctrl+Shift+Z, Ctrl+.
⌡ 2
0
1 3 1 5 1 7 1 9
sin( x) series , x , 10 → x − ⋅x + ⋅x − ⋅x + ⋅x
6 120 5040 362880
Ponieważ temat jest dobrze znany a cała zabawa polega na wywoływaniu odpowiednich symboli z paska
narzędziowego "Calculus" lub używaniu odpowiednich skrótów klawiaturowych przechodzimy do ćwiczeń.
d −b
a b −1 ( a ⋅ d − b ⋅ c ) ( a ⋅ d − b ⋅ c)
A := A →
c d −c a
( a ⋅ d − b ⋅ c) ( a ⋅ d − b ⋅ c)
A → a⋅ d − b ⋅ c
d −b
−1 DET DET
A substitute , a⋅ d − b ⋅ c = DET →
−c a
DET DET
inny przykład
C( x) :=
cos( x) −sin( x)
macierz funkcyjna
sin( x) cos( x)
2 2
C ( x) → cos( x) + sin( x) tu też często trzeba dopomóc w upraszczaniu wyrażeń
C ( x) simplify → 1 teraz OK
19
Jeżeli potrafimy obliczyć symbolicznie macierz odwrotną, to tym samym potrafimy symbolicznie rozwiązywać liniowe
układy równań.
UWAGA: w równaniach nie używamy zwykłago znaku = tylko Ctrl+=. Można nie podawać prawej strony jeśli jest
=0 ale zmniejsza to czytelność zapisu, dlatego nie polecamy tego uproszczenia
1
( )
2
1 ⋅ −b + b 2 − 4 ⋅ a⋅ c
2 2⋅ a
a⋅ x + b ⋅ x + c = 0 solve , x →
1
1 2
(2
)
2⋅ a ⋅ −b − b − 4⋅ a⋅ c
Często wynik jest na tyle skomplikowany, że mathcad nie potrafi podać rozwiązania w zwięzłej postaci, jeśli wynik
zależy od kilku parametrów. Na przykład, jeżeli podobną do opisanej wyżej metody zastosujemy do ogólnego
równania 3-go stopnia to natrafimy na problem!!! Dużo łatwiej otrzymać rozwiązanie, gdy operujemy na konkretnych
liczbach, ale wynik też może być bardzo "rozlazły".
3 2
a⋅ x + b ⋅ x + c⋅ x + d = 0 solve , x →
20
1
− 1 3 5 2
⋅ ( 35 + 15⋅ 6 ) + −
3 1 3
3
3 ⋅ ( 35 + 15⋅ 6 )
1 1
1 3 5 2 1
−1 3
x + 2x + 3x + 4 = 0 solve , x → 6 ⋅ ( 35 + 15⋅ 6 ) − − + ⋅ i ⋅ 3 ⋅ ⋅ ( 35 + 15⋅ 6 ) −
3 2
1 3 2 3
3
6 ⋅ ( 35 + 15⋅ 6 ) 3 ⋅ ( 35 +
1 1
1 3 5 2 1
−1 3
⋅ ( 35 + 15⋅ 6 ) − − − ⋅ i ⋅ 3 ⋅ ⋅ ( 35 + 15⋅ 6 ) −
6 1 3 2 3
3
6 ⋅ ( 35 + 15⋅ 6 ) 3 ⋅ ( 35 +
Jeżeli wystarczają nam konkretne wartości liczbowe, to warto dodatkowo zastosować modyfikator float,N
solve , x
−1.65062
→ −.174686 − 1.54687 ⋅ i
3 2
x + 2x + 3x + 4 = 0
float , 6
−.174686 + 1.54687 ⋅ i
Gdy mamy równanie przestępne to nie jest mozliwe otrzymanie zwięzłego rozwiązania w postaci wzoru. W takich
sytuacjach Mathcad podaje rozwiązanie numeryczne z 20 cyframi znaczącymi. Jeżeli nie potrzebujemy aż takiej
dokładności to znów przydatny jest modyfikator float,N
x 5 0 5
solve , x
cos( x) = x → .739085
float , 6 5
Niestety dla równań przestępnych (nawet najprostszych) Mathcad podaje pierwsze znalezione rozwiązanie.
21
cos( x)
cos( x) = 0.3x solve , x → 1.2019131636661846248
0.3x 5 0 5
x
1 π
cos( x) = 0 solve , x → ⋅π a nie + k⋅ π
2 2
WNIOSEK: Nie wszystko rozwiąże za nas Mathcad automatycznie. W wielu przypadkach musimy mu umiejętnie
pomagać, co wymaga od nas dostatecznego rozumienia zagadnienia i znajomości matematyki w tym zakresie. Musimy
też poznać nieco bardziej zaawansowane techniki w Mathcadzie. Do problemu wrócimy w kolejnych ćwiczeniach.
Aby liczyć na sukces to niestety trzeba matmę choć trochę znać.
x
22
Wprowadzenie
Jak zauważyliśmy w poprzednich ćwiczeniach Mathcad dysponuje dość silnym "solverem" symbo- licznym. Tym
niemniej przy rozwiązywaniu złożonych problemów, szczególnie przy rozwiązywaniu równań przestępnych, musimy
zastosować bardziej zaawansowane techniki obliczeniowe i umiejętnie podpowiadać Mathcadowi poprzez wybranie
odpowiedniej do danej klasy zagadnień metody. Wymaga to oczywiście pewnego doświadczenia w posługiwaniu się
Mathcadem jak również elementarnej wiedzy z metod numerycznych. Rozwiązania równań (lub układów równań)
przestępnych w ogólnym przypadku nie da się przedstawić w postaci zwartego wzoru matematycznego i musimy
zadowolić się wynikiem numerycznym.
W zależności od klasy problemu stosujemy różne metody rozwiązywania równań. Często też stosujemy różne metody
zamiennie lub równolegle co pozwala na weryfikację uzyskanego rozwiązania. Poniżej przedstawiono możliwe
strategie obliczeń:
1. Realizacja własnego algorytmu - warto wspomnieć o tym, gdyż jeśli wiemy co i jak policzyć to nie musimy polegać
na zawiłych algorytmach wbudowanych w Mathcada, ponadto w wyjątkowych sytuacjach może to być jedyna
lub najskuteczniejsza metoda obliczeń.
2. Metoda graficzna - stosowana głównie jako weryfikator wyników i podpowiadacz tzw. punktów startowych w
metodach numerycznych. Stanowi ogromną pomoc i jest zawsze zalecana.
3. Solver symboliczny (solve, x ->) - bardzo wygodny i prosty w użyciu, pozwalający na uzyskanie rozwiązania w
postaci parametrycznej (wzór a nie liczba), jednak nie zawsze prowadzi do poszu- kiwanego rozwiązania. Tym
niemniej jest to podstawowe narzędzie, od którego zawsze możemy rozpocząć nasze poszukiwania i dopiero w
razie niepowodzeń zastosować inne metody.
4. Blok "Given" - to najbardziej wszechstronny sposób rozwiązywania równań, a przede wszystkim układów równań
nieliniowych z kilkoma niewiadomymi. Blok given stosuje się również w rozwią- zywaniu równań różniczkowych
(zwyczajnych lub cząstkowych) oraz zagadnień optymalizacji.
5. Zastosowanie specjalizowanych procedur numerycznych - najbardziej efektywny sposób rozwiązania, pod
warunkiem zastosowania właściwej procedury do danej klasy problemu.
Solver symboliczny (solve, x ->) z p.3 poznaliśmy już na poprzednich ćwiczeniach. Nadaje się przede wszystkim do
rozwiązywania równań z jedną niewiadomą, ale można go również wykorzystać w bardziej złożonych zagadnieniach i
przy pewnych "sztuczkach" usprawnić proces przetwarzania danych. Dzisiejsze zajęcia poświęcone jednak będą
przede wszystkim metodom z punktów 4 i 5.
Warto zauważyć, że z problematyką rozwiązywania równań zetknęliśmy się już w poprzednich ćwiczeniach a pewne
tematy zostaną tu powtórzone dla usystematyzowania wiedzy. Już od pierwszych zajęć zaczynaliśmy rozwiązywać
proste równania algebraiczne lub układy równań liniowych i stosowaliśmy a) własne algorytmy, b) solver
symboliczny lub c) specjalizowaną procedurę lsolve(A,B). Teraz nadszedł właściwy moment aby to wszystko
uporządkować. Podzielimy tematykę na kategorie w zależności od rodzaju zagadnienia.
23
Tu wystarczająco skutecznym narzędziem jest solver symboliczny (solve, x->) ale dla wielomianów mamy alternatywę
w postaci specjalnej funkcji polyroots(v), szczególnie zalecana dla wielomianów wyższego stopnia. Ponadto łatwiej
przechować rozwiązanie do dalszych przeliczeń.
n := 5
n
świadomie wybieramy prosty wielomian, dla którego znamy pierwiastki
W( x) :=
∏ ( x − i) aby łatwiej prześledzić dalsze obliczenia
i =1
W( x) → ( x − 1 ) ⋅ ( x − 2 ) ⋅ ( x − 3 ) ⋅ ( x − 4 ) ⋅ ( x − 5 )
5 4 3 2
W( x) expand → x − 15⋅ x + 85⋅ x − 225 ⋅ x + 274 ⋅ x − 120
Możemy zastosować następującą sztuczkę: przed wpisaniem równania definiujemy zmienną, w której przechowamy
rozwiązanie (tu będzie to wektor p). Potem już łatwo możemy wyciągać poszczególne pierwiastki do dalszych
obliczeń.
1 1
2 2
p := ( W( x) = 0 ) solve , x → 3 p = 3
4 4
5 5
p =2
1
Wp ( 1) = 0 tu ORIGIN=0 dlatego p1 to drugi element wektora
Aby zastosować funkcję polyroots(v) musimy mieć wektor współczynników wielomianu - możemy go oczywiście
policzyć odpowiednim algorytmem, ale na razie aby nie zaciemniać istoty tematu wpiszemy go ręcznie.
24
n
wielomianu nie trzeba nawet wcale definiować
∑
i
Y( x) := v ⋅x tu robimy to tylko dla sprawdzenia
i
i=0
5 4 3 2
Y( x) → x − 15⋅ x + 85⋅ x − 225 ⋅ x + 274 ⋅ x − 120
p := polyroots( v)
Powstaje naturalne pytanie - po co używać polyroots() jeśli (solve, x) robi to dokładniej? Owszem, ale dla
wielomianów stopnia > 10 rozwiązanie symboliczne może zająć od kilku sekund do nawet kilku minut na wolnym
komputerze, podczas gdy obliczenia numeryczne z użyciem polyroots trwają zaledwie ułamek sekundy. Oczywiście
fakt ten nabiera na znaczeniu dopiero w większych projektach, szczególnie jeżeli duże wielomiany musimy
wielokrotnie rozwiązywać.
Równania przestępne
f ( x) 10 0 10
f ( x)
4 2 0 2
1
x
x
Korzystając z techniki zoomowania można stwierdzić, że dwa pozostałe pierwiastki wynoszą około:
x2 = -3.3 i x3 = -2.4. Dokładniejsze przybliżenia możemy znaleźć przy pomocy funkcji:
• root( f(x), x) tu musimy wcześniej określić punkt startowy
• root( f(x), x, a, b) tu zamiast punktu startowego podajemy przedział (a,b)
• lub za pomocą bloku given i funkcji find(x)
Drugi sposób jest bezpieczniejszy gdyż zmniejsza ryzyko rozbieżności procesu iteracyjnego. Nie ma tu jednak
miejsca na dokładniejsze omówienie tego problemu bo nie jest to kurs matematyki czy metod numerycznych.
Naszym celem jest zapoznanie się z możliwościami jakie oferuje Mathcad. Pokażemy więc poniżej jak otrzymać
wszystkie trzy pierwiastki od razu oraz jak kontrolować dokładność.
i (
p := root f ( x) , x , a , b
i )
i
Zmienne TOL i CTOL używane są przede wszystkim przy rozwiązywaniu równań w bloku Given.
• TOL określa dopuszczalny błąd względny rozwiązania
• CTOL określa dopuszczalny błąd względny niespełnienia warunków ograniczających
Domyślnie wartości te ustawione są na 10-3 ale możemy je definiować wg własnych potrzeb. Warto jednak pamiętać,
że zmniejszając dopuszczalny błąd zmuszamy Mathcada do cięższej pracy
( 2) = 0
f p
− 10 − 10
TOL := 10 CTOL := 10 podajemy nowe wartości (10-10 to naprawdę bardzo
mały błąd) - przeważnie rozwiązanie będzie i tak
dokładniejsze o kilka rzędów
Given
f ( x0) = 0
r := Find( x0)
---------------------
r = 1.202 f ( r) = 0 teraz jest OK
W bloku Given też możemy obliczyć wszystkie pierwiastki za jednym razem jeżeli za punkt startowy podamy wektor a
nie pojedynczą wartość
−5
z := −2
Given
1 −3.294
f ( z) = 0 Find( z) = −2.356
1.202
27
Temat ten szczegółowo omówiliśmy w ćw. 2 (zajrzyj do pliku mcad_2.mcd). Przypomnijmy jedynie, że obliczenia
możemy przeprowadzić z zastosowaniem funkcji lsolve(A,B) lub poprzez macierz odwrotną.
Zadanie to można łatwo rozwiązać wykonując proste obliczenia geometrii analitycznej. Na wstępie należy wyznaczyć
dwie proste prostopadłe do boków np. 12 i 23 i przechodzące przez ich środki. Następnie z układu 2 równań liniowych
(równań tych prostych) znaleźć można środek okręgu (x0,y0) a na koniec wyznaczyć promień jako odległość (x0,y0)
do np. (x1,y1). Opisany tu algorytm wymaga jednak trochę "ręcznej" pracy aby wpisać odpowiednie wzory i
równania.
Czy nie możemy wykonać obliczeń prościej? Spróbujmy zapisać w bezpośredniej postaci odpowiedni układ równań i
zlecić jego rozwiązanie Mathcadowi.
Poniżej podajemy różne sposoby zapisu i rozwiązania problemu.
28
=======================================================================
x1 := 2 y1 := −4
x3 := 5 y3 := 5
2
Find( x0 , y0 , r) = 1 otrzymaliśmy okrąg o promieniu 5 i środku (2,1)
5
=======================================================================
Rozpatrywany układ równań jest na tyle prosty, że można go nawet rozwiązać symbolicznie
( x1 − xs ) 2 + ( y1 − ys) 2 = rs2
xs
2 solve , ys →
2 1 5
2 2
( x2 − xs ) + ( y2 − ys) = rs
2 1 −5
( x3 − xs ) 2 + ( y3 − ys) 2 = rs2
rs
( x1 − xs ) 2 + ( y1 − ys) 2 = rs2
( x2 − xs ) 2 + ( y2 − ys) 2 = rs2 xs
solve , ys → ( 2 1 5 )
( x3 − xs ) 2 + ( y3 − ys) 2 = rs2 rs
rs > 0
=======================================================================
W bloku Given można również uzyskać rozwiązanie symboliczne (po find() wciskamy Ctrl+. anie =).
Given
29
2 2 2
( x1 − xx) + ( y1 − yy) = rr
2 2 2
( x2 − xx) + ( y2 − yy) = rr
2 2 2
( x3 − xx) + ( y3 − yy) = rr
Ale z niewiadomych przyczyn nie można tu podać ograniczeń
typu rr > 0 (Mathcad protestuje).
2 2
Find( xx , yy , rr ) → 1 1
5 −5
2 −4
xp := −3 yp := 1
5 5
2
5
5 cos( t) + 2 , xp , 2
2 0 2
Wprowadzenie do optymalizacji
Tematyka optymalizacji jest na tyle bogata, że nie sposób tu podać nawet fragmentarycznych wiadomości. Punkt
niniejszy proszę więc traktować czysto technicznie - czyli jak znaleźć optimum pewnej funkcji (tzw. funkcji celu) w
Mathcadzie. Otóż rozwiązanie problemu zapisujemy praktycznie zawsze w podobny do opisanego niżej algorytmu. Z
formalnego punktu widzenia nie jest istotne czy rozwiązujemy zadanie z jedną lub wieloma zmiennymi decyzyjnymi, z
ograniczeniami lub bez, oraz czy zadanie jest liniowe lub nieliniowe. Zapis w Mathcadzie będzie zawsze podobny a
30
solver sam będzie próbował sklasyfikować problem i zastosować odpowiednią procedurę numeryczną. Podobnie jak
wcześniej, przejdziemy do konkretnego przykładu.
x 2
Przykład: Obliczyć odległość dwóch krzywych y = e i y = x.
2
t, t
( ) + ( ea − b )
2 2
2
f ( a , b ) := a − b definiujemy funkcję celu
−0.074
r= a := r
0
b := r
1
0.538
( ) ( a b)
T T
2
rx =
−0.0735622
rx := a b ry := e
0.2896245
1.5
t
e UWAGA: Aby prawidłowo pokazać odległość
0.5
musimy zadbać aby skale osi x i y były takie
t same. W innym razie wykres będzie
ry
zniekształcony i trudno będzie ocenić czy
1 0.5 0 0.5 1 1.5 rozwiązanie jest OK.
0.5
2
t , t , rx
32
Wykresy 3D
Poniżej przedstawiamy wykresy funkcji f(x,y) omawianej przy zagadnieniu optymalizacji w pliku mcad4.mcd.
Formatowanie wykresu dokonujemy po jego dwukrotnym kliknięciu i ustawieniu żadanych opcji.
( ) + (ex − y)
2 2
2
f ( x , y) := x − y
f f
Wykresy warstwicowe choć mniej efektowne od powierzchniowych są pomocne przy graficznym szukaniu ekstremów
funkcji. Nie mamy tutaj tak wygodnych narzędzi jak przy zwykłych wykresach 2D, takich jak zoom - powiększanie lub
trace - śledzenie punktów wykresu. Jednak przy niewielkiej dodatkowej pracy możemy łatwo przeskalować dziedzinę
(x,y) do interesującego nas obszaru co pozwoli na lepsze dobranie punktu startowego do bloku Given.
f f
33
Obliczenia warunkowe
Funkcja if()
Funkcja if() umożliwia warunkowe obliczanie wyrażenia w zależności od spełnienia określonego kryte- rium (testu)
logicznego. Przydatna jest przede wszystkim do definiowania tzw. funkcji warunkowych (zwanych też sklejanymi).
Funkcje te charakteryzują się tym, że nie dają się zapisać w postaci jednego wzoru obowiązującego w całej dziedzinie i
z reguły są nieciągłe lub mają nieciągłe pochodne w punktach zszycia. Definicja takiej funkcji składa się z dwóch lub
więcej wzorów obowiązujących w rozłącznych podzbiorach dziedziny. Składnia funkcji if() jest następująca:
if( test_logiczny, wartość_gdy_prawda, wartość_gdy_fałsz)
Przykłady jej zastosowań prezentujemy poniżej.
Przykład 1 | Przykład 2
|
Dana jest następująca funkcja: | Dla 3 przedziałów:
|
| −1 dla x ≤ −π / 2
x dla x ≤ 0 |
f ( x) = |
g ( x) = sin x dla − π / 2 x < x < π / 2
sin x dla x > 0 +1
| dla x ≥ π / 2
|
|
Odpowiednia definicja w Mathadzie | należy zastosować zagnieżdżoną funkcję if()
ma postać: | π
| p := to tylko dla wygody
2
f ( x) := if ( x ≤ 0 , x , sin( x) ) |
|
g( x) := if ( x ≤ −p , −1 , if ( x ≥ p , 1 , sin( x) ) )
|
|
|
|
5 0 5 10 |
f ( x) |
| g( x)
2 0 2
x
x
0 1
1 0
10 0 10 0 2 4 6
UWAGA: funkcje warunkowe definiowane przy pomocy if() można bez ograniczeń stosować w obliczeniach
numerycznych i rysować ich wykresy nawet gdy są nieciągłe. Nie można ich jednak używać w obliczeniach
symbolicznych:
d
f ( x) → f ( x) → błąd
dx
Ograniczenie to można pokonać stosując odpowiednie funkcje z grupy "piecewise continuous", w szczególności
przydatna jest funkcja Heaviside'a. Na przykład omawianą powyżej funkcję f(x) można zapisać następująco:
f ( x) := Φ ( x) ⋅ sin ( x) + Φ ( −x) ⋅ x
co pozwoli na poprawne operowanie w obliczeniach symbolicznych:
f ( x) → Φ ( x) ⋅ sin ( x) + Φ ( −x) ⋅ x
d
f ( x) simplify → 1 + Φ ( x) ⋅ cos ( x) − Φ ( x)
dx
Temat ten wykracza jednak poza ramy niniejszego opracowania, gdyż wymaga elementarnej wiedzy z dziedziny
dystrybucji
Materiał dodatkowy
Funkcja until()
Funkcja until() służy do iteracyjnego (cyklicznego) wykonywania obliczeń aż do spełnienia określonego warunku
logicznego. Typowe jej zastosowanie to obliczanie kolejnych wyrazów ciągu lub sumy szeregu dla z góry zadanej
dokładności (zob. przykłady poniżej). Pierwszy parametr funkcji until określa tzw. kryterium stopu. Obliczenia trwają
tak długo aż parametr ten przyjmie ujemną wartość. Nie podajemy więc warunku logicznego w bezpośredniej postaci
a jego odpowiednik liczbowy, tzn. zamiast wyrażenia typu x < a podajemy x-a (<0 już nie piszemy). Drugi parametr
określa zwracaną wartość. Aby cały cykl obliczeń miał sens należy dynamicznie zmieniać wartości obydwu
parametrów z wykorzystaniem zmiennych zakresowych (iterowanych). Wyjaśnimy to na konkretnym przykładzie
poniżej.
UWAGA 1: niewłaściwe użycie funkcji until może doprowadzić do bardzo długiego cyklu obliczeń. Co prawda - ze
względu na ograniczenia jakie są nałożone na zmiennne zakresowe - nie grozi nam pętla nieskończona (tzw.
"zapętlenie"), ale i tak należy definiować testowy warunek logiczny ze szczególną uwagą, tak aby zapewnić jego
spełnienie w skończonej liczbie iteracji.
UWAGA 2: funkcja until jest przeżytkiem i od Mathcada w wersji 2000 obsługiwana jest tylko dla zgodności z
wcześniejszymi wersjami programu. Obecnie zalecaną metodą obliczeń iteracyjnych jest zdefiniowanie własnej
funkcji-programu, wykorzystującej instrukcję while. Temat ten zostanie przedstawiony w dalszej części materiału.
35
Wprowadzenie
Mathcad oferuje pewne narzędzia do programowania własnych funkcji. Należy podkreślić, że ich możliwości są
bardzo skromne w porównaniu do klasycznych języków programowania, z których zapożyczono na przykład
podstawowe instrukcje sterujące (takie jak if, for i while), jednak ich składnia jest inna i mało intuicyjna (szczególnie
dla osób mających już jakieś doświadczenie z programowaniem i przyzwyczajonych do innych niż Mathcad
standardów). Kod programu może być realizowany jedynie wewnątrz definicji funkcji, co ogranicza zakres jego
zastosowań. Największą wadą jest jednak brak jawnych deklaracji zmiennych i kontroli poprawności typów co
utrudnia znalezienie błędów w większych programach.
Pomimo wspomnianych wad warto jednak zapoznać się z elementami programowania oferowanymi w
Mathcadzie, ponieważ są sytuacje, w których programowanie (nawet prymitywne) jest wręcz niezbędne lub bardzo
upraszcza skomplikowane obliczenia. Materiał prezentowany poniżej jest krótkim przeglądem możliwości Mathcada w
tym zakresie a nie kursem programowania. Dlatego ograniczono się do podania podstawowych instrukcji sterujących
i kilku prostych przykładów bez wnikania w tajniki algorytmiki i sztuki programowania. Dalsze informacje i ciekawe
przykłady można znaleźć w "Resource Center".
Uwaga: Osobom nie mającym żadnego doświadczenia z programowaniem proponuję - a nawet zalecam -
przestudiowanie poniższego materiału dopiero pod koniec sem. 2.
Wskazówka: Aby zacząć programowanie funkcji, należy po wpisaniu początkowej definicji funkcji f(x) := kliknąć
przycisk "Add Line" z paska narzędziowego "Programming". W kolejnych liniach (Add Line) wpisujemy kod
programu, ale słów kluczowych nie można wpisywać bezpośrednio z klawiatury - należy je wywoływać poprzez
odpowiednie przyciski paska "Programming" (lub ew. skróty klawiaturowe).
Składnia: Akcja
Przykład 1 Przykład 2
funkcję f(x) omawianą na początku tego podobna lecz trochę bardziej rozbudowana będzie
dokumentu można zapisać następująco definicja funkcji g(x) - tu dla wygody definiujemy
roboczą-lokalną zmienną p; jest ona widoczna jedynie
wewnątrz bloku reprezento- wanego przez pionową
f ( x) := x if x ≤ 0 kreskę
sin( x) otherwise
2 π
g( x) := p←
2
−1 if x ≤ −p
0 5 10
1 if x ≥ p
2 sin( x) otherwise
"....."
instr_K
ciąg instrukcji w bloku
Pętla for ma zastosowanie gdy z góry wiemy ile razy dana pętla będzie powtórzona. Szczególnie przydatna jest
przy operacjach na wektorach i macierzach
2 2 2 2
Przykład 3 Przykład 4 suma: 1 + 2 + 3 + .. + N
6
silnia( 10) = 3.629 × 10 11
∑
2
sum( 11) = 506 i = 506
6
10! = 3.629 × 10 i =1
37
T
v = ( 0.013 1.933 5.85 3.503 8.228 1.741 7.105 3.04 0.914 1.473 )
4
imax( v) = max( v) = 8.228 OK
8.228
while war_log tak długo jak spełniony jest warunek logiczny war_log
instrukcja wykonaj podaną instrukcję
lub
lub
while x < Xmax
instr_1 (tu konkretny przykład na war_log).
"....."
instr_K wykonaj ciąg instrukcji w bloku
Pętlę while stosujemy wtedy gdy nie wiemy z góry ile iteracji trzeba wykonać do osiągnięcia danego celu. Jest
ogólniejsza i bardziej wszechstronna od pętli for (na przykład tą ostatnią można bez trudu zapisać w formie while),
ale też wymaga większej uwagi, gdyż łatwo przez prostą pomyłkę doprowadzić do tzw. pętli nieskończonej.
Należy więc bardzo starannie programować warunek logiczny (i wewnętrzne instrukcje pętli), tak aby
zagwarantować osiągnięcie wartości fałsz w skończonej liczbie kroków.
38
1
p +
a
Przykład 6 Obliczenie pierwiastka kwadratowego a metodą iteracyjną p =
i+ 1 2 i p
i
sqrt( a , ε ) := p←1 pierwsze przybliżenie
2
while p − a > ε tak długo jak błąd > ε
⋅ p +
1 a
p←
2 p licz kolejne przybliżenia
(
sqrt 4 , 10
−5
) = 2.00000009292229 (
sqrt 4 , 10
−7
)=2
Gdybyśmy chcieli dowiedzeć się ile iteracji zostało przeprowadzonych wystarczy nieco zmodyfikować naszą
funkcję
sqrt( a , ε ) := x←1 |
| sqrt ( 9 , 0.1) = ( 3.00009155413138 4 )
i←0
|
2 |
while x − a > ε
| sqrt( 9 , 0.0001) = ( 3.00000000139698 5 )
⋅ x +
1 a |
x← |
2 x
i←i+1
|
|
(
sqrt 9 , 10
− 12
) = (3 6)
(x i ) |
Podobnie - drobna korekta - gdybyśmy chcieli prześledzić historię zbieżności naszego algorytmu:
sqrt( a , ε ) := x←1 |
|
i←0
| 1
v ←x |
i 145
|
while x − a > ε
2 | 73.4965517241379
| 38.7143544958308
⋅ x +
1 a |
x←
2 x |
|
(
sqrt 17 , 10
2 − 12
) = 23.0896429413719
17.8030386448063
i←i+1 | 17.0181112639791
|
v ←x
i
|
|
17.0000096373175
v
17.0000000000027
17
39
Jak zauważyliśmy używanie funkcji until() jest niewygodne i mało efektywne gdyż wymaga tworzenia wektorów
(czasami o dużych rozmiarach) tylko po to aby wyciągnąć jego ostatni element. W takich przypadkach idealnym
wręcz rozwiązaniem jest zastosowanie własnej funkcji zaprogramowanej z użyciem pętli while.
Napiszemy własną funkcję sinus(x,ε), która liczy wartość sin(x) z ustaloną dokładnością
1 3 1 5 1 7 1 9
sin( x) series , x , 10 → x − ⋅x + ⋅x − ⋅x + ⋅x
6 120 5040 362880
3 5
x x
Ten szereg potęgowy możemy przedstawić w postaci: x − + − ..
3! 5!
Sumę określonej liczby wyrazów takiego szeregu można zapisać bez programowania:
N 2⋅ i+ 1
x
∑
i
sinN ( x , N) := ( −1 ) ⋅ sinN ( 1 , 4 ) = 0.841471009700176
( 2 ⋅ i + 1 )!
i =0
sin( 1 ) = 0.841470984807897
2
−x
kolejne elementy szeregu można liczyć efektywnie z rekurencyjnej formuły: a = a
i
⋅
i− 2 i ⋅ ( i − 1 )
.
podobnie można postąpić dla oszacowania bieżącego błędu (reszty) szeregu
dla dużych x szereg może być na początku wolno zbieżny dlatego warto policzyć jego resztę z
dzielenia przez 2π (modulo), aby uniknąć niepotrzebnej pracy procesora - można tu zapewnić jeszcze lepszą
(szybszą) zbieżność ale... (pomyśl sam).
40