[[FrontPage]] #contents 2011/06/16からのアクセス回数 &counter; ここで紹介したSageワークシートは、以下のURLからダウンロードできます。 http://www15191ue.sakura.ne.jp:8000/home/pub/3/ また、Sageのサーバを公開しているサイト(http://www.sagenb.org/, http://www15191ue.sakura.ne.jp:8000/)にユーザIDを作成することで、ダウンロードしたワークシートを アップロードし、実行したり、変更していろいろ動きを試すことができます。 ** 数の計算・基本的な関数 [#y45f4449] *** よく使われる定数 [#t2806781] 数式でよく使われる定数をSageで使うには以下の様に表します。 sageへの入力: #pre{{ hdr=["円周率", "自然体数の底", "虚数単位", "無限大"] sts=[pi, e, I, oo] html.table([(h, st, "%s"%st) for (h, st) in zip(hdr, sts)]) }} &ref(out1.png); *** 基本的な計算 [#w3be92bb] 四則演算をはじめ、Sageで使われる基本的な計算の表現方法を以下に示します。 sageへの入力: #pre{{ # よく使われる表現 var('a b x n') hdr=["積", "商", "累乗", "平方根", "n乗根", "絶対値", "自然対数", "階乗"] sts=[a*b, a/b, a^b, sqrt(x), x^(1/n), abs(x), log(x), factorial(n)] html.table([(h, st, "%s"%st) for (h, st) in zip(hdr, sts)]) }} &ref(out2.png); 1から10までの和は55ですが、これをリストとsum関数を使って計算すると、 以下の様になります。 sageへの入力: #pre{{ # 1から10までの和を計算 print 1+2+3+4+5+6+7+8+9+10 # リスト使って計算 L = range(1,11); print L print sum(L) # リストLの和を求める }} sageの出力: #pre{{ 55 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 55 }} リスト内包を使うと簡単にリストの要素を変更することができます。 先ほどのリストLの要素を自乗に変えて、和を求めてみましょう。 #pre{{ リスト内包の書式 [ 式 for 変数 in リスト ] }} sageへの入力: #pre{{ L2 = [i^2 for i in L]; print L2 print sum(L2) }} sageの出力: #pre{{ [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 385 }} sumと並んでリストの要素の積を求めるprodもよく使われます。 1から5までの積をprodを使って計算してみましょう。 今回は、range関数の代わりにジェネレータを使って1から5までの リストを生成し、計算してみます。 #pre{{ (1..5) }} sageへの入力: #pre{{ # 1から5までの積を計算 print 1*2*3*4*5 # リスト生成をまとめて print prod(1..5) }} sageの出力: #pre{{ 120 120 }} ** 式の計算・簡単化 [#jd773f81] 次に中学で習った式の因数分解や展開もSageを使うと簡単に計算することができます。 *** 展開 [#la773368] 以下の関数f1をSageを使って展開してみます。展開にはexpand関数を使います。 $$ f1(x) = (x - 1)(x^2 -1) $$ sageへの入力: #pre{{ f1 = (x - 1)*(x^2 - 1); view(f1) # f1を定義 f2 = expand(f1); view(f2) # f1を展開し、f2に代入 }} &ref(out3.png); 多項式の係数は、coefficientsやcoeff関数で取得できます。 以下に、f2の係数をcoeeficents関数で取得する方法とxの2次の項の係数をcoeff関数で取得する方法を例として示します。 sageへの入力: #pre{{ # 多項式の係数 print f2.coefficients(x) # 変数の[係数, 次数]のペアのリストを返す print f2.coeff(x, 2) # 変数と次数を指定して係数をを返す }} sageの出力: #pre{{ [[1, 0], [-1, 1], [-1, 2], [1, 3]] -1 }} *** 因数分解 [#ra76fb24] f1を展開した結果f2を因数分解してみましょう。因数分解にはfactor関数を使用します。 結果がf1と異なりますが、 $$ (x^2 - 1) = (x - 1)(x + 1) $$ の関係から、正しい結果になっていることが分かります。 sageへの入力: #pre{{ view(factor(f2)) # f2を因数分解する }} &ref(out4.png); *** 部分分数分解 [#cdb0b63a] 分数で表される式の積分やラブラス逆変換では部分分数分解を利用することがあります。 以下の様な関数f3を因数分解して、分数式f4に変えます。 $$ f3(x) = \frac{1}{(x - 2)} + \frac{1}{(x + 2)} $$ sageへの入力: #pre{{ # 分数の因数分解 f3 = 1/(x+2)+1/(x-2); view(f3) }} &ref(out5.png); 式の部分分数分解には、prtial_fraction()メソッドを使います。f4にprtial_fractionメソッドを呼び出すとf3と同じ結果となります。 sageへの入力: #pre{{ f4 = factor(f3); view(f4) # 分数式f3の因数分解 view(f4.partial_fraction()) # 部分分数分解 }} &ref(out6.png); *** 式の整理 [#lc12be6a] 式を整理して簡単化する関数として、simplifyがあります。simplifyでは不要な項を消去するだけなので、 f1のような因数分解で整理されて式の場合には結果が変わりません。 さらに突っ込んだ整理をする場合には、simplify_fullメソッドを使います。 sageへの入力: #pre{{ view(simplify(I + x -x)) # 簡単化で不要な項を消去 view(simplify(f1)) # 簡単化ではf1はそのまま view(f1.simplify_full()) # simplify_fullメソッドを使うと展開されて整理される }} &ref(out7.png); *** 三角関数 [#t9e4d1c9] 三角関数も数式として計算するため、\( sin (\pi/4) \)も数値ではなく、 \( \frac{1}{2} \sqrt{2} \)の式が返ってきます。 値を得るには、N関数を使用します。 sageへの入力: #pre{{ print sin(pi/4), N(sin(pi/4)) }} sageの出力: #pre{{ 1/2*sqrt(2) 0.707106781186548 }} また三角関数への入力単位は度ではなく、ラジアンで指定します。 度とラジアンの変換には、以下の様な関数rad, degを定義すると便利です。 sageへの入力: #pre{{ # 度とラジアンの変換関数 rad(x) = x*pi/180 deg(x) = x*180/pi }} sageへの入力: #pre{{ print sin(rad(45)), sin(pi/4) print atan(1), deg(atan(1)) }} sageの出力: #pre{{ 1/2*sqrt(2) 1/2*sqrt(2) 1/4*pi 45 }} *** 三角関数の簡単化 [#t88e774a] 三角関数や指数関数を含む式の簡単化には simplify_fullメソッドを使います。 例として、sin関数の倍角公式をsimplify_fullメソッドで求めてみます。 sageへの入力: #pre{{ # 倍角公式 fs = sin(2*x); view(fs) view(fs.simplify_full()) }} &ref(out8.png); 更に、simplify_fullでは三角関数の公式を活用して式を整理します。 以下の例では、以下の三角関数の公式を使って簡単化しています。 $$ cos^2 x + sin^2 x = 1 $$ sageへの入力: #pre{{ f4 = cos(x)^2-sin(x)^2; view(f4) # cos(x)^2 + sin(x)^2 = 1を使って view(f4.simplify_full()) # 簡単化する }} &ref(out9.png); *** 導関数 [#b4e05186] 高校で習った、導関数をSageを使って導いてみましょう。 関数f(x)と平均変化率g(x)を以下の様に定義します。 $$ f(x) = \frac{1}{2} x^3 $$ $$ g(x)= \frac{f(x+h)−f(x)}{h} $$ 変数x, hと関数f, gをSageで定義します。 sageへの入力: #pre{{ x, h = var('x h') f(x) = x^3/2; view(f) }} &ref(out10.png); sageへの入力: #pre{{ # 平均変化率 g =(f(x + h) - f(x))/h; view(g) }} &ref(out11.png); gを展開して整理すると以下の様になり、h→0の極値(limit)をとった時、hが掛からないxの2次の項のみが残ります。 sageへの入力: #pre{{ # 展開して整理すると g1 = g.simplify_full(); view(g1) }} &ref(out12.png); 求める導関数は、以下の様になります。 sageへの入力: #pre{{ # h→0の極値を取ると導関数が求まる g2 = limit(g1, h=0); view(g2) }} &ref(out13.png); *** 特殊な関数のリミット [#y4734f7b] 次のような特殊な関数fを考えます。 $$ f(x) = \frac{sin(x)}{x} $$ この関数にx=0を代入するとゼロ割のエラーとなりますが、limitを使ってx→0を求めると1となります。 Sageではグラフの表示でも極値をきちんと計算しているので、上記のf(x)もきちんと表示することができます。 sageへの入力: #pre{{ # 特殊な関数のリミット f = sin(x)/x print f(x=0) }} sageの出力: #pre{{ Traceback (most recent call last): ... File "expression.pyx", line 3503, in sage.symbolic.expression.Expression.substitute (sage/symbolic/expression.cpp:15547) RuntimeError: power::eval(): division by zero }} sageへの入力: #pre{{ limit(f, x=0) }} sageの出力: #pre{{ 1 }} sageへの入力: #pre{{ plot(f, [x, -10, 10]) }} &ref(out14.png); *** 関係式 [#d5e6cf32] Sageでの関係式の扱い方を以下の関係式eqを例に示します。 $$ x + 2 \le 0 $$ これをSageで表現すると以下の様になります。 sageへの入力: #pre{{ eq = x + 2 <= 0 }} 関係式から左辺、等号、不等号のオペレータ、左辺を取得するには、それぞれlhs, operator, rhs関数を使用します。 sageへの入力: #pre{{ print eq.lhs() # 左辺 print eq.operator() # 等号、不等号などのオペレータ print eq.rhs() # 右辺 }} sageの出力: #pre{{ x + 2 <built-in function le> 0 }} ** コメント [#l8cd78a3] #vote(おもしろかった[12],そうでもない[0],わかりずらい[3]) #vote(おもしろかった[13],そうでもない[0],わかりずらい[3]) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha