Въведение, синтаксис на Mathematica.

В първото упражнение се разгледаха по-основните функции за работа със системата Mathematica.

Общи сведения

Атомарни изрази

В езика на Mathematica основната градивна частица са атомарните изрази, които се разделят на три типа:

1) символи - забочват с буква и могат да съдържат букви и цифри
2) числа (четири типа според представянето) :

  • цели числа;
  • реални ( например 3.4 )
  • комплексни ( например 3 + 4I )
  • рационални ( например 3 / 4 )

3) низове съдържащи цифри, букви и разстояния. Низовете се заграждат в кавички ( например "примерен низ" )

Списъци

Общият вид на един списък е {<a_expr1> , … , <a_exprN>} (например {1,2,3})

Изчисление на изразите

Как работи Mathematica ? Mathematica е от типа системи, които работят с
интерпретиране на термовете (т.н. TRS - term rewriting system ). Въведеният израз се изчилсява като
се търси съвпадение с някакви правила за интерпретиране. Тези правила се състоят от две части - образец
образец от лявата страна и текст за смяна от дясната. ( припомнете си как се извършва унификация в пролог примерно :) ).
Накрая се прилагат изчисленията върху получения израз като се търсят подходящи формули и крайния резултат от тяхното (каскадно)
прилагане се извежда.

За да се направи проверка дали израз съвпада с някакъв образец може да се използва функцията MatchQ
MatchQ[<expr1>, <expr2>] - Връща True, ако <expr1> може да се унифицира с <expr2> и False - в противен случай.
Например:

MatchQ[x^2, x^_Integer] (* True *)
MatchQ[x^2, _^_] (* True *)
MatchQ[x^2, _] (* True *)
MatchQ[{a,b,c}, {_}] (* False *)
MatchQ[{a,b,c}, {__}] (* True *) (* двойна подчертавка значи "един или повече израза" *)
MatchQ[{a,b,c}, {___}] (* True *) (* тройна подчертавка значи "нула или повече израза" *)

Има още много какво да се каже за търсенето по образец в Mathematica, но нека не задълбаваме :)

Деклариране на променливи

Set[<var>, <expr>] - присвоява на <var> стойността на <expr>
(кратък вариант: <var> = <expr>)
Например

Set[x, 11]
y = Sqrt[2]

Дефиниране на функции

SetDelayed[<име_на_функцията>[<var1>_, … , <varN>_] , <expr>]
(кратък вариант: <име_на_функцията>[<var1>_,…,<varN>_] := <expr>)
Например:

SetDelayed[f[x_], x*x]
f[x_] := x^3 - 27

Забележете, че променливите във дефиницията на функцията завършват с _, , или _.
Друга интересна ситуация се получава, ако дефинираме една и съща функция с различна сигнатура.
Например:

f[x_] := x^2
f[x_Integer] := x^3
f[2] (* 2^3 *)
f[2.2] (* 2.2^2 *)

В този случай Mathematica ще запази и двете функции в базата с правила, но при опит да се използва някоя от тях
винаги ще се търси тази с по-близко предназначение (ако е повече от една се влима първата подред в базата).

Други две полезни функции са Nest и NestList
Nest[<func>, <expr>, <n>] - прилага <n> пъти функцията <func> върху <expr>
NestList[<func>, <expr>, <n>] - същото като Nest, само че връща списък с всички изчислени междинни стойности

Пример:

Nest[Sqrt,2,3] (* [$ 2^(\frac{1,8}) $] *)

Съставни изрази

Общата структура на съставните изрази има вида :
<expr1>;<expr2>; … ; <exprN>

Например :

num = Sqrt[2]; num/2 (* [[$ 1 / \sqrt{2} $]] *)

Полезни функции

Factor[<expression>] - факторизира аритметичен израз (например Factor [-1 + x^2] = (-1 + x) (1 + x) )
Expand[<expression>] - разширява аритметичен израз (обратното на Factor)
Simplify[<expression>] - опростява аритметичен израз
FullSimplify[<expression»] - аналог на Simplify със разширена функционалност

N[<expression>] - представя резултата в десетична дроб ( например N[1/3] = 0.333333 - ако е без нормализация ще излезе като 1/3)
N[<expression>,<precision>] - същото като горното, само че с предварително зададен брой цифри след десетичната запетая

Clear[<variable_1>, … , <variable_n>] - премахва от паметта променливите <variable_1> , .. , <variable_n>
Integrate[<expression>,<variable>] - Пресмята интеграл.
Series[<expression>,{<variable>,<lower>,<upper>}] - Развива <expression> в степенен ред.
(пр. Series[Tan[x], {x, 0, 11}])
Limit[<expression>,<variable> -> <value>] - Намира граница на израз.
(пр. Limit[Sin[x]/x, x -> 0])

% - включва резултата от предното изчисление

Матрици

Det[<matrix1>] - Намира детерминанта.
MatrixForm[<matrix1>,<matrix2>] - Умножава две матрици.

Уравнения

Solve[<equation>,<variable>] - решава уравнение за дадена променлива.
Например:
Solve[x^2 - 3x + 2 == 0,x] )
Solve[{x+y==5,x+y==1} , {x,y}] - същото, само че за система от уравнения

ChebyshevT[<n>,<variable>] - Полиноми на Чебишев от n-та степен за <variable>

Създаване на списъци

Table[ <expression>, {<variable>, <lower>, <upper>, <iter>} ] - генерира списък от <expression> за
<variable> със стойности от <lower> до <upper> през <iter> стъпки, като <iter> не е задължително да се задава
(по подразбиране е 1)

Например: Table[ n^2, {n, 1, 10} ] -> { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 } )

Ако сме присвоили генерирания списък на някаква променлива , то може да достъпим произволен елемент
чрез <име_на_променлива>[[индекс]]. Например:

var = Table[x , {x, 1, 10}]
var[[3]]  (* 3 *)

Apply[<function>, <list>] - агрегира елементите на <list> чрез <function>
Пример:

Apply[Plus, {2, 3, 4}] (* 9 *)

Range[<lower>, <upper>, <iter>] - генерира списък с числа от <lower> до <upper> през <iter> стъпки (по подразбиране е 1)

Array[<func>, <n>, <lower>] - генерира списъка { f[<lower>], … , f[<lower> + <n> - 1] (по подразбиране <lower> е 1)

Цикли, условни оператори

Do[<expr>, {<n>}] - итерира върху <expr> <n> пъти
Do[<expr>, {<var>, <lower>, <upper>, <iter>}] - итерира върху <expr> като присвоява на <var> стойности от <lower> до <upper> през <iter> стъпки
(<lower> и <iter> не са задължителни - по подразбиране са 1)

Другите две фунцкции са While и For:

While[<condition>, <expr>]
For[<init>, <test>, <increment>, <expr>]

Инструкцията if може да се използва за условен израз:

if[<condition>, <true>, <false>, <neither>] - ако <condition> е изпълнено изпълнява <true>,
ако <condition> не е изпълнено изпълнява <false>, и ако не е нито от двете (например ако <condition> не е подходящо условие)
изпълнява <neither>
if[<condition>, <true>, <false>]
if[<condition>, <true>]
if[<condition>, <false>]

Графики

Plot[<expression>,{<variable1>,<lower>,<upper>}] - Рисува графика на функция. Вторият аргумент е интервал, показващ границите, в които да чертае.
Пример:
Plot[x^3 - 1, {x, -1, 1}])
(това чертае $x^3 -1$ за x от -1 до 1)
Plot може да приема цял куп допълнителни аргументи. Погледнете си документацията.

Plot3D[<expression>,{<variable1>,<lower1>,<upper1>},{<variable2>,<lower2>,<upper2>}] - Рисува графика в 3 измерения.
Пример:
Plot3D[x^3 - y^3, {x, -1, 1}, {y, -1, 1}]

ContourPoint[<expression>,{<variable1>,<lower1>,<upper1>},{<variable2>,<lower2>,<upper2>}] - Рисува графика в 3 измерения по начин, който не е полезен за никого.
Пример:
ContourPlot[x^3 - y^3, {x, -1, 1}, {y, -1, 1}]

Някои полезни вградени функции

FullForm[<expression>] - извежда в явен вид представянето на <expression>
Например:

FullForm[{a,b,c} (* List[a,b,c] *)
FullForm[a+b+c] (* Plus[a,b,c]) *)

Part[<expression>, <element_index>] -> извлича елемента на зададената позиция в <expression>
Например:

Part[{1, 2, 3}, 0] (* List *) (* същото като {1, 2, 3}[[0]] *)
Part[{1, 2, 3}, 1] (* 1 *)

ReplacePart[<expression>, <old_element>, <new_element>] - замества <old_element> с <new_element> в <expression>

Документация по кода

Коментарите могат да се задават като

 (* <някакъв коментар> *)

(като могат и да се влагат един в друг)

Функциите могат да се документират по добър начин като

 <име_на_функцията>::usage="<някакво_описание>"

след което информацията за съответната функция да се изведе с
 ?<име_на_фунцкия>

или
 ??<име_на_фунцкия>

като втория вариант изкарва и дефиницията на функцията.

Дебъгване на кода

Съвсем просто може да изпозлвате вградената функцията Trace,
която проследява изпълнението на даден израз ( също толкова просто, колкото и в пролог :) -
там е с предиката trace. )
Trace[<expr>]

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License