Алгоритми в
Mathematica      

Система Mathematica разполага с най-многобройната колекция от вградени алгоритми за приближено решаване на определени класове задачи,  оформени като функции. Основните между тях са числени пресмятания на корени на уравнения и системи, обръщане на матрици, собствени стойности на матрици, задачи от теория на числата, числено и символно интегриране, диференциални уравнения и други.
Когато няма вградена функция можем сами да програмираме произволен алгоритъм, като използваме съответните оператори от силно развития програмен език на
Mathematica.

Пример 1. Метод на Нютон за решаване на трансцендентни уравнения. В примера се намира реален корен на  уравнението Cos(x)=x+Log(x), като за начално приближение е избрано x=1. Добре е да комбинираме решението с графика на функцията в подходящ интервал.

FindRoot[Cos[x] == x + Log[x], {x, 1}]

RowBox[{{, RowBox[{x, , 0.840619}], }}]

f = Cos[x] - x - Log[x] g1 = Plot[f, {x, 0, 5}]

-x + Cos[x] - Log[x]

[Graphics:HTMLFiles/index_5.gif]

⁃Graphics⁃

Пример 2.  Приближено решаване на уравнения и системи уравнения, включително в комплексната равнина. Точното решаване, когато е възможно, се получава с функцията Solve[ ]. Ако тя не дава резултат, се опитва с алгоритмите за приближено решаване: NSolve[ ],  FindRoot[ ], Reduce[ ] и други функции. Тук решаваме полиномно уравнение в комплексната област спрямо x с точност 30 аритметични знака. В случая получаваме едновременно пет различни реални корена във вид на списък.

x=. NSolve[x^5 - 6x^3 + 8x + 1 == 0, x, 30]

RowBox[{{, RowBox[{RowBox[{{, RowBox[{x, , RowBox[{-, 2.05410715179010988179280712936} ... 9719563865}], }}], ,, RowBox[{{, RowBox[{x, , 1.9215959613089628890382661792}], }}]}], }}]

Пример 3.  За да намерим пресечната точка на две параметрично зададени криви можем да използваме друг вид на функцията NSolve[ ]. Join служи за обединяване (едновременно решаване на уравненията на кривите).  

c1 = {x - (t^2 - 1)^(1/2), y - (t^2 + 2t - 4)} ;

c2 = {x - (s^3 + s + 5), y - (s^2 + 7 s - 2)^(1/2)} ;

NSolve[Join[c1, c2], {x, y}, {s, t}]

RowBox[{{, RowBox[{RowBox[{{, RowBox[{RowBox[{x, , RowBox[{RowBox[{0.980696, } ... , RowBox[{RowBox[{1.73748, }], -, RowBox[{3.30781,  , }]}]}]}], }}]}], }}]

Пример 4. Пресмятане на приближената стойност на определен интеграл. Главната буква N пред функцията Integrate показва, че се смята числено (от Numerical). Чрез щракване в реда на резултата и натискане на клавиша ENTER се получават по-голям брой знаци.

NIntegrate[Log[x + Sin[x]], {x, 0, 2}]

0.555889

0.555889

Пример 5.  Разлагане на естествено число на прости множители. Резултатът е във вид на списък, като първото число е множителят, а второто - кратността му.

FactorInteger[18] FactorInteger[2^105 - 1]

{{2, 1}, {3, 2}}

{{7, 2}, {31, 1}, {71, 1}, {127, 1}, {151, 1}, {337, 1}, {29191, 1}, {106681, 1}, {122921, 1}, {152041, 1}}

Пример 6.  Задаваме квадратна матрица, системата намира обратната й.

m = {{1, -3, 8}, {3, 9, 4}, {-3, 0, 4}} ; MatrixForm[%] Inverse[m] ; MatrixForm[%]

( 1    -3   8  )            3    9    4            -3   0    4

( 1     1      7  )           -     --    ---           9     27     27        ...           27   81    81            1     1     1           --    --    --           12    36    18

Пример 7. Mathematica решава диференциални уравнения и системи както символно (когато е възможно), така и числено. Ето едно нелинейно диференциално уравнение от втори ред, със зададени начални условия в точката 0.
                 x'' +
x^3 = sin(t),    x(0) = 0,  x'(0) = 0,   t ∈ [0, 20]
Алгоритъмът за приближено решаване се извиква с функциата NDSolve. При численото решаване се получава таблица от стойности, които системата помни като интерполираща функция. В отделна клетка е даден начинът за графично представяне на резултата.

NDSolve[{x ' '[t] + x[t]^3 == Sin[t], x[0] == x '[0] == 0}, <br />    &nbs ...               x, {t, 0, 20}]

RowBox[{{, RowBox[{{, RowBox[{x, , TagBox[RowBox[{InterpolatingFunction, [, RowBox[{Ro ... wBox[{{, RowBox[{0., ,, 20.}], }}], }}], ,, <>}], ]}], False, Editable -> False]}], }}], }}]

ParametricPlot[Evaluate[{x[t], x '[t]}/.%], {t, 0, 20}]

[Graphics:HTMLFiles/index_26.gif]

⁃Graphics⁃


Created by Mathematica  (October 6, 2007)