Quit[]

Elementy programowania niskiego poziomu

Mathematica wersja 7.0

W Mathematice programowanie niskiego poziomu określane jest tez mianem programowania typu flaw control (sterowania przepływem danych).  Składnia poleceń jest tu  oparta  na  składni poleceń języka C.

inkremetacja

Inkrementacja to powiększanie wartości zmiennej o ustaloną wartość (najczęściej jeden)

AddTo (i+)

i=1

i+=1

i+=5

i

i=.

post-inkrementacja (Increment, i++), pre-inkrementacja (PreIncrement, ++i)

Inkrementacja k++ (post-inkrementacja)  podnosi wartość zmiennej o 1 i zwraca warość wyjściową

k=1;k++

k

Podobnie działa  ++k  (pre-inkrementacja) tylko zwraca wartość nową

k=1;++k

dekrementacja (Decrement, --)

Na identycznych zasadach działa dekrementacja.

multiplikacja

i=1;

i*=2

i

i*=5

i

i=.

pętle (Do, While, For), warunek (If)

Do

Polecenie Do ma podobną strukturę do Table. Zakres zmienności parametru iteracyjnego  i  jest  z góry ustalony. Pierwszym argumentem polecenia Do jest polecenie lub ciąg poleceń rozdzielonych średnikami.

Do[a[i]=i,{i,10}]

Polecenie Do nie zwraca automatycznie wyniku wykonanych operacji. Aby sprawdzić skutek muszę użyć polecenia Print.

Do[Print[i^2],{i,4}]

Ciąg poleceń rozdzielonych średnikami:

Do[a[i]=i;b[i]=(i^2),{i,10}]

Sprawdzam skutek

Do[Print["a[",i,"]=",a[i],"   b[",i,"]=",b[i]],{i,10}]

Można też zrobić tak

zrobto:=(m[i]=1/i;n[i]=1/(i^2);)
Do[zrobto,{i,10}]

Zdefiniowane  przez  SetDelay (:=) polecenie zrobto jest najprostszą formą procedury (o tym więcej za chwilę)

Sprawdzam skutek

Do[Print[{m[i],n[i]}],{i,10}]

Większość prostych operacji możliwych do wykonania przy pomocy Do można też wykonać przy użyciu Table. Polecenie Table dodatkowo zwraca wynik w postaci listy.

Do[a[i]=i,{i,10}]
Table[a[i]=i,{i,10}]

Polecenie Do działa tak jakby instrukcja w pierwszym argumencie kończyła się średnikiem.

Do[p[i]=Plot[Sin[i x],{x,0,10}],{i,4}]

Dlatego Plot umieszczone w pętli Do nie kończy się wyświetleniem grafiki (Mathematica 7)

Inaczej jest w przypadku Table

Table[Plot[Sin[i x],{x,0,10}],{i,4}]

Do[Show[p[i]],{i,4}]

Table[Show[p[i]],{i,4}]

Odwracając kolejnośc operacji moge narysować na wspólnym wykresie

Show[Table[p[i],{i,4}]]

Pętlę Do można zagnieżdżać

Do[Do[a[i,j]=i+j^2,{i,10}],{j,10}]

a[3,1]

Można to zapisać przy pomocy jednego polecenia Do zawierajacego dwie pętle: wewnętrzną i zewnetrzną. Struktura tego polecenia nie wyróżnia jawnie pętli wewnetrznej i zewnetrznej, ale zamiana kolejności wskaźników prowadzi

Do[a[i,j]=i+j^2,{i,10},{j,10}]

Zadanie : sprawdzić nieprzemienność i,j na kilku samodzielnie skonstrowanych przykładach.

Warunek If

Struktura : If [zdanie logiczne, wykonaj jeśli prawda, wykonaj jesli fałsz]

If[3<1, Print["nierówność spełniona"],Print["nierówność niespełniona"]]

Warunek If  zawierajacy zmienne, którym nie przypisano wartości nie powoduje żadniego skutku.

If[i<j,A[i,j]=(i^2)+(j^2),A[i,j]=0]

Warunek zanurzam w petli Do. Buduje macierz o zerowych elementach poniżej diagonali.

Do[If[i<j,A[i,j]=(i^2)+(j^2),A[i,j]=0],{i,-4,4},{j,-4,4}];

Sprawdzam skutek

Table[A[i,j],{i,-4,4},{j,-4,4}]//TableForm

Pętla While

Petla While to petla z "wbudowanym" warunkiem

i=-4;
While[(i+=1)<5,Print[i,"<5"]]

i=.

Podobnie jak petla  Do polecenie While działa tak jakby instrukcja w pierwszym argumencie kończyła się średnikiem.

i=-4;
While[(i+=1)<5,p[i]=Plot[Sin[i x],{x,1,4}]]

Table[Show[p[i]],{i,6}]

For

Struktura pętli For:  For[wartości poczatkowe, warunek, inkrementacja, ciąg instrukcji]

For[i=1,i<5,i++,Print[i]]

Przykład

Rekonstruuję polecenie Total przy pomocy pętli For

Total[Range[10]]

k=0;
For[i=1,i<11,i++,k=(k+i)]

k

pętla ze skokiem do etykiety (Goto, Label)

Te same operacje można wykonać przy użyciu jeszcze bardziej elementarnych środków: warunku i polecenia skoku.
Skok do wskazanej instrukcji umożliwia etykieta Label[ ] poprzedzająca te instrukcję. (W Mathematice Label traktowana jest jak każda inna komenda. W większosci języków  niskiego poziomu - w tym w Fortranie i Pascalu - etykiety mają odrębny status. "Przyczepiane" są do instrukcji.)

Aby można było użyć etykiety i instrukcji skoku,  wszystkie polecenia programu muszą znajdować się w jednaj celi i być objęte nawiasem okrąjłym. (Alternatywnie moga znajdować się w jednej linii bez nawiasów, ale jest to mało uzyteczne z powodu nieczytelności takiego kodu.)

Silnia

(i=1;
silnia=i;
Label[oDnowA];
Print[silnia];
i+=1;
silnia=(silnia *i);
If[i<6,Goto[oDnowA]])

Range[5]!

i =.

Length

lista={1,2,3.5,7,8};

(i=0;
Label[oDnowA];
i+=1;
If[NumberQ[lista[[i]]],Goto[oDnowA],Print[i-1]])

i =.

Length[lista]

zadania

Zadanie 1

X=RandomReal[NormalDistribution[2.5,0.2],200];

Variance[X]

Znaleźć warianję próbki X przy pomocy programowania "niskiego poziomu".

Zadanie 2

Napisać program znajdujący  miejsca zerowe funkcji

f[x_]=2Sin[x]^2+x;

Plot[f[x],{x,-2,2}]

metodą bisekcji (metodą równego podziału) ,  z dokładnoscią do 0.0001.  Sprawdzić wynik przy pomocy polecenie FinfRoot.

źródło notatnika

Algebra Komputerowa  (http://mth.drac.oa.uj.edu.pl/public.php?pubcase=lecture)
Wersja programu: Mathematica 7

Andrzej Woszczyna
Wydział Fizyki, Astronomii i Informatyki Stosowanej
Uniwersytet Jagielloński