background image

 

 

 

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 

1 

background image

MATHCAD 2000                                                                                                                                                                

 

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). 
 
 

 
 

2.  Informacje podstawowe – przegląd  

Punkt  niniejszy  stanowi  przegląd  operatorów,  klawiszy  funkcyjnych  i  narzędzi  stosowanych  w 
Mathcadzie.  Pomyślany  został  jako  mała  ściąga  pomocna  przy  realizacji  przykładów  prezento-
wanych  na  ćwiczeniach.  Zanim  zadasz  pytanie  prowadzącemu  zajęcia  zajrzyj  tutaj  i  spróbuj 
samodzielnie  znaleźć  odpowiedź.  Pamiętaj,  że  podane  tu  informacje  są  wybiórcze,  gdyż  mają 
jedynie ułatwić początki pracy z Mathcadem. Szczegółowe i pełniejsze informacje należy szukać w 
systemie  pomocy  „Resource  Center”.  Zamiast  żmudnego  czytania  tego  punktu  zacznij  po  prostu 
pracę z Mathcadem i naucz się efektywnie posługiwać wbudowanym systemem pomocy. 

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).  

background image

MATHCAD 2000                                                                                                                                                                 

 

Wybrane funkcje wbudowane 
System Mathcad dysponuje ogromną liczbą wbudowanych funkcji matematycznych, takich jak: 

•  funkcje trygonometryczne, 

sin, cos, tan, cot 

•  wykładnicze 

exp, log, ln 

•  wektorowe,  

max, min, matrix, diag, rows, cols 

•  statystyczne,  

normal, gamma. 

Istnieją  ponadto  funkcje-procedury  dedykowane  do  rozwiązywania  konkretnych  zagadnień.  Ich 
używanie jest już trudniejsze i wymaga pewnej wiedzy z metod numerycznych, jednak im właśnie 
należy poświęcić więcej czasu aby móc w pełni korzystać z potencjału obliczeniowego Mathcada. 
Na początek podajemy tylko dwa przykłady: 

lsolve(A, v) – rozwiązywanie układu równań liniowych, 
find(x1, x2, ...) – poszukiwanie rozwiązania równań nieliniowych. 

Predefiniowane zmienne globalne 

π = 3.14159... 
e = 2.71828... 
ORIGIN = 0 – definiuje początkowy indeks pierwszego elementu wektorów i macierzy  
TOL = 10

-3

 – dopuszczalny błąd względny przy obliczaniu całek, rozwiązywaniu równań, itp. 

Definiowanie własnych zmiennych i funkcji 
Kluczową  rolę  w  obliczeniach  prowadzonych  w  Mathcadzie  odgrywa  możliwość  definiowania 
własnych zmiennych i funkcji. Raz zdefiniowaną zmienną lub funkcję można używać wielokrotnie 
upraszczając i zwiększając przejrzystość obliczeń. Zmienne (lub funkcje) mogą mieć zasięg lokalny 
lub  globalny.  Zmienne  lokalne  widziane  są  na  prawo  i  poniżej  definicji,  natomiast  zmienne 
globalne  widziane  są  w  całym  arkuszu  niezależnie  od  miejsca  ich  definicji.  Definicja  zmiennej 
lokalnej ma postać:  
 

nazwa_zmiennej_lokalnej 

:=  wartość   (lub ogólniej - wyrażenie), 

a zmiennej globalnej: 
 

nazwa_zmiennej_globalnej 

≡≡≡≡  wartość. 

Operatory  ”

:=” i ”≡” uzyskujemy poprzez wpisanie z klawiatury odpowiednio dwukropka ”:” lub 

tyldy ”~” – Mathcad automatycznie przekształca wpisane znaki do postaci wyświetlanej powyżej.  
Wartości zmiennych lokalnych można zmieniać w trakcie obliczeń – zmienna może przechowywać 
różne wartości w kolejnych etapach obliczeń – nowa definicja niszczy starą.  
Uwaga: Mathcad rozróżnia wielkie i małe litery a nawet rodzaj zastosowanej czcionki. Na przykład  
zmienne: abcABC oraz abc oznaczają trzy różne wielkości. 

Obliczenia symboliczne kontra numeryczne 
Mathcad dysponuje dwoma niezależnymi mechanizmami przetwarzania danych: 

•  obliczenia  numeryczne  –  stosowane  w  typowych  zagadnieniach  inżynierskich,  gdzie 

głównym celem jest znalezienie rozwiązania w postaci konkretnych wartości liczbowych, 

wyrażenie  =  wynik w postaci liczby  

 

(klaw.  =) 

•  obliczenia symboliczne – stosowane przede wszystkim w analizie matematycznej, w której (o 

ile to możliwe) staramy się uzyskać rozwiązanie w postaci zwięzłego wzoru matematycznego 

wyrażenie 

  wynik w postaci wzoru 

 

(klaw.  Ctrl+. lub Shift+Ctrl+.)  

background image

MATHCAD 2000                                                                                                                                                                 

 

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 + bj.  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. 

Zmienne zakresowe – obliczenia iteracyjne 
Szczególnym  typem  zmiennych  w  Mathcadzie  są  zmienne  zakresowe  „od..do”,  służące  przede 
wszystkim  do  obliczeń  cyklicznych  lub  iteracyjnych.  Typowym  ich  zastosowaniem  jest  tablico-
wanie  wartości  funkcji  lub  obliczanie  sum  szeregów.  Mają  również  zastosowanie  w  różnego 
rodzaju operacjach macierzowych. Zmienne zakresowe definiujemy w postaci: 

 

 

x  

:=  x1, x2 .. x3 

 

(zamiast dwóch kropek .. używamy średnika ;)  

gdzie  x  jest  nazwą  definiowanej  zmiennej,  x1  i  x3  oznaczają  początek  i  koniec  zakresu,  a  x2 
(opcjonalne)  określa  w  sposób  pośredni  przyrost  kolejnych  elementów  ciągu.  Na  przykład  do 
stablicowania  funkcji  f(x)  w  przedziale  od  1  do  5  co  0.2  wygodnie  jest  zdefiniować  następującą 
zmienną zakresową: 

 

 

x  

:=  1, 1.2 .. 5. 

Po wpisaniu formuły „f(x) =”  Mathcad poda wszystkie wyniki (dla kolejnych x) w postaci tablicy. 

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

background image

MATHCAD 2000                                                                                                                                                                 

 

Wykresy funkcji 
Wykresy  w  Mathcadzie  tworzymy  z  menu 
Insert/Graph  lub  z  paska  narzędziowego  Graph
Na  jednym  wykresie  można  przedstawić  kilka 
funkcji  oraz  dodawać  punkty  kontrolne  lub 
asymptoty  (rys.  obok).  Kolejne  funkcje  dodajemy 
poprzez  wpisanie  przecinka  w  polu  opisu  funkcji, 
mogą być one zależne od jednej wspólnej zmiennej 
lub  każda  z  funkcji  może  mieć  swój  niezależny 
argument.  Formatowanie  wykresu  odbywa  się  po 
jego  podwójnym  kliknięciu  i  wybraniu  odpo-
wiednich opcji z okienka dialogowego. 

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).  

Formatowanie danych i wyników 
Formatowanie  równań  i  wyników  uzyskujemy  z  menu  Format/Equation  i  Format/Result.  Za 
pomocą  tych  funkcji  możemy  ustawić  rodzaj  i  wielkość  czcionki  lub  ilość  cyfr  wyświetlanych  w 
wynikach. 

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. 

Tematy pominięte w niniejszym opracowaniu 
W  niniejszym  przeglądzie  nie  ma  miejsca  na  prezentację  innych  funkcji  Mathcada.  Pominięte 
zostały  takie  tematy  jak  osadzanie  obiektów  i  dynamiczna  wymiana  danych  czy  współpraca  z 
pakietami  pomocniczymi  AxumLE  i  SmartSketch.  Zainteresowanych  odsyłamy  jak  zwykle  do 
Resource Center
  
 

2

0

2

4

2

2

4

4

4

tan x

( )

sin x

( )

cos x

( )

π

π

π

2

π

2

x

background image

MATHCAD 2000 

6

8

 

 

Załącznik 1: 

Podstawowe operatory Mathcada 

 

Klawisz 

Operacja 

dwukropek

 

:= definicja zmiennej lub funkcji lokalnej 

tylda

 

definicja globalna 

numeryczne obliczenie wyrażenia 

Ctrl+. 

kropka

 

symboliczne obliczenie wyrażenia 

Defi

ni

cj

a i

 

oblicz

anie 

Ctrl+Shift+. 

symboliczne obliczanie z kluczem 

dodawanie 

odejmowanie lub negacja 

mnożenie 

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 

Operat

ory

 ary

tm

et

ycz

ne 

silnia (n!) 

mniejszy 

większy 

Ctrl+9 

mniejszy lub równy 

Ctrl+0 

większy lub równy 

Ctrl+= 

równy 

Operat

ory

 

log

icz

ne 

Ctrl+3 

nie równy 

pochodna pierwszego rzędu 

Ctrl+? 

pochodna dowolnego rzędu 

całka oznaczona 

Ctrl+I 

całka nieoznaczona 

Ctrl+L 

granica dwustronna 

Ctrl+A 

granica prawostronna 

Ctrl+B 

granica lewostronna 

suma po zmiennej iteracyjnej 

Ctrl+4 

suma elementów wektora 

Ctrl+Shift+4 

suma od..do 

iloczyn po zmiennej iteracyjnej 

Pochodne, całki, g

ranice 

Ctrl+Shift+3 

iloczyn od..do 

przecinek

 

oddzielanie argumentów funkcji lub elementów wektora 

średnik

 

definicja zakresu (zmiennej iteracyjnej) 

kropka

 

separator liczb dziesiętnych lub indeks dolny ozdobny (zwykły) 

indeks elementu wektora 

Ctrl+8 

iloczyn wektorowy 

Ctrl+1 

transpozycja wektora lub macierzy 

Ctrl+6 

kolumna macierzy 

^-1 

macierz odwrotna 

Operat

ory

 

m

aci

erz

owe 

Ctrl+- 

minus

 

operator wektoryzacji obliczeń 

Znak + Ctrl+G 

litery greckie (alfa, beta, ...) 

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 

L

ite

ry

 g

re

ck

ie

klaw. edy

cy

jne 

Ctrl+D 

usunięcie aktywnego regionu 

 

background image

7

a, : dwukropek, 1    (itd))

a

b

+

4

=

a, +, b, =

a

b c

+

29

=

a, +, b, *, c, =

f x

( )

a x

2

b x

+

c

+

:=

f(x), : dwukropek, a, *, x, ^, 2, spacja, +, b, *, x, +, c    

f 1

( )

2

=

f 0

( )

6

=

f(1)=

Rozwiązanie równania kwadratowego f(x) = 0

b

2

4a c

:=

1

=

D, Ctrl+G, :, b^2, spacja, -4a*c

x1

b

2a

:=

x1

2

=

x1, :, -, b, -, \, D, Ctrl+G, spacja, spacja, /, 2a,       x1, =

x2

b

+

2a

:=

x2

3

=

jak wyżej

Bardziej zaawansowany sposób rozwiązania

MATHCAD 2000/2001   -   Proste Obliczenia

 

Inteligentny kalkulator

(i trochę o edycji równań)

wzór 

klawiatura 

1

2 3

+

7

=

1, +, 2, *, 3, =

1

2

+

(

) 3

9

=

1, +, 2, spacja, *, 3, =

1
6

1
4

+

1

12

+

0.5

=

1, /, 6, spacja, +, 1, /, 4, spacja, +, 1, /, 12, =

1
6

1
4

+

1

12

+

1
2

1, /, 6, spacja, +, 1, /, 4, spacja, +, 1, /, 12, Ctrl+.    

sin

π
6





1
2

sin(, Ctrl+Shift+P, /, 6, ),Ctrl+.

 

Definiownie zmiennych i funkcji

wzór 

klawiatura 

a

1

:=

b

5

:=

c

6

:=

background image

8

Przykład: Na ciało o pewnej masie działa siła F = 20kN. Oblicz  

1, ft, =, cm    (w polu jednostki wyniku)    

1ft

30.48 cm

=

1, km, +, 20, m, +, 34, cm, =   

1km

20m

+

34cm

+

1020.34 m

=

klawiatura     lub z menu     Insert/Unit

stosowanie miar 

Jednostki miar

 

3

2

1

0

1

2

3

2

2

tan x

( )

sin x

( )

cos x

( )

π

2

π
2

x

1. z klawiatury Shift+@ lub myszką menu

Insert/Graph/X-Y Plot

2. w pole opisu funkcji wpisać f(x)
3. w pole argumentu wpisać x
4. w polach zakresu argumentu podać 1 i 4
5. sformatować wykres przez podwójne kliknięcie

i wybranie odpowiednich opcji np.:
X-Y Axes / Axes Style / Crossed

1

2

3

4

1

1

2

f x

( )

x

opis czynności

wykres 

Tworzenie wykresu funkcji

 

f(x), Ctrl+=, 0, Ctrl+Shift+., solve, przecinek, x, Enter        

f x

( )

0

solve x

,

2

3

background image

9

teraz km już nie oznacza 1 kilometr a liczbę 123 

x

246

=

x

2km

:=

definicja lokalnej zmiennej

km

123

:=

tu jest OK

x

2000 m

=

x

2km

:=

Uwaga: Definicja zmiennej o takiej samej nazwie jak jednostka miar zasłania jej znaczenie

wynik

m

2000 kg

=

m

F
a

:=

dane

a

10

m

s

2

:=

F

20kN

:=

definicja własnej jadnostki miar    

kN

1000N

:=

jego masę jeżeli wiadomo, że przyspieszenie wynosi a = 10m/s

2

.

background image

10

a

i

2

π

i

n

:=

definicja wektora poprzez zmienną iterowaną
a, [, i, :, 2, Ctrl+Shift+P, i, /, n

i

0 n

..

:=

Tu dla oszczędności miejsca rozrzedzono podział na n=10 odcinków.

n

10

:=

Inny sposób (wektorowy)

0

2

4

6

8

1

1

Wyniki prezentowane po lewej są tablicami, a nie - jak dotychczas - 
skalarem. Aby wyświetlić kolejne elementy tablicy należy ją 
uaktywnić (poprzez kliknięcie) i przewinąć do szukanego elementu. 
Można również zwiększyć liczbę wyświetlanych elementów tablicy 
rozciągając jej dolną krawędź!!!

Poniżej przedstawiamy wykres stablicowanej funkcji 

a, =

sin, (, a, ), =

sin a

( )

0

0.309
0.588
0.809
0.951

1

0.951
0.809
0.588
0.309

0

-0.309
-0.588
-0.809
-0.951

-1

=

a

0

0.314
0.628
0.942
1.257
1.571
1.885
2.199
2.513
2.827
3.142
3.456

3.77

4.084
4.398
4.712

=

a, :, 0, przecinek, Ctrl+Shift+P, /, 10, ;średnik, Ctrl+Shift+P

a

0

π

10

,

2

π

..

:=

Opis

Wzór

Zmienne zakresowe   1. Tablicowanie funkcji

 

MATHCAD 2000/2001   -   Obliczenia iteracyjne, macierze i wektory

background image

11

Teraz wyniki są nie tablicami a wektorami!!!

I tak przy okazji doszliśmy do naturalnej definicji wektora 
poprzez iterowaną definicje kolejnych jego elementów.

Dostęp do kolejnych elementów wektora uzyskujemy 
stosując operator indeksu "[".

a

0

0
1
2
3
4
5
6
7
8
9

10

0

0.628
1.257
1.885
2.513
3.142

3.77

4.398
5.027
5.655
6.283

=

sin a

( )

0

0
1
2
3
4
5
6
7
8
9

10

0

0.588
0.951
0.951
0.588

0

-0.588
-0.951
-0.951
-0.588

0

=

Zmienne zakresowe    2. Sumowanie szeregów

n

10

:=

i

0 n

..

:=

Uwaga: do obliczenia powyższej sumy nie warto definiować wektora 
a, tylko od razu wpisać wzór

0

n

i

1

2

i

=

1.999023

=

co zaoszczędza zużycie pamięci i zwiększa szybkość 
obliczeń. (przedstawiony po lewej sposób obliczeń jest  
nieefektywny - pokazano go jedynie dla celów 
dydaktycznych).

a

i

1

2

i

:=

s

i

a

i

:=

a

1

0.5

0.25

0.125

0.0625

0.03125

0.01563

0.00781

0.00391

0.00195

0.00098

=

s

1.999023

=

 

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

:=

Różne sposoby definiowania wektorów i macierzy

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:

background image

12

4.

 Poprzez generowanie

A, :, Ctrl+Mpodać wymiary i wpisać kolejne elementy

A

1

0

2

3

0

4

:=

3.

 Ctrl+M lub przycisk Insert Matrix na pasku narzędziowym Matrix.lub w menu Insert 

dla macierzy dane czytane są wierszami!!!

B

1

3

5

2

4

6

=

B

i j

,

1
2
3
4
5
6

:=

j

1 2

..

:=

z

1

3

7

=

z

i

1
3
7

:=

lub

w

2

4

6

=

w

i

2 i

:=

i

1 3

..

:=

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

A

1

0

0

3

0

5

=

analogicznie

A

2 2

,

3

:=

A

2 3

,

5

:=

A, [, 0, przecinek, 0, :, 1

A

1 1

,

1

:=

Dla macierzy drugi indeks oddzielamy przecinkiem

V

1.23

0

3.5

=

V, [, :, 1.23

V

3

3.5

:=

V

1

1.23

:=

background image

13

wyciągnięcie n-tej kolumny (Ctrl+6)

A

2

〈 〉

2

3

=

Ile kolumn i wierszy

rows A

( )

2

=

cols A

( )

3

=

Inne rzadziej używane funkcje

wartości własne macierzy

eigenvals D

( )

43.866

0.866

0

=

wyznacznik macierzy (tylko dla mac. kwadratowych)

D

0

=

D

1

3

5

8

18

28

8

16

24

=

D

B A

:=

iloczyn macierzowy

A B

7

29

10

36

=

suma i różnica macierzy

C

A

0

2

1

1

5

2

=

A

C

+

2

2

5

7

5

10

=

BŁĄD! 

niezgodne wymiary macierzy

A

B

+

=

A

B

+

transpozycja macierzy (Ctrl+1)

C

1

2

3

4

5

6

=

C

B

T

:=

B

1

3

5

2

4

6

=

A

1

0

2

3

0

4

=

Operacje algebraiczne na wektorach i macierzach

 

H

1

0

0

0

1

0

0

0

1

=

H

identity 3

( )

:=

I

1

0

0

0

3

0

0

0

7

=

I

diag z

( )

:=

background image

14

w

z

×

10

8

2

=

iloczyn wektorowy (Ctrl+8)

max B

( )

6

=

min B

( )

1

=

szukanie elementów o największej lub najmniejszej wartości

Operacje na blokach

Służą do tego specjalne funkcje blokowe:

submatrix() - wyciągnięcie bloku z macierzy

augment() - sklejenie dwóch macierzy w poziomie

stack() - sklejenie macierzy w pionie

Opis poszukaj samodzielnie w "Helpie" lub "Recource Center"

 

 

Wektory i macierze funkcyjne     przykład

M x

( )

sin x

( )

cos x

( )

x

2

2

x

:=

M 1

( )

0.841

0.54

1

1

=

M

π
6





1
2

1
2

3

1

36

π

2

2

1
6

π

background image

15

x

3

6 x

2

11 x

+

6

− factor

x

1

(

) x

2

(

)

x

3

(

)

factor - faktoryzacja - rozkład na czynniki

f x

( ) expand

x

3

6 x

2

11 x

6

+

expand - rozwinięcie na składniki

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)

Słowa kluczowe - modyfikatory obliczeń symbolicznych

teraz znów jest OK!!!!

f X

( )

X

1

(

) X

2

(

)

X

3

(

)

X

X

:=

Aby zapobiec takiej sytuacji należy zastosować 
rekurencyjną definicję zmiennej

to w wyrażeniach symbolicznych będzie niestety używana jej 
wartość a nie symbol X

f X

( )

6

jeżeli zmienna X została zdefiniowana (tak jak tutaj)

X

4

:=

UWAGA:

zwykłe obliczenie symboliczne  (f(x), Ctrl+.)

f x

( )

x

1

(

) x

2

(

)

x

3

(

)

definicja funkcji

f x

( )

1

3

i

x

i

(

)

=

:=

Opis

Wzór

UWAGA: Obliczenia symboliczne można wywoływać na dwa różne sposoby:

poprzez menu Symbolics

1.

poprzez przyciski paska narzędziowego Symbolic.

2.

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).

Przekształcenia algebraiczne

 

MATHCAD 2000/2001   -   Obliczenia symboliczne

background image

przykład - wyznaczenie 50 cyfry po przecinku liczby 

π

liczba m może być z zakresu  1

m

250

  !!!

float,m - podaj wynik w postaci liczb rzeczywistych z m cyframi znaczącymi

sin x

( )

3

sin x

( ) cos x

( )

2

+

simplify trig

,

sin x

( )

simplify, trig - wykorzystaj ogolnie znane tożsamości trygonometryczne

Do przekształceń trygonometrycznych przydatny jest modyfikator

Podobnie, ale bardziej precyzyjnie działa klucz assume bo pozwala określać dziedzinę pojedynczej zmiennej. Przykład 
podajemy na końcu tego punktu.

x

2

simplify assume

RealRange 0

,

(

)

=

,

x

podpowiadamy, że x jest nieujemne co pozwala 
jeszcze lepiej uprościć wyrażenie 

dla liczb rzeczywistych - już bez kłopotów

x

2

simplify assume

real

=

,

signum x

( ) x

x

2

simplify

csgn x

( ) x

tu upraszczamy ale otrzymujemy rozwiązanie w 
dziedzinie zespolonej 

tu nie wie co z tym chcemy zrobić

x

2

x

2

( )

1

2

simplify, assume=real - mówi że zmienne są liczbami rzeczywistymi

simplify, assume=RealRange(a,b) - lub ograniczone w pewnym przedziale

Czasami należy pomóc jeszcze bardziej poprzez ograniczenie dziedziny

Materiał dodatkowy

x

2

1

x

1

simplify

x

1

+

Musimy mu podpowiedzieć żeby starał się możliwie najlepiej 
uprościć wyrażenie

x

2

1

x

1

x

2

1

(

)

x

1

(

)

Jeżeli mogą wystąpić potencjalne osobliwości to Mathcad nie 
upraszcza wyrażeń automatycznie

simplify - uprość wyrażenie

π float 51

,

3.1415926535897932385

π float 51

,

3.1415926535897932385

1

x

2

1

x

1

factor

1

x

2

(

) x

1

(

)

16

background image

17

Shift+/'apostrof, x^3, spacja, +, sin(x), tab, x, Ctrl+.

x

x

3

sin x

( )

+

(

)

d
d

3 x

2

cos x

( )

+

Ctrl+L, sin(x)/x, tab, x, tab, 0, Ctrl+.

0

x

sin x

( )

x

lim

1

Opis

Wzór

Granice, pochodne i całki

 

uprość wyrażenie przy założeniu że  x

0

x

2

assume x

RealRange

0

,

(

)

=

,

simplify

x

assume X=real - X jest liczbą rzeczywistą

assume X=RealRange(a,b) - X jest liczbą rzeczywistą z przedziału (a,b)

Materiał dodatkowy

x

2

π

2

factor

float 3

,

x

3.14

(

) x

3.14

+

(

)

grupowanie - klikaj kolejne modyfikatory i 
dopiero potem je redaguj

x

2

π

2

factor

x

π

(

)

x

π

+

(

)

float 3

,

x

3.14

(

) x

3.14

+

(

)

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

f x

( ) expand x

,

x

3

6 x

2

11 x

6

+

f x

( ) coeffs x

,

6


11

6

1









porównaj współczynniki poniżej

f x

( )

x

1

(

) x

2

(

)

x

3

(

)

coeffs - podaj współczynniki wielomianu

Materiał dodatkowy

background image

18

teraz OK

C x

( ) simplify

1

tu też często trzeba dopomóc w upraszczaniu wyrażeń

C x

( )

cos x

( )

2

sin x

( )

2

+

macierz funkcyjna

C x

( )

cos x

( )

sin x

( )

sin x

( )

cos x

( )

:=

inny przykład

A

1

substitute a d

b c

DET

=

,

d

DET

c

DET

b

DET

a

DET

subtitute,wyr1=wyr2 - podstaw wyr2 zamiast wyr1

Przy okazji pokazujemy przykład zastosowania modyfikatora substitute

A

a d

b c

A

1

d

a d

b c

(

)

c

a d

b c

(

)

b

a d

b c

(

)

a

a d

b c

(

)

A

a

c

b

d

:=

d

ORIGIN

1

:=

Obliczenia symboliczne na macierzach

 

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ń.

sin x

( ) series x

, 10

,

x

1
6

x

3

1

120

x

5

1

5040

x

7

+

1

362880

x

9

+

rozwinięcie względem X w otoczeniu punktu x0 do rzędu  X

N

series,X=x0,N - rozwiń funkcję w szereg Taylora 

Shift+7, e^-x^2, tab, x, tab, 0, tab, Ctrl+Shift+Z, Ctrl+.

0

x

e

x

2

d

1
2

π

1

2

background image

19

C x

( )

1

simplify

cos x

( )

sin x

( )

sin x

( )

cos x

( )

C

α

( )

T

cos

α

( )

sin

α

( )

sin

α

( )

cos

α

( )

Jeżeli potrafimy obliczyć symbolicznie macierz odwrotną, to tym samym potrafimy symbolicznie rozwiązywać liniowe 
układy równań. 

 

Rozwiązywanie równań z jedną niewiadomą

solve, x - znajdź rozwiązanie równania względem zmiennej x

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

a x

2

b x

+

c

+

0

=

solve x

,

1

2 a

b

b

2

4 a

⋅ c

(

)

1

2

+





1

2 a

b

b

2

4 a

⋅ c

(

)

1

2









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".

a x

3

b x

2

+

c x

+

d

+

0

solve x

, →

a x

3

b x

2

+

c x

+

d

+

0

solve x

, →

background image

20

x

3

2x

2

+

3x

+

4

+

0

solve x

,

1

3

35

15 6

+

(

)

1

3

5

3 35

15 6

+

(

)

1

3

2
3

+

1
6

35

15 6

+

(

)

1

3

5

6 35

15 6

+

(

)

1

3

2
3

1
2

i

3

1

3

35

15 6

+

(

)

1

3

3 35

+

(

+

1
6

35

15 6

+

(

)

1

3

5

6 35

15 6

+

(

)

1

3

2
3

1
2

i

3

1

3

35

15 6

+

(

)

1

3

3 35

+

(





Jeżeli wystarczają nam konkretne wartości liczbowe, to warto dodatkowo zastosować modyfikator float,N

x

3

2x

2

+

3x

+

4

+

0

=

solve x

,

float 6

,

1.65062

.174686

1.54687 i

.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

Przykład: Znaleźć punkty przecięcia wykresów
y = cos(x)    i     y = x

5

0

5

5

5

cos x

( )

x

x

graficzna ilustracja do tego przykładu

cos x

( )

x

solve x

,

.73908513321516064166

cos x

( )

x

=

solve x

,

float 6

,

.739085

Niestety dla równań przestępnych (nawet najprostszych) Mathcad podaje pierwsze znalezione rozwiązanie.

background image

21

Nieco zmodyfikowane zadanie ma trzy 
pierwiastki, ale Mathcad podaje tylko jedno

5

0

5

cos x

( )

0.3x

x

graficzna ilustracja do tego przykładu

cos x

( )

0.3x

=

solve x

,

1.2019131636661846248

podobnie nie ma co liczyć aby Mathcad podał
nam rodzinę rozwiązań np. dla funkcji okresowych

cos x

( )

0

=

solve x

,

1
2

π

a nie 

π
2

k

π

+

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ć.

 

Rozwiązywanie nierówności - przykład

To rozwiązanie czytamy następująco:

x

1

x

2

x

3

+

x

1

+

>

solve x

,

x

1

<

2

x

<

(

) x

5

<

(

)

)

5

,

2

(

)

1

,

(

−∞

x

4

2

0

2

4

6

2

2

4

x 1

x 2

x 3

+

x 1

+

1

2

x

Jak widać z przedstawionych wykresów 
Mathcad dobrze wywiązał się z tego zadania.

Na piechotę mielibyśmy trochę liczenia: 3 
różne równania kwadratowe (tu akurat dwa z 
nich są tylko liniowe) dla różnych zakresów 
zmiennej x, a po rozwiazaniu jeszcze 
weryfikacja pierwiastków, czy zawierają się w 
założonym przedziale - w sumie żmudne i 
podatne na błedy rachunki, których można 
uniknąć stosując Mathcada. 

background image

22

MATHCAD 2000/2001   -   Rozwiązywanie równań, 

optymalizacja, wykresy 3D

 

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.

background image

23

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.

tu ORIGIN=0 dlatego p

1

 to drugi element wektora

W p

1

( )

0

=

p

1

2

=

p

1

2

3

4

5

=

p

W x

( )

0

=

(

) solve x

,

1

2

3

4

5

:=

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ń.

W x

( )

0

solve x

,

1

2

3

4

5

Solver bez problemu znajduje rozwiązanie.

Ale jak przechować je do dalszych obliczeń?
(dla krótkich jednorazowych obliczeń możemy ratować się 
skopiowaniem wyniku poprzez schowek Windows ale na dłuższą metę 
jest to niewygodne, bo przy każdej zmianie wyniku musimy od nowa 
kopiować!!!)

W x

( ) expand

x

5

15 x

4

85 x

3

225 x

2

+

274 x

120

+

W x

( )

x

1

(

) x

2

(

)

x

3

(

)

x

4

(

)

x

5

(

)

W x

( )

1

n

i

x

i

(

)

=

:=

świadomie wybieramy prosty wielomian, dla którego znamy pierwiastki 
aby łatwiej prześledzić dalsze obliczenia

n

5

:=

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ń.

Równania algebraiczne, wielomiany

Równania z jedną niewiadomą

 

background image

24

Drugi wykres - zawężony do przedziału (-4,2)

Pierwszy - zgrubny wykres

f x

( )

0

=

solve x

,

1.2019131636661846248

f x

( )

cos x

( )

a x

:=

a

0.3

:=

Wracamy do przykładu z poprzednich ćwiczeń:  cos x

( )

0.3x

=

, Tu dla wygody przejdziemy do 

standardowej postaci 

f x

( )

0

=

 gdzie: 

f x

( )

cos x

( )

0.3x

:=

. Jak pamiętamy "solve, x" potrafił znaleźć 

tylko jedno rozwiązanie. Poniżej pokażemy jak można znaleźć pozostałe pierwiastki. Jak 
zwykle bardzo przydatny będzie wykres badanej funkcji i ewentualnie technika "zoomowania" 
do precyzyjniejszej lokalizacji pierwiastków.

Równania przestępne

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ć. 

Podobna uwaga dotyczy zresztą i pozostałych procedur numerycznych omawianych poniżej. 
- w skrócie - zyskujemy ogromną szybkość obliczeń kosztem minimalnych błędów 
                               (w typowych zastosowaniach inżynierskich pomijalnie małych)

p

1

2

3

4

5

=

UWAGA: wynik numeryczny szukamy zawsze z pewnym 
dopuszczalnym (z góry ustalonym) błędem. Tu również wektor p 
zawiera błędy, o czym przekonać się można po wyświetleniu 
wyniku z 15 cyframi znaczącymi.

p

polyroots v

( )

:=

Y x

( )

x

5

15 x

4

85 x

3

225 x

2

+

274 x

120

+

Y x

( )

0

n

i

v

i

x

i

=

:=

wielomianu nie trzeba nawet wcale definiować
tu robimy to tylko dla sprawdzenia

v

120

274

225

85

15

1

(

)

T

:=

wpisujemy dla wygody wektor wierszowy i 
transponujemy go do kolumny

background image

25

tu szczęśliwie udało się rozwiązać problem 

Wywietlimy wyniki i sprawdzimy ewentualne błędy podstawiając do oryginalnego równania

p

i

root f x

( ) x

, a

i

,

b

i

,

(

)

:=

i

0 2

..

:=

b

3

2

2

:=

a

5

3

0

:=

definiujemy początki i końce przedziałów jako 
wektory, a nastepnie poprzez zmienną zakresową 
wykonamy kolejne obliczenia cyklicznie

niszczymy starą definicje wektora p - to zabieg typowo kosmetyczny

p

0

:=

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ść.

root f x3

( ) x3

,

2.5

,

2

,

(

)

2.356

=

tu podajemy przedział (a,b) tak aby na jego 
końcach funkcja miała różne znaki

i rozwiazujemy

root f x2

( ) x2

,

(

)

3.295

=

definiujemy początkowe przybliżenie

x2

3.3

:=

sprawdzamy wzór (czy wszystko OK?)

f x

( )

cos x

( )

.3 x

UWAGA: Omawiane funkcje - jako ogólniejsze - można również z powodzeniem stosować do 
równań wielomianowych - "tylko po co wyciągać armatę do zabicia muchy".

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) 

4

2

0

2

1

1

f x

( )

x

10

0

10

f x

( )

x

background image

26

Powtórzymy teraz powyższe obliczenia przy zmniejszonej tolerancji na błędy

TOL

1

10

3

×

=

CTOL

1

10

3

×

=

tak było do tej pory

TOL

10

10

:=

CTOL

10

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ść

z

5

2

1

:=

Given

f z

( )

0

=

super dokładnie ale na ogół powstają pewne 
błędy. Ich wielkość możemy kontrolować 
poprzez globalne zmienne TOL i CTOL.

p

3.294

2.356

1.202

=

f p

( )

0

0

0

=

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

Blok Given + funkcja find(x)

x0

1.5

:=

0. przed użyciem bloku given należy podać punkt startowy

Given

1. wpisujemy słowo kluczowe "Given"

f x0

( )

0

=

2. poniżej określamy równanie (lub kilka równań)

r

Find x0

( )

:=

3. i rozwiązujemy funkcją find(var1,var2,...)

---------------------------------------------

r

1.202

=

jak widać rozwiązanie jest mniej dokładne niż z funkcji root co 
wynika z zastosowania innego algorytmu numerycznego. Możemy 
jednak sterować dokładnością obliczeń, a prawdziwe zalety bloku 
Given, będziemy mogli docenić dopiero dla układów równań z 
kilkoma niewiadomymi.

f r

( )

1.099

10

7

×

=

p

2

1.202

=

f p

2

( )

0

=

Find z

( )

3.294

2.356

1.202

=

background image

27

 

Układy równań z wieloma niewiadomymi

Układy równań liniowych

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ą.

Nieliniowe układy równań 

Rozwiązywanie nieliniowych układów równań jest skomplikowanym zagadnieniem. Klasyczne podejście 
analityczne jest na ogół z góry skazane na niepowodzenie, gdyż eliminacja kolejnych zmiennych (nawet gdy 
możliwa) jest czasochłonna i prowadzi na ogół do skomplikowanego równania przestępnego. Mathcad pozwala w 
dość łatwy sposób przezwyciężyć te trudności na drodze numerycznej. Najbardziej uniwersalne jest w tym 
przypadku zastosowanie bloku Given, ale w niektórych szczególnych przypadkach możliwe jest nawet uzyskanie 
rozwiązania symbolicznego (solve, vec(x,y,z) ->).Aby nie zagłębiać się dalej w zawiłości teoretyczne przejdziemy 
od razu do przykładu.

Przykład: Wyznacz okrąg przecinający punkty (x,y) = (2,-4), (-3,1), (5,5)

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.

background image

28

Given

W bloku Given można również uzyskać rozwiązanie symboliczne (po find() wciskamy Ctrl+.  anie =).

=======================================================================

x1

xs

(

)

2

y1

ys

(

)

2

+

rs

2

=

x2

xs

(

)

2

y2

ys

(

)

2

+

rs

2

=

x3

xs

(

)

2

y3

ys

(

)

2

+

rs

2

=

rs

0

>

solve

xs

ys

rs

,

2 1 5

(

)

Tu również możemy podać dodatkowe ograniczenia nierównościowe

x1

xs

(

)

2

y1

ys

(

)

2

+

rs

2

=

x2

xs

(

)

2

y2

ys

(

)

2

+

rs

2

=

x3

xs

(

)

2

y3

ys

(

)

2

+

rs

2

=





solve

xs

ys

rs

,

2

2

1

1

5

5

Rozpatrywany układ równań jest na tyle prosty, że można go nawet rozwiązać symbolicznie

=======================================================================

otrzymaliśmy okrąg o promieniu 5 i środku (2,1)

Find x0 y0

,

r

,

(

)

2

1

5

=

x3

x0

(

)

2

y3

y0

(

)

2

+

r

2

=

x2

x0

(

)

2

y2

y0

(

)

2

+

r

2

=

punkty muszą spełniać to samo równanie okręgu

mamy 3 równania z 3-ma niewiadomymi x0, y0, r

x1

x0

(

)

2

y1

y0

(

)

2

+

r

2

=

definiujemy blok Given

Given

podajemy punkt startowy do rozwiązania

r

4

:=

y0

0

:=

x0

0

:=

y3

5

:=

x3

5

:=

definiujemy parametry zadania (tu współrzędne punktów)

y2

1

:=

x2

3

:=

y1

4

:=

x1

2

:=

=======================================================================

background image

29

x1

xx

(

)

2

y1

yy

(

)

2

+

rr

2

=

x2

xx

(

)

2

y2

yy

(

)

2

+

rr

2

=

x3

xx

(

)

2

y3

yy

(

)

2

+

rr

2

=

Ale z niewiadomych przyczyn nie można tu podać ograniczeń 
typu rr > 0 (Mathcad protestuje).

Find xx yy

,

rr

,

(

)

2

1

5

2

1

5

xp

2

3

5

:=

yp

4

1

5

:=

0

5

5

5

1

5 sin t

( ) 1

+

yp

1

2

5 cos t

( ) 2

+ xp

,

2

,

Na zakończenie omawianego przykładu
zilustrujemy rozwiązanie graficznie. 
1. tworzymy parametryczny wykres 

znalezionego okręgu

2. dodajemy serie punktów xp i yp
3. oraz pojedynczy punkt (2,1)
Aby uzyskać końcowy efekt jak na wykresie 
obok musimy go jeszcze odpowiednio 
sformatować. 

2

0

2

2

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 

background image

30

L

0.534

=

L

f a b

,

(

)

:=

Ostatecznie odległość jest równa 

b

r

1

:=

a

r

0

:=

r

0.074

0.538

=

obliczenie (a,b)  => min f(a,b)

r

Minimize f a

, b

,

(

)

:=

tu ew. mogą być zapisane ograniczenia

pusty blok given bo nie mamy ograniczeń

Given

punkty startowe - musimy zawsze podać

b

0

:=

a

0

:=

to tylko dla sprawdzenia czy OK

f 0 0

,

(

)

1

=

definiujemy funkcję celu

f a b

,

(

)

a

b

2

(

)

2

e

a

b

(

)

2

+

:=

Dla ułatwienia parametryzujemy obydwie krzywe - dla 
pierwszej krzywej przyjmujemy parametr a= x, a dla drugiej 
b=y. Musimy teraz zdefiniować funkcję odległości dla 
tych parametrów i obliczyć kiedy osiągnie minimalną 
wartość. Dla uproszczenia możemy wziąć kwadrat 
odległości - unikniemy pierwiastkowania i zmniejszymy 
stopień nieliniowości naszej funkcji celu

2

0

2

2

2

e

t

t

t t

2

,

Przykład: Obliczyć odległość dwóch krzywych  y

e

x

=

 i  

y

2

x

=

.

solver sam będzie próbował sklasyfikować problem i zastosować odpowiednią procedurę numeryczną. Podobnie jak 
wcześniej, przejdziemy do konkretnego przykładu.

background image

31

Na koniec przedstawiamy wykres z zaznaczeniem znalezionych (najbliższych) punktów na wykresie. 

rx

a b

2

( )

T

:=

ry

e

a

b

( )

T

:=

rx

0.0735622

0.2896245

=

1

0.5

0

0.5

1

1.5

1

0.5

0.5

1

1.5

e

t

t

ry

t t

2

,

rx

,

UWAGA: Aby prawidłowo pokazać odległość 
musimy zadbać aby skale osi x i y były takie 
same. W innym razie wykres będzie 
zniekształcony i trudno będzie ocenić czy 
rozwiązanie jest OK.

background image

32

MATHCAD 2000/2001   -   wykresy 3D

 

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.

f x y

,

(

)

x

y

2

(

)

2

e

x

y

(

)

2

+

:=

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

background image

33

Przy definicji pewnych klas funkcji warunkowych przydatne mogą być funkcje min()max() i mod() - pierwsze dwie 
używamy w sytuacjach gdy chcemy ograniczyć (obciąć) zakresy wartości a ostatnia jest przydatna do definicji funkcji 
okresowych.

Funkcje max(), min() i mod()

2

0

2

g x

( )

x

5

0

5

10

5

f x

( )

x

g x

( )

if x

p

1

,

if x

p

1

, sin x

( )

,

(

)

,

(

)

:=

f x

( )

if x

0

x

, sin x

( )

,

(

)

:=

to tylko dla wygody

p

π
2

:=

należy zastosować zagnieżdżoną funkcję if()

Odpowiednia definicja w Mathadzie 
ma postać:

>

=

0

sin

0

)

(

x

dla

x

x

dla

x

x

f



+

<

<

=

2

/

1

2

/

2

/

sin

2

/

1

)

(

π

π

π

π

x

dla

x

x

dla

x

x

dla

x

g

Dla 3 przedziałów:

Dana jest następująca funkcja:

Przykład 2

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Przykład 1

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.

 

Funkcja if()

Obliczenia warunkowe

 

MATHCAD 2000/2001   -   elementy programowania

background image

34

10

0

10

1

0

1

max cos x

( ) 0.3

,

(

)

0

2

4

6

0

1

2

mod x 2

,

(

)

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:

                                  f x

( )

f x

( )

              

x

f x

( )

d
d

x

f x

( )

d
d

           

błąd

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

+

                     

x

f x

( )

d
d

simplify

1

Φ x

( ) cos x

( )

Φ x

( )

+

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.

background image

35

wart1 gdy spełniony jest warunek1

wart2 gdy spełniony jest warunek2

 

itd.

 

wartX we wszystkich pozostałych przypadkach

 

wart1

warunek1

if

wart2

warunek2

if

"......."

wartX otherwise

Akcja = podaj wartość:

Składnia:

if  ... if ... otherwise - warunkowe obliczenie wyrażenia

przypisz zmiennej var wartość value

zwiększ x o jeden

 

var

value

x

x

1

+

Akcja

Składnia:

   -   definicja lokalnej zmiennej wewnątrz bloku (operator przypisania)

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).

Wprowadzenie

Materiał dodatkowy

Elementy programowania

 

background image

36

10

! 3.629 10

6

×

=

1

11

i

i

2

=

506

=

sum 11

( )

506

=

silnia 10

( )

3.629

10

6

×

=

sum n

( )

s

0

s

s

i

2

+

i

1 n

..

for

s

:=

silnia n

( )

s

1

s

s i

i

2 n

..

for

s

:=

suma:  1

2

2

2

+

3

2

+

..

+

N

2

+

  

Przykład 4

Przykład 3

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

dla i równe od 1 do N 

wykonaj podaną instrukcję 

 

 

lub    (tu z krokiem 2)

 

 

ciąg instrukcji w bloku

 

instrukcja

i

1 N

..

for

lub

instr_1

"....."

instr_K

i

1 3

,

N

..

for

Akcja = wykonaj-powtórz N razy

Składnia:

for - pętla "od-do-co" (cykliczne wykonanie instrukcji dla zmiennej zakresowej) 

g x

( )

p

π
2

1

x

p

if

1

x

p

if

sin x

( ) otherwise

:=

0

5

10

4

2

2

f x

( )

x

x

0

if

sin x

( ) otherwise

:=

podobna lecz trochę bardziej rozbudowana będzie 
definicja funkcji g(x) - tu dla wygody definiujemy 
roboczą-lokalną zmienną p; jest ona widoczna jedynie 
wewnątrz bloku reprezento- wanego przez pionową 
kreskę

funkcję f(x) omawianą na początku tego 
dokumentu można zapisać następująco

Przykład 2

Przykład 1

background image

37

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.

tak długo jak spełniony jest warunek logiczny war_log

wykonaj podaną instrukcję 

 

lub

 

     

     (tu konkretny przykład na war_log).

 

 

wykonaj 

ciąg instrukcji w bloku

 

instrukcja

war_log

while

lub

instr_1

"....."

instr_K

x

Xmax

<

while

Akcja = wykonaj-powtórz obliczenia

Składnia:

while - pętla "tak długo jak"

OK

max v

( )

8.228

=

imax v

( )

4

8.228

=

dla porównania funkcja max()

nasza funkcja

v

T

0.013 1.933 5.85 3.503 8.228 1.741 7.105 3.04 0.914 1.473

(

)

=

generujemy losowy wektor

v

i

rnd 10

( )

:=

i

0 9

..

:=

Testujemy naszą funkcję

Zmienna ix przechowuje dotychczasowy- 
-najlepszy-znaleziony indeks.

Aby program był uniwersalny nie możemy 
zaczynać od 0 lub 1 tylko od ORIGIN i kończyć 
pętlę dla last(v). 

imax v

( )

ix

ORIGIN

ix

i

v

i

v

ix

>

if

i

ORIGIN last v

( )

..

for

ix

v

ix

:=

tu w odróżnieniu od standardowej funkcji max() chcemy znaleźć numer maksymalnego elementu, przy okazji 
zwrócimy też wartość tego elementu. Nasza funkcja będzie więc zwracać od razu dwie wartości (w postaci 
wektora dwuelementowego). Dla przejrzystości pomijamy w poniższym przykładzie sprawdzenie czy dane 
wejściowe są wektorem (zakładamy, że tak jest).

znalezienie maksymalnego elementu wektora

Przykład 5

background image

38

sqrt 17

2

10

12

,

(

)

1

145

73.4965517241379

38.7143544958308

23.0896429413719

17.8030386448063

17.0181112639791

17.0000096373175

17.0000000000027

17

=

|
|
|
|
|
|
|
|
|
|
|
|
|
|

sqrt a

ε

,

( )

x

1

i

0

v

i

x

x

1
2

x

a
x

+





i

i

1

+

v

i

x

x

2

a

ε

>

while

v

:=

Podobnie - drobna korekta - gdybyśmy chcieli prześledzić historię zbieżności naszego algorytmu:

sqrt 9 10

12

,

(

)

3 6

(

)

=

sqrt 9 0.0001

,

(

)

3.00000000139698 5

(

)

=

sqrt 9 0.1

,

(

)

3.00009155413138 4

(

)

=

|
|
|
|
|
|
|
|
|
|

sqrt a

ε

,

( )

x

1

i

0

x

1
2

x

a
x

+





i

i

1

+

x

2

a

ε

>

while

x i

(

)

:=

Gdybyśmy chcieli dowiedzeć się ile iteracji zostało przeprowadzonych wystarczy nieco zmodyfikować naszą 
funkcję

sqrt 4 10

7

,

(

)

2

=

sqrt 4 10

5

,

(

)

2.00000009292229

=

sqrt 4 0.001

,

(

)

2.00000009292229

=

sqrt 4 0.01

,

(

)

2.00060975609756

=

Testujemy naszą funkcję

licz kolejne przybliżenia

tak długo jak  błąd > 

ε

pierwsze przybliżenie

sqrt a

ε

,

( )

p

1

p

1
2

p

a
p

+





p

2

a

ε

>

while

:=

Obliczenie pierwiastka kwadratowego  a metodą iteracyjną   p

i 1

+

1
2

p

i

a

p

i

+

=

  

Przykład 6

background image

39

kolejne elementy szeregu można liczyć efektywnie z rekurencyjnej formuły:  a

i

a

i 2

x

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).

Jeszcze kilka uwag zanim zaczniemy programować!!!

Ale ile wyrazów trzeba zsumować aby osiągnąć ustaloną dokładność??? 
Aby nie wnikać za głęboko w tajniki szeregów funkcyjnych podajemy gotowe rozwiązanie. 
Reszta rozpatrywanego szeregu jest nie większa niż

                             R

k

x

k 1

+

k

1

+

(

)

!

<

              dla  k = 2i+1  nieparzyste

Trzeba po prostu sumować szereg tak długo jak (ang. while) błąd określony powyższym wzorem jest większy od 
ustalonego z góry, dopuszczalnego błędu 

ε

.

sin 1

( )

0.841470984807897

=

sinN 1 4

,

(

)

0.841471009700176

=

sinN x N

,

(

)

0

N

i

1

(

)

i

x

2 i

⋅ 1

+

2 i

1

+

(

)

!

=

:=

Sumę określonej liczby wyrazów takiego szeregu można zapisać bez programowania: 

Ten szereg potęgowy możemy przedstawić w postaci:  x

x

3

3

!

x

5

5

!

+

..

−   

sin x

( ) series x

, 10

,

x

1
6

x

3

1

120

x

5

1

5040

x

7

+

1

362880

x

9

+

rozwijamy sin(x) w szereg Taylora

Na początek trochę teorii

Napiszemy własną funkcję sinus(x,

ε

), która liczy wartość sin(x) z ustaloną dokładnością

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.  

Sumowanie szeregów z ustaloną dokładnością

Przykład 7

background image

40

Definicja naszej funkcji sinus

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Testowe zadanie

sinus x

ε

,

( )

x

mod x 2

π

,

(

)

i

1

a

x

s

a

r

x

2

2

÷

xx

x

− x

i

i

2

+

a

a

xx

i i

1

(

)

s

s

a

+

r

a x

i

1

+

r

ε

>

while

s

i

:=

x

1

:=

e

10

8

:=

sin x

( )

0.841470984807897

=

sinus x e

,

(

)

0.841470984648068

11

=

trzeba było obliczyć szereg do wyrazu x

11

err

sin 10

( )

sinus 10 e

,

(

)

0

:=

err

4.915

10

10

×

=

rzeczywisty błąd jest dużo mniejszy, gdyż 
zastosowane oszacowanie błędu jest pesymistyczne 
(gwarantowane) - w typowych sytuacjach błąd jest 
o 1 lub 2 rzędy niższy.

dodano "i" do wyniku dla celów testowych