{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\tHiroshi TAKEMOTO\n", "\t(take.pwave@gmail.com)\n", "\t

数の計算・基本的な関数

\n", "\n", "\n", "\n", "

準備

\n", "

\n", " jupyterでhtml.tableを使うと以前のようにcssが有効にならないので、table関連のCSSを最初に読み込みます。\n", "

\n", "

\n", " また、jupyterのノートブックでもSageのノートブック同様に使えるようにsage_util.pyを読み込みます。\n", "

\n", "" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%HTML\n", "" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# ユーティリティ\n", "load('script/sage_util.py')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

よく使われる定数

\n", "\t

\n", "\t\t数式でよく使われる定数をSageで使うには以下の様に表します。\n", "\t

\n", "

\n", " 注意)無限大は、oを2個並べたooです。\n", "

\n", "" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
円周率$\\pi$pi
自然体数の底$e$e
虚数単位$i$I
無限大$+\\infty$+Infinity
" ], "text/plain": [ "<__main__.Table2Html instance at 0x7f9277ed0098>" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# jupyter用のdisplayメソッド\n", "hdr=[\"円周率\", \"自然体数の底\", \"虚数単位\", \"無限大\"]\n", "sts=[pi, e, I, oo]\n", "# sage_util.pyのTable2Htmlを使用\n", "Table2Html([(h, \"$%s$\"%latex(st), str(st)) for (h, st) in zip(hdr, sts)])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "\n", "\t

基本的な計算

\n", "\t

\n", "\t\t四則演算をはじめ、Sageで使われる基本的な計算の表現方法を以下に示します。\n", "\t

\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
$a b$a*b
$\\frac{a}{b}$a/b
累乗$a^{b}$a^b
平方根$\\sqrt{x}$sqrt(x)
n乗根$x^{\\left(\\frac{1}{n}\\right)}$x^(1/n)
絶対値${\\left| x \\right|}$abs(x)
自然対数$\\log\\left(x\\right)$log(x)
階乗$n!$factorial(n)
" ], "text/plain": [ "<__main__.Table2Html instance at 0x7f927768ecf8>" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# よく使われる表現\n", "var('a b x n')\n", "hdr=[\"積\", \"商\", \"累乗\", \"平方根\", \"n乗根\", \"絶対値\", \"自然対数\", \"階乗\"]\n", "sts=[a*b, a/b, a^b, sqrt(x), x^(1/n), abs(x), log(x), factorial(n)]\n", "Table2Html([(h, \"$%s$\"%latex(st), str(st)) for (h, st) in zip(hdr, sts)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1から10までの和は55ですが、これをリストとsum関数を使って計算すると、 以下の様になります。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "55\n", "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "55\n" ] } ], "source": [ "# 1から10までの和を計算\n", "print( 1+2+3+4+5+6+7+8+9+10 )\n", "# リスト使って計算\n", "L = range(1,11); print L \n", "print sum(L) # リストLの和を求める " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\tリスト内包を使うと簡単にリストの要素を変更することができます。\n", "\t\t先ほどのリストLの要素を自乗に変えて、和を求めてみましょう。\n", "

\n",
    "\tリスト内包の書式\n",
    "\t[ 式 for 変数 in リスト ]\n",
    "
\n", "\t

\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\n", "385\n" ] } ], "source": [ "L2 = [i^2 for i in L]; print L2 \n", "print sum(L2) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\tsumと並んでリストの要素の積を求めるprodもよく使われます。\n", "\t\t1から5までの積をprodを使って計算してみましょう。\n", "\t

\n", "\t

\n", "\t\t今回は、range関数の代わりにジェネレータを使って1から5までの\n", "\t\tリストを生成し、計算してみます。\n", "

\n",
    "\t(1..5)\n",
    "
\n", "\t\t\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "120\n", "120\n" ] } ], "source": [ "# 1から5までの積を計算\n", "print 1*2*3*4*5 \n", "# リスト生成をまとめて\n", "print prod(1..5) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

式の計算・簡素化

\n", "\t

\n", "\t\t次に中学で習った式の因数分解や展開もSageを使うと簡単に計算することができます。\n", "\t

\n", "\n", "\n", "\n", "\t

展開

\n", "\t

\n", "\t\t以下の関数f1をSageを使って展開してみます。展開にはexpand関数を使います。\n", "$$\n", "\t\tf1(x) = (x - 1)(x^2 -1)\n", "$$\t\t\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x^2 - 1)*(x - 1)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "x^3 - x^2 - x + 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f1 = (x - 1)*(x^2 - 1); show(f1) # f1を定義\n", "f2 = expand(f1); show(f2) # f1を展開し、f2に代入" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\t多項式の係数は、coefficientsやcoefficient関数で取得できます。\n", "\t

\n", "\t

\n", "\t\t以下に、f2の係数をcoeeficents関数で取得する方法とxの2次の項の係数をcoefficient関数で取得する方法を例として示します。\n", "\t

\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1, 0], [-1, 1], [-1, 2], [1, 3]]\n", "-1\n" ] } ], "source": [ "# 多項式の係数\n", "print f2.coefficients(x) # 変数の[係数, 次数]のペアのリストを返す\n", "print f2.coefficient(x, 2) # 変数と次数を指定して係数をを返す" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

因数分解

\n", "\t

\n", "\t\tf1を展開した結果f2を因数分解してみましょう。因数分解にはfactor関数を使用します。\n", "\t

\n", "\t

\n", "\t\t結果がf1と異なりますが、\n", "$$\n", "\t\t(x^2 - 1) = (x - 1)(x + 1)\n", "$$\t\t\n", "\t\tの関係から、正しい結果になっていることが分かります。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x + 1)*(x - 1)^2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(factor(f2)) # f2を因数分解する" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

部分分数分解

\n", "\t

\n", "\t\t分数で表される式の積分やラブラス逆変換では部分分数分解を利用することがあります。\n", "\t

\n", "\t

\n", "\t\t以下の様な関数f3を因数分解して、分数式f4に変えます。\n", "$$\n", "\t\tf3(x) = \\frac{1}{(x - 2)} + \\frac{1}{(x + 2)}\n", "$$\t\t\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1/(x + 2) + 1/(x - 2)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 分数の因数分解\n", "f3 = 1/(x+2)+1/(x-2)\n", "show(f3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\t式の部分分数分解には、prtial_fraction()メソッドを使います。f4にprtial_fractionメソッドを呼び出すとf3と同じ結果となります。\n", "\t

\n", "\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "2*x/((x + 2)*(x - 2))" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "1/(x + 2) + 1/(x - 2)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f4 = factor(f3); show(f4) # 分数式f3の因数分解\n", "show(f4.partial_fraction()) # 部分分数分解" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

式の整理

\n", "\t

\n", "\t\t式を整理して簡単化する関数として、simplifyがあります。simplifyでは不要な項を消去するだけなので、\n", "\t\tf1のような因数分解で整理されて式の場合には結果が変わりません。\n", "\t

\n", "\t

\n", "\t\tさらに突っ込んだ整理をする場合には、simplify_fullメソッドを使います。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "I" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "(x^2 - 1)*(x - 1)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "x^3 - x^2 - x + 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(simplify(I + x -x)) # 簡単化で不要な項を消去\n", "show(simplify(f1)) # 簡単化ではf1はそのまま\n", "show(f1.simplify_full()) # simplify_fullメソッドを使うと展開されて整理される " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

三角関数

\n", "\t

\n", "\t\t三角関数も数式として計算するため、$ sin (\\pi/4) $も数値ではなく、\n", "\t\t$ \\frac{1}{2} \\sqrt{2} $の式が返ってきます。\n", "\t

\n", "\t

\n", "\t\t値を得るには、N関数を使用します。\n", "\t

\n", "\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1/2*sqrt(2) 0.707106781186548\n" ] } ], "source": [ "print sin(pi/4), N(sin(pi/4)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\tまた三角関数への入力単位は度ではなく、ラジアンで指定します。\n", "\t

\n", "\t

\n", "\t\t度とラジアンの変換には、以下の様な関数rad, degを定義すると便利です。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 度とラジアンの変換関数\n", "rad(x) = x*pi/180\n", "deg(x) = x*180/pi" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1/2*sqrt(2) 1/2*sqrt(2)\n", "1/4*pi 45\n" ] } ], "source": [ "print sin(rad(45)), sin(pi/4)\n", "print atan(1), deg(atan(1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

三角関数の簡単化

\n", "\t

\n", "\t\t三角関数や指数関数を含む式の簡単化には simplify_fullメソッドを使います。\n", "\t

\n", "\t

\n", "\t\t例として、sin関数の倍角公式をsimplify_fullメソッドで求めてみます。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "sin(2*x)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "2*cos(x)*sin(x)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 倍角公式\n", "fs = sin(2*x)\n", "show(fs)\n", "show(fs.simplify_full())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\t更に、simplify_fullでは三角関数の公式を活用して式を整理します。\n", "\t

\n", "\t

\n", "\t\t以下の例では、以下の三角関数の公式を使って簡単化しています。\n", "$$\n", "\t\tcos^2 x + sin^2 x = 1\n", "$$\t\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "cos(x)^2 - sin(x)^2" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "2*cos(x)^2 - 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f4 = cos(x)^2-sin(x)^2\n", "show(f4) # cos(x)^2 + sin(x)^2 = 1を使って\n", "show(f4.simplify_full()) # 簡素化する" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

導関数

\n", "\t

\n", "\t\t高校で習った、導関数をSageを使って導いてみましょう。\n", "\t\t関数f(x)と平均変化率g(x)を以下の様に定義します。\n", "$$\n", "\t\tf(x) = \\frac{1}{2} x^3\n", "$$\n", "$$\n", "\t\tg(x)= \\frac{f(x+h)−f(x)}{h}\n", "$$\n", "\t

\n", "\t

\n", "\t\t変数x, hと関数f, gをSageで定義します。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x |--> 1/2*x^3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x, h = var('x h')\n", "f(x) = x^3/2\n", "show(f)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1/2*((h + x)^3 - x^3)/h" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 平均変化率\n", "g =(f(x + h) - f(x))/h\n", "show(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\tgを展開して整理すると以下の様になり、h→0の極値(limit)をとった時、hが掛からないxの2次の項のみが残ります。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1/2*h^2 + 3/2*h*x + 3/2*x^2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 展開して整理すると\n", "g1 = g.simplify_full()\n", "show(g1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\t求める導関数は、以下の様になります。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3/2*x^2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# h→0の極値を取ると導関数が求まる\n", "g2 = limit(g1, h=0)\n", "show(g2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

特殊な関数のリミット

\n", "\t

\n", "\t\t次のような特殊な関数fを考えます。\n", "$$\n", "\t\tf(x) = \\frac{sin(x)}{x}\n", "$$\t\t\n", "\t

\n", "\t

\n", "\t\tこの関数にx=0を代入するとゼロ割のエラーとなりますが、limitを使ってx→0を求めると1となります。\n", "\t

\n", "\t

\n", "\t\tSageではグラフの表示でも極値をきちんと計算しているので、上記のf(x)もきちんと表示することができます。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ValueError", "evalue": "power::eval(): division by zero", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 特殊な関数のリミット\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mprint\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mInteger\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m/usr/lib/sagemath/src/sage/symbolic/expression.pyx\u001b[0m in \u001b[0;36msage.symbolic.expression.Expression.__call__ (/usr/lib/sagemath//src/build/cythonized/sage/symbolic/expression.cpp:28301)\u001b[1;34m()\u001b[0m\n\u001b[0;32m 4974\u001b[0m \u001b[0mz\u001b[0m\u001b[1;33m^\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m^\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4975\u001b[0m \"\"\"\n\u001b[1;32m-> 4976\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call_element_\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4977\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4978\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mvariables\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/sagemath/src/sage/symbolic/ring.pyx\u001b[0m in \u001b[0;36msage.symbolic.ring.SymbolicRing._call_element_ (/usr/lib/sagemath//src/build/cythonized/sage/symbolic/ring.cpp:10250)\u001b[1;34m()\u001b[0m\n\u001b[0;32m 867\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"the number of arguments must be less than or equal to %s\"\u001b[0m\u001b[1;33m%\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvars\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 868\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 869\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_the_element\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 870\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 871\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0msubring\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/sagemath/src/sage/symbolic/expression.pyx\u001b[0m in \u001b[0;36msage.symbolic.expression.Expression.substitute (/usr/lib/sagemath//src/build/cythonized/sage/symbolic/expression.cpp:27844)\u001b[1;34m()\u001b[0m\n\u001b[0;32m 4883\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4884\u001b[0m return new_Expression_from_GEx(self._parent,\n\u001b[1;32m-> 4885\u001b[1;33m self._gobj.subs_map(smap, 0))\n\u001b[0m\u001b[0;32m 4886\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4887\u001b[0m \u001b[0msubs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msubstitute\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: power::eval(): division by zero" ] } ], "source": [ "# 特殊な関数のリミット\n", "f = sin(x)/x\n", "print f(x=0)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit(f, x=0) " ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(f, [x, -10, 10], figsize=5) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

関係式

\n", "\t

\n", "\t\tSageでの関係式の扱い方を以下の関係式eqを例に示します。\n", "$$\n", "\t\tx + 2 \\le 0\n", "$$\n", "\t

\n", "\t

\n", "\t\tこれをSageで表現すると以下の様になります。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "eq = x + 2 <= 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\t

\n", "\t\t関係式から左辺、等号、不等号のオペレータ、左辺を取得するには、それぞれlhs, operator, rhs関数を使用します。\n", "\t

\n", "" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x + 2\n", "\n", "0\n" ] } ], "source": [ "print eq.lhs() # 左辺\n", "print eq.operator() # 等号、不等号などのオペレータ\n", "print eq.rhs() # 右辺" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 7.2", "language": "", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }