#!/usr/bin/env python
# coding: utf-8
#
# Hiroshi TAKEMOTO
# (take.pwave@gmail.com)
#
# # Sageを使ってみよう
# ## ブラウザーで使える数式処理システムSage
# Sageの最大の特徴は、 FirefoxやInternet Explorer等のブラウザーからSage Notebook Serverにアクセスして、 気軽に数式処理を楽しむことが出来ることです。
#
# ノートブックは、Sageでの一連の計算を記録したノートであり、計算に関する説明文を挿入したり、 値を変更して再計算することができます。
# ## 新規ノートブックの作成
# 新規にノートブックを作成するには、「Files」タグの右端にある「New」プルダウンメニューから「SageMath 7.2」を選択します。
#
# ![New Button](images/New_Menu.png)
# ## セルを評価してみよう
# In[ ]: と表示されている入力用セルに式を入力して、その値を評価してみましょう。
#
# 以下の2行を入力して、シフトキーを押さえながらリターンキーを押してください(以下shift-returnと表します)。または既に入力されているIn [n]のセルの式をクリックして選択した後、shift-returnを押します。
#
# 5/6と数値ではなく、分数で返ってくるところが数式システムならではの芸当です。
# In[1]:
a = 1/2 + 1/3
a
# 複雑な数式を入力すると、テキストベースの結果では分かりづらいです。そんな時には、show関数を使って表示すると数式がきれいに表示されます。
# In[2]:
show(a)
# ## 多項式
# 中学の数学に出てきた多項式をSageで処理してみましょう。
#
# 以下の様な3次多項式を持つ関数$f(x)$をSageで定義します。
# $$
# f(x) = x^3 - x^2 - 2x
# $$
#
# 最初に変数xをvar関数で定義します。次に上記の多項式を変数fにセットします。
# In[3]:
x = var('x')
f(x) = x^3 - x^2 - 2*x
show(f(x))
# 多項式の因数分解には、factor関数を使います。
#
# 因数分解の結果から、関数fはx=-1, x=0, x=2でX軸と交わります。
# In[4]:
factor(f)
# ## 多項式のグラフ
# 先ほどの3次多項式$f(x)$をプロットして、X軸と交差する位置を確認してみましょう。
#
# plot関数には、表示したい関数とその範囲を指定します。ここではx=-2.5からx=2.5の範囲を指定します。
#
# Sageの図化機能を使うことで簡単に$f(x)$の特徴を理解することができます。
#
# 一番最初は、以下の様なワーニングがでますが、2回目以降はでません。
# ```
# /usr/lib/sagemath/local/lib/python2.7/site-packages/matplotlib-1.5.1-py2.7-linux-x86_64.egg/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
# warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
# ```
# In[5]:
plot(f, [x, -2.5, 2.5], figsize=5)
# ## 関数の極
# 3次多項式$f(x)$の極は、関数の接線の傾きが0(傾きがX軸と平行)の場所です。 関数の極を求めるには$f(x)$を微分し、その値が0となるxを求めます。
#
# 関数の微分には、diff関数を使います。diff関数には、微分したい関数とその変数を引数とします。
# In[6]:
df(x) = diff(f, x)
show(df(x))
# ## 関数の解
# 関数solverは関数が0となる変数の値を求めます。solverの引数は、解を求めたい関数とその変数を指定します。
#
# 関数fとそれを微分した関数dfのグラフを比べると関数dfがX軸と交わる点で、 関数fの接線の傾きが0となっていることが見て取れます。
# In[7]:
sol = solve(df, x)
show(sol)
plot(df, [x, -2.5, 2.5], figsize=5)
# ## 数値解
# Sageは数式処理システムなので、関数solverの結果が数式で返ってきます。 数値解が欲しい場合にはfind_root関数を使います。
#
# このようにSageを使って関数fをプロットしたり、解を求めることによって関数fの理解を深めることができます。
# In[8]:
print( find_root(df, -2, 0), find_root(df, 0, 2) )
# In[ ]: