Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 971a3706a7676677c8b7bbdffc0c4b9b > files > 198

sagemath-doc-ru-5.9-9.fc18.noarch.rpm


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Интерфейсы &mdash; Sage Tutorial in Russian v5.9</title>
    
    <link rel="stylesheet" href="_static/sage.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '5.9',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <script type="text/javascript" src="_static/translations.js"></script>
    <link rel="shortcut icon" href="_static/favicon.ico"/>
    <link rel="top" title="Sage Tutorial in Russian v5.9" href="index.html" />
    <link rel="next" title="Программирование" href="programming.html" />
    <link rel="prev" title="Интерактивная оболочка" href="interactive_shell.html" />
    <link rel="icon" href="_static/sageicon.png" type="image/x-icon" />

  </head>
  <body>
    <div class="related">
      <h3>Просмотр</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Словарь-указатель"
             accesskey="I">словарь</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >модули</a> |</li>
        <li class="right" >
          <a href="programming.html" title="Программирование"
             accesskey="N">следующий</a> |</li>
        <li class="right" >
          <a href="interactive_shell.html" title="Интерактивная оболочка"
             accesskey="P">предыдущий</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Sage Tutorial in Russian v5.9</a> &raquo;</li>
 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="id1">
<h1>Интерфейсы<a class="headerlink" href="#id1" title="Ссылка на этот заголовок">¶</a></h1>
<p>Краеугольным камнем Sage является поддержка вычислений с использованием
объектов из разных систем комьпютерной алгебры, которые находятся &#8220;под
одной крышей&#8221; и используют общий интерфейс и чистый язык программирования.</p>
<p>Методы console и interact интерфейса делают разные вещи. Например, используя
GAP как пример:</p>
<ol class="arabic simple">
<li><tt class="docutils literal"><span class="pre">gap.console()</span></tt>: Открывает консоль GAP и передает управление GAP&#8217;у.
Здесь Sage выступает в роли удобной командной строки, наподобие оболочки
Bash в GNU/Linux.</li>
<li><tt class="docutils literal"><span class="pre">gap.interact()</span></tt>: Это удобный способ взаимодействия с запущенным
интерфейсом GAP, &#8220;заполненным&#8221; объектами Sage. Вы можете импортировать
объекты Sage в сессию GAP (даже из интерактивного интерфейса), и пр.</li>
</ol>
<div class="section" id="gp-pari">
<h2>GP/PARI<a class="headerlink" href="#gp-pari" title="Ссылка на этот заголовок">¶</a></h2>
<p>PARI это компактная, очень продуманная и хорошо оптимизированная программа
на C, сосредоточенная на теории чисел. Существует два раздельных интерфейса,
которые вы можете использовать в Sage:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">gp</span></tt> - gp - интерпретатор &#8220;<strong>G</strong> o <strong>P</strong> ARI&#8221; , и</li>
<li><tt class="docutils literal"><span class="pre">pari</span></tt> - pari - С-библиотека PARI.</li>
</ul>
<p>Например, следующие две строчки выполняют одну и ту же операцию. Они выглядят
идентично, но вывод на самом деле отличается, а за кулисами происходят совсем
разные вещи.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: gp(&#39;znprimroot(10007)&#39;)</span>
<span class="go">Mod(5, 10007)</span>
<span class="go">sage: pari(&#39;znprimroot(10007)&#39;)</span>
<span class="go">Mod(5, 10007)</span>
</pre></div>
</div>
<p>В первом случае отдельная копия интерпретатора GP запускается как сервер,
и строка <tt class="docutils literal"><span class="pre">'znprimroot(10007)'</span></tt> отправляется в него, вычисляется с помощью
GP, и результат записывается в переменную в GP (которая занимает пространство
в памяти процесса GP и не будет освобождена). После этого значение переменной
выводится на экран. Во втором случае отдельная программа не запускается, и строка
<tt class="docutils literal"><span class="pre">'znprimroot(10007)'</span></tt> вычисляется конкретной функцией С-библиотеки PARI.
Результат сохраняется в heap-памяти Python&#8217;а, которая освобождается после того,
как переменная перестает использоваться. У объектов разный тип:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: type(gp(&#39;znprimroot(10007)&#39;))</span>
<span class="go">&lt;class &#39;sage.interfaces.gp.GpElement&#39;&gt;</span>
<span class="go">sage: type(pari(&#39;znprimroot(10007)&#39;))</span>
<span class="go">&lt;type &#39;sage.libs.pari.gen.gen&#39;&gt;</span>
</pre></div>
</div>
<p>Так какой же способ использовать? Это зависит от того, что вы делаете.
Интерфейс GP может делать все, что может делать программа GP/PARI, запускаемая
из командной строки, потому как он запускает эту программу. Вы можете
загрузить сложную программу PARI и запустить ее. С другой стороны, интерфейс
PARI (через C-библиотеку) имеет намного больше ограничений. Во-первых, не все
функции в ней реализованы. Во-вторых, много кода, например, численное
интегрирование, не будет работать через интерфейс PARI. Интерйес PARI может
быть намного быстрее и понятнее, чем сравнению с GP.</p>
<p>(Если у интерфейса GP закончится память при вычислении данной строки, он
автоматически и без предупреждения удовит размер стека и попробует вычисление
еще раз. Поэтому ваши вычисления всегда будут произведены корректно, если вы
правильно расчитаете размер необходимой памяти. Этот удобный трюк не входит в
арсенал простого интерпретатора GP. Относительно интерфейса C-библиотеки PARI:
он сразу копирует каждый созданный объект из стека PARI, поэтому стек никогда
не растет. Однако, каждый объект не должен превышать размера в 100 мегабайт,
или стек будет переполнен при создании объекта. Дополнительное копирование
немного влияет на общую производительность.)</p>
<p>Sage использует С-библиотеку PARI, чтобы поддерживать функциональность, схожую
с интерпретатором GP/PARI, но включая различные сложные операции по работе с
памятью и язык программирования Python.</p>
<p>Сначала, создадим список PARI из списка Python.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: v = pari([1,2,3,4,5])</span>
<span class="go">sage: v</span>
<span class="go">[1, 2, 3, 4, 5]</span>
<span class="go">sage: type(v)</span>
<span class="go">&lt;type &#39;sage.libs.pari.gen.gen&#39;&gt;</span>
</pre></div>
</div>
<p>Каждый объект PARI является объектом типа <tt class="docutils literal"><span class="pre">py_pari.gen</span></tt>. Тип PARI может
быть получен с помощью функции-члена <tt class="docutils literal"><span class="pre">type</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: v.type()</span>
<span class="go">&#39;t_VEC&#39;</span>
</pre></div>
</div>
<p>В PARI, чтобы создать эллиптическую кривую, нужно ввести
<tt class="docutils literal"><span class="pre">ellinit([1,2,3,4,5])</span></tt>. В Sage способ схож, только <tt class="docutils literal"><span class="pre">ellinit</span></tt> — это метод,
который может быть вызван для любого объекта PARI, например наша <tt class="docutils literal"><span class="pre">t\_VEC</span> <span class="pre">v</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: e = v.ellinit()</span>
<span class="go">sage: e.type()</span>
<span class="go">&#39;t_VEC&#39;</span>
<span class="go">sage: pari(e)[:13]</span>
<span class="go">[1, 2, 3, 4, 5, 9, 11, 29, 35, -183, -3429, -10351, 6128487/10351]</span>
</pre></div>
</div>
<p>Теперь, когда у нас есть объект эллиптическая кривая, мы можем вычислить
что-нибудь.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: e.elltors()</span>
<span class="go">[1, [], []]</span>
<span class="go">sage: e.ellglobalred()</span>
<span class="go">[10351, [1, -1, 0, -1], 1]</span>
<span class="go">sage: f = e.ellchangecurve([1,-1,0,-1])</span>
<span class="go">sage: f[:5]</span>
<span class="go">[1, -1, 0, 4, 3]</span>
</pre></div>
</div>
</div>
<div class="section" id="gap">
<span id="section-gap"></span><h2>GAP<a class="headerlink" href="#gap" title="Ссылка на этот заголовок">¶</a></h2>
<p>Sage поставляется с GAP 4.4.10 для вычислений в области дискретной математики,
в особенности, в теории групп.</p>
<p>Вот пример функции <tt class="docutils literal"><span class="pre">IdGroup</span></tt> из GAP, которая использует базу данных небольших
групп, которая должна быть установлена отдельно, как показано ниже.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: G = gap(&#39;Group((1,2,3)(4,5), (3,4))&#39;)</span>
<span class="go">sage: G</span>
<span class="go">Group( [ (1,2,3)(4,5), (3,4) ] )</span>
<span class="go">sage: G.Center()</span>
<span class="go">Group( () )</span>
<span class="go">sage: G.IdGroup()    # optional - database_gap</span>
<span class="go">[ 120, 34 ]</span>
<span class="go">sage: G.Order()</span>
<span class="go">120</span>
</pre></div>
</div>
<p>Мы можем провести те же вычисления в Sage без прямого вызова интерфейса GAP
следующим образом:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: G = PermutationGroup([[(1,2,3),(4,5)],[(3,4)]])</span>
<span class="go">sage: G.center()</span>
<span class="go">Subgroup of (Permutation Group with generators [(3,4), (1,2,3)(4,5)]) generated by [()]</span>
<span class="go">sage: G.group_id()     # optional - database_gap</span>
<span class="go">[120, 34]</span>
<span class="go">sage: n = G.order(); n</span>
<span class="go">120</span>
</pre></div>
</div>
<p>(Для функционала GAP следует установить два дополнительных пакета Sage.
Введите <tt class="docutils literal"><span class="pre">sage</span> <span class="pre">-optional</span></tt> для списка и выберите пакет вида
<tt class="docutils literal"><span class="pre">gap\_packages-x.y.z</span></tt>, потом введите <tt class="docutils literal"><span class="pre">sage</span> <span class="pre">-i</span> <span class="pre">gap\_packages-x.y.z</span></tt>.
Сделайте то же для <tt class="docutils literal"><span class="pre">database\_gap-x.y.z</span></tt>. Некоторые не-GPL пакеты GAP
могут быть установлены скачиванием их с сайта GAP <a class="reference internal" href="bibliography.html#gapkg">[GAPkg]</a>, и распаковкой
их в директорию <tt class="docutils literal"><span class="pre">$SAGE_ROOT/local/lib/gap-4.4.10/pkg</span></tt>.)</p>
</div>
<div class="section" id="singular">
<h2>Singular<a class="headerlink" href="#singular" title="Ссылка на этот заголовок">¶</a></h2>
<p>Singular предоставляет массивную и продуманную библиотеку для базиса Грёбнера,
нахождения наибольшего общего делителя полиномов, базиса пространств плоских
кривых Римана-Роха и факторизации, наряду с другими вещами. Мы покажем пример
факторизации полиномов с несколькими переменными, используя интерфейс Singular
в Sage (не вводите <tt class="docutils literal"><span class="pre">...</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R1 = singular.ring(0, &#39;(x,y)&#39;, &#39;dp&#39;)</span>
<span class="go">sage: R1</span>
<span class="go">//   characteristic : 0</span>
<span class="go">//   number of vars : 2</span>
<span class="go">//        block   1 : ordering dp</span>
<span class="go">//                  : names    x y</span>
<span class="go">//        block   2 : ordering C</span>
<span class="go">sage: f = singular(&#39;9*y^8 - 9*x^2*y^7 - 18*x^3*y^6 - 18*x^5*y^6 + \</span>
<span class="gp">... </span>  <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">6</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">4</span> <span class="o">+</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">7</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">5</span> <span class="o">+</span> <span class="mi">36</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">8</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">4</span> <span class="o">+</span> <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">10</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">11</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> \
<span class="gp">... </span>  <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">12</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">3</span> <span class="o">-</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">13</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">16</span><span class="s">&#39;)</span>
</pre></div>
</div>
<p>Теперь когда мы определили <img class="math" src="_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/>, мы выводим на экран и факторизуем.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f</span>
<span class="go">9*x^16-18*x^13*y^2-9*x^12*y^3+9*x^10*y^4-18*x^11*y^2+36*x^8*y^4+18*x^7*y^5-18*x^5*y^6+9*x^6*y^4-18*x^3*y^6-9*x^2*y^7+9*y^8</span>
<span class="go">sage: f.parent()</span>
<span class="go">Singular</span>
<span class="go">sage: F = f.factorize(); F</span>
<span class="go">[1]:</span>
<span class="go">   _[1]=9</span>
<span class="go">   _[2]=x^6-2*x^3*y^2-x^2*y^3+y^4</span>
<span class="go">   _[3]=-x^5+y^2</span>
<span class="go">[2]:</span>
<span class="go">   1,1,2</span>
<span class="go">sage: F[1][2]</span>
<span class="go">x^6-2*x^3*y^2-x^2*y^3+y^4</span>
</pre></div>
</div>
<p>Как и на примере GAP в <a class="reference internal" href="#section-gap"><em>GAP</em></a>, мы можем совершить данную
факторизацию без прямого указания интерфейса Sage (однако за кулисами
Sage все равно используется интерфейс Singular). Не вводите <tt class="docutils literal"><span class="pre">...</span></tt>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: x, y = QQ[&#39;x, y&#39;].gens()</span>
<span class="go">sage: f = 9*y^8 - 9*x^2*y^7 - 18*x^3*y^6 - 18*x^5*y^6 + 9*x^6*y^4\</span>
<span class="gp">... </span>  <span class="o">+</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">7</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">5</span> <span class="o">+</span> <span class="mi">36</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">8</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">4</span> <span class="o">+</span> <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">10</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">11</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">12</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">3</span>\
<span class="gp">... </span>  <span class="o">-</span> <span class="mi">18</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">13</span><span class="o">*</span><span class="n">y</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">9</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">16</span>
<span class="go">sage: factor(f)</span>
<span class="go">(9) * (-x^5 + y^2)^2 * (x^6 - 2*x^3*y^2 - x^2*y^3 + y^4)</span>
</pre></div>
</div>
</div>
<div class="section" id="maxima">
<span id="section-maxima"></span><h2>Maxima<a class="headerlink" href="#maxima" title="Ссылка на этот заголовок">¶</a></h2>
<p>Maxima включена в Sage, так же как реализация Лиспа. Пакет gnuplot (который
Maxima использует по умолчанию для построения графиков) распространяется как
дополнительный пакет Sage. Кроме остальных вещей, Maxima позволяет производить
символические манипуляции. Maxima может интегрировать и дифференцировать
функции символически, решать обыкновенные дифференциальные уравнения 1го
порядка, большую часть линейных обыкновенных дифференциальных уравнений 2го
порядка, использовать преобразования Лапласа как метод для решения линейных
обыкновенных дифференциальных уравнений любого порядка. Maxima также &#8220;знает&#8221; о
большом наборе специальных функций, имеет возможность строить графики при помощи
gnuplot, имеет методы решения и манипуляции матрицами (к примеру, метод Гаусса,
нахождение собственных значений и векторов), а также умеет решать полиномы.</p>
<p>Мы проиллюстрируем работу Sage/Maxima с помощью матрицы, значения <img class="math" src="_images/math/01d9dbe8588e6243350fc642973b9365304100da.png" alt="i,j"/>
которой являются <img class="math" src="_images/math/45351a0fa13eceb200828c665ca7060a50078f16.png" alt="i/j"/>, для <img class="math" src="_images/math/5fe3b422ac63a779a923b108b943f18c64934301.png" alt="i,j=1,\ldots,4"/>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: f = maxima.eval(&#39;ij_entry[i,j] := i/j&#39;)</span>
<span class="go">sage: A = maxima(&#39;genmatrix(ij_entry,4,4)&#39;); A</span>
<span class="go">matrix([1,1/2,1/3,1/4],[2,1,2/3,1/2],[3,3/2,1,3/4],[4,2,4/3,1])</span>
<span class="go">sage: A.determinant()</span>
<span class="go">0</span>
<span class="go">sage: A.echelon()</span>
<span class="go">matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])</span>
<span class="go">sage: A.eigenvalues()</span>
<span class="go">[[0,4],[3,1]]</span>
<span class="go">sage: A.eigenvectors()</span>
<span class="go">[[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]</span>
</pre></div>
</div>
<p>Вот другой пример:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: A = maxima(&quot;matrix ([1, 0, 0], [1, -1, 0], [1, 3, -2])&quot;)</span>
<span class="go">sage: eigA = A.eigenvectors()</span>
<span class="go">sage: V = VectorSpace(QQ,3)</span>
<span class="go">sage: eigA</span>
<span class="go">[[[-2,-1,1],[1,1,1]],[[[0,0,1]],[[0,1,3]],[[1,1/2,5/6]]]]</span>
<span class="go">sage: v1 = V(sage_eval(repr(eigA[1][0][0]))); lambda1 = eigA[0][0][0]</span>
<span class="go">sage: v2 = V(sage_eval(repr(eigA[1][1][0]))); lambda2 = eigA[0][0][1]</span>
<span class="go">sage: v3 = V(sage_eval(repr(eigA[1][2][0]))); lambda3 = eigA[0][0][2]</span>

<span class="go">sage: M = MatrixSpace(QQ,3,3)</span>
<span class="go">sage: AA = M([[1,0,0],[1, - 1,0],[1,3, - 2]])</span>
<span class="go">sage: b1 = v1.base_ring()</span>
<span class="go">sage: AA*v1 == b1(lambda1)*v1</span>
<span class="go">True</span>
<span class="go">sage: b2 = v2.base_ring()</span>
<span class="go">sage: AA*v2 == b2(lambda2)*v2</span>
<span class="go">True</span>
<span class="go">sage: b3 = v3.base_ring()</span>
<span class="go">sage: AA*v3 == b3(lambda3)*v3</span>
<span class="go">True</span>
</pre></div>
</div>
<p>Наконец, мы покажем, как строить графики средствами <tt class="docutils literal"><span class="pre">openmath</span></tt>. Многие
примеры являются модифицированными примерами из руководства к Maxima.</p>
<p>2-мерные графики нескольких функций (не вводите <tt class="docutils literal"><span class="pre">...</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: maxima.plot2d(&#39;[cos(7*x),cos(23*x)^4,sin(13*x)^3]&#39;,&#39;[x,0,1]&#39;, # not tested</span>
<span class="gp">... </span>  <span class="s">&#39;[plot_format,openmath]&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>&#8220;Живой&#8221; трехмерный график, который вы можете вращать мышкой (не вводите <tt class="docutils literal"><span class="pre">...</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: maxima.plot3d (&quot;2^(-u^2 + v^2)&quot;, &quot;[u, -3, 3]&quot;, &quot;[v, -2, 2]&quot;, # not tested</span>
<span class="gp">... </span>  <span class="s">&#39;[plot_format, openmath]&#39;</span><span class="p">)</span>
<span class="go">sage: maxima.plot3d(&quot;atan(-x^2 + y^3/4)&quot;, &quot;[x, -4, 4]&quot;, &quot;[y, -4, 4]&quot;, # not tested</span>
<span class="gp">... </span>  <span class="s">&quot;[grid, 50, 50]&quot;</span><span class="p">,</span><span class="s">&#39;[plot_format, openmath]&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>Следующий график — это знаменитая Лента Мёбиуса (не вводите <tt class="docutils literal"><span class="pre">...</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: maxima.plot3d(&quot;[cos(x)*(3 + y*cos(x/2)), sin(x)*(3 + y*cos(x/2)), y*sin(x/2)]&quot;, # not tested</span>
<span class="go">....: &quot;[x, -4, 4]&quot;, &quot;[y, -4, 4]&quot;,</span>
<span class="go">....: &#39;[plot_format, openmath]&#39;)</span>
</pre></div>
</div>
<p>Следующий график — это знаменитая Бутылка Клейна (не вводите <tt class="docutils literal"><span class="pre">...</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: maxima(&quot;expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)\</span>
<span class="gp">... </span>  <span class="o">-</span> <span class="mf">10.0</span><span class="s">&quot;)</span>
<span class="go">5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0</span>
<span class="go">sage: maxima(&quot;expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)&quot;)</span>
<span class="go">-5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)</span>
<span class="go">sage: maxima(&quot;expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))&quot;)</span>
<span class="go">5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))</span>
<span class="go">sage: maxima.plot3d (&quot;[expr_1, expr_2, expr_3]&quot;, &quot;[x, -%pi, %pi]&quot;, # not tested</span>
<span class="gp">... </span>  <span class="s">&quot;[y, -%pi, %pi]&quot;</span><span class="p">,</span> <span class="s">&quot;[&#39;grid, 40, 40]&quot;</span><span class="p">,</span>
<span class="gp">... </span>  <span class="s">&#39;[plot_format, openmath]&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="index.html">Содержание</a></h3>
            <ul>
<li><a class="reference internal" href="#">Интерфейсы</a><ul>
<li><a class="reference internal" href="#gp-pari">GP/PARI</a></li>
<li><a class="reference internal" href="#gap">GAP</a></li>
<li><a class="reference internal" href="#singular">Singular</a></li>
<li><a class="reference internal" href="#maxima">Maxima</a></li>
</ul>
</li>
</ul>

            <h4>Предыдущий раздел</h4>
            <p class="topless"><a href="interactive_shell.html"
                                  title="предыдущая глава">Интерактивная оболочка</a></p>
            <h4>Следующий раздел</h4>
            <p class="topless"><a href="programming.html"
                                  title="следующая глава">Программирование</a></p>
            <h3>На этой странице</h3>
            <ul class="this-page-menu">
              <li><a href="_sources/interfaces.txt"
                     rel="nofollow">Показать исходный текст</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Быстрый поиск</h3>
              <form class="search" action="search.html" method="get">
                <input type="text" name="q" size="18" />
                <!-- The shading of the "Go" button should be consistent -->
                <!-- with the colour of the header and footer. See the file -->
                <!-- doc/common/themes/sage/theme.conf for colours used by -->
                <!-- the Sage theme. -->
                <input type="submit" style="background-color: #B8B9F6" value="Искать" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Введите слова для поиска или имя модуля, класса или функции.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Просмотр</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Словарь-указатель"
             >словарь</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >модули</a> |</li>
        <li class="right" >
          <a href="programming.html" title="Программирование"
             >следующий</a> |</li>
        <li class="right" >
          <a href="interactive_shell.html" title="Интерактивная оболочка"
             >предыдущий</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Sage Tutorial in Russian v5.9</a> &raquo;</li>
 
      </ul>
    </div>
    
    <div class="footer">
        &copy; Copyright 2005--2011, The Sage Development Team.
      При создании использован <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
    </div>
    <script type="text/javascript">
/*global jQuery, window */
/* Sphinx sidebar toggle.  Putting this code at the end of the body
 * enables the toggle for the live, static, and offline docs.  Note:
 * sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */
var jq = jQuery;  
jq(document).ready(function () {
    var bar, bod, bg, fg, key, tog, wid_old, wid_new, resize, get_state, set_state;
    bod = jq('div.bodywrapper');
    bar = jq('div.sphinxsidebar');
    tog = jq('<div class="sphinxsidebartoggle"></div>');
    
    /* Delayed resize helper.  Not perfect but good enough. */
    resize = function () {
        setTimeout(function () {
            tog.height(bod.height());
        }, 100);
    };
    jq(window).resize(function () {
        resize();
    });
    
    /* Setup and add the toggle. See Sphinx v0.5.1 default.css. */
    fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)';
    bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)';
    wid_old = '230px';
    wid_new = '5px';
    tog.css('background-color', bg)
        .css('border-width', '0px')
        .css('border-right', wid_new + ' ridge ' + bg)
        .css('cursor', 'pointer')
        .css('position', 'absolute')
        .css('left', '-' + wid_new)
        .css('top', '0px')
        .css('width', wid_new);
    bod.css('position', 'relative');
    bod.prepend(tog);
    resize();
    
    /* Cookie helpers. */
    key = 'sphinxsidebar=';
    set_state = function (s) {
        var date = new Date();
        /* Expiry in 7 days. */
        date.setTime(date.getTime() + (7 * 24 * 3600 * 1000));
        document.cookie = key + encodeURIComponent(s) + '; expires=' +
            date.toUTCString() + '; path=/';
    };
    get_state = function () {
        var i, c, crumbs = document.cookie.split(';');
        for (i = 0; i < crumbs.length; i += 1) {
            c = crumbs[i].replace(/^\s+/, '');
            if (c.indexOf(key) === 0) {
                return decodeURIComponent(c.substring(key.length, c.length));
            }
        }
        return null;
    };
    
    /* Event handlers. */
    tog.mouseover(function (ev) {
        tog.css('border-right-color', fg);
    }).mouseout(function (ev) {
        tog.css('border-right-color', bg);
    }).click(function (ev) {
        if (bod.hasClass('wide')) {
            bod.removeClass('wide');
            bod.css('margin-left', wid_old);
            bar.css('width', wid_old);
            bar.show();
            set_state('visible');
        } else {
            set_state('hidden');
            bar.hide();
            bar.css('width', '0px');
            bod.css('margin-left', wid_new);
            bod.addClass('wide');
        }
        resize();
    });
    
    /* Hide the normally visible sidebar? */
    if (get_state() === 'hidden') {
        tog.trigger('click');
    } else {
        set_state('visible');
    }
});
    </script>
  </body>
</html>