fc2ブログ
FC2 Analyzer
     数式処理ソフトなんか使ったらダメ人間になると心配の(親・教師は放っておけ)よい子におくる。

     昔々、Mathematicaという数式処理ソフトを教えてくれた人がこんなこと言った。
     「コンピュータを使って、今まで10の労力が必要だったことが3の労力で済むのだとしたら結構な話だろう。Mathematicaがもたらすのも、それと同じことだけれど少し違う。これまで1000の労力が必要だったことが300程度で何とか可能になって、一生を棒に振る範囲で済みそうになる。自分の分野の先達たちが目標にすること自体をあきらめてきたものが、バトンの形になって手渡される。Mathematicaを使うというのは、そういうことなんだ」


    数式処理ソフトは計算できない子を作るか?

     数式処理ソフトは微積分もできれば、方程式も解けるし、グラフも描ける。 
     「解を求めよ」みたいな問題はだいたい解けるから、今でも
    「そんなものを生徒・学生に与えたら、宿題・課題をみんなコンピュータに任せてしまって自分でやらなくなる→計算できなくなる→ヘタレ文系になる→国が滅ぶ」
    というようなことを心配する人がいる。

     楽ができるツール(というかあらゆるツールは楽をするためにあるのだが)の登場が人間を駄目にするというのは、古くからある教説である。
     情報技術に限っても、すでに《文字の発明がいかに人をダメにするか》といったことを紀元前4世紀にはプラトンが『パイドロス』に書いている。
     文字のせいで(本を読むことで、と置き換えてもいいだろう)、記憶力が悪くなるばかりか、知ったかぶりで付き合いにくい人間になるというのだ。
     モンテーニュもまた、これと似たような人間ができるとして、学校を批判している。スポーツでもさせた方がましだと言う。

     しかし、辞書もまた楽をするための情報技術だけれど(辞書なしには、文意を推測するために、数多のテクストを突き合わせて膨大な作業を行わなくてはならないだろう。辞書のない/頼りにできない領域では、今でもこうしたことが行われている)、数式処理ソフトほど目の敵にされてはいない。
     「人間は楽をしたがる生き物だ。辞書を使って楽することを覚えたら,そいつは辞書なしに何も読めなくなるから,少なくとも若い人たちは辞書を使うべきではない」という人は少ない。
     それどころか辞書を使うことを奨励する人たちが多い。
     辞書を使うことで、より正確に言えば辞書を使って楽をすることで、自分の現在のボキャブラリーを越えるもの=辞書なしでは読めないような書物へも、人は背伸びして喰らいつくことができる。つまり辞書が下駄を履かせた分、その人にとって外国語が開く世界は広がる。
     数式処理ソフトについても、これと同じことは言えないだろうか? 

     「辞書と数式処理ソフトでは話が違う。アウトプットの完成品度合いが違う。辞書は単語の意味や用法を教えてくれるが外国語を翻訳してくれる訳ではない。しかし数式処理ソフトは、方程式を解き、微分積分を代わりにやってくれて、そのまま答えを出してくれるではないか?」という反論があるかもしれない。

     しかし数式処理ソフトに丸投げできるのは、「この方程式を解け」「微分しろ」といった学校(とテスト)の内でしか成立しない、与えられた練習問題だけである。
     外では、どんな計算をすればいいか、いちいち指示が与えられることはほとんどない(だから、多くの人は学校を出ると数学をやらなくなる)。

     外国語の本を読み解くことを辞書に丸投げすることは不可能だ。それと同様に、世界を読み解くことを数式処理ソフトに丸投げすることだってできない。
     数式処理ソフトは方程式の解を見つけたりグラフを描いたりして、人間が数理モデルを扱う手助けはしてくれる。
     例えるなら、泳いで渡るかわりに、船に乗って行くようなものだ。はだしで道を行くものにとっての靴のようなものだ。
     どこへどんな順序で進むかは、つまりどんな式を立ててどんな計算をするかは、あなたが決めなくてはならない。

     数式処理ソフトへの懸念は、勉強をさせる/させられるという関係性においてのみ、問題になる。
     
     独学者には数式処理ソフトは(辞書がそうであるように)マスト・アイテムと言っていい。
     
     数理系のものを学ぶ場合、数式処理ソフトには、次のようなの使い道がある。


    1.解答のついてない問題の答え合わせ

     数式処理ソフトから、そのまま解答に使える出力がでてくることは、害ばかりではない。
     自分で数式を入力して答えを得ることは、解答を見ることと同じようだが随分違う。
     入力そして入力ミスが即座に/インタラクティブに結果に反映するからだ。
     ノートの上で書き間違えても、ノートは何も言ってくれないが、数式処理ソフトは何か返してくる。入力ミスは即座に気づく。
     また「解答のない問題」には、自分が立てた問題が含まれる。数式処理システムは、オリジナルな問いをもって世界のなかを前に進む助けに、杖になる。


    2.すべての式を数式処理ソフトの上で展開する

     数理系の本を読む場合は、登場する数式の展開をすべて/可能な限り追計算する。
     ノートに手計算がベストだが、数式の扱う力や時間が足りないなら、数式処理ソフトをノートかわりに使って行うことで、オール・オア・ナッシングの愚を避ける事ができる。
     また、こうすることで「面倒くさいから数式を読み飛ばしてしまう」という怠惰を避ける。
     必要なら、いくつか数値例を当てはめて計算してみたり、グラフを描かせることは、理解を助けてくれる。


    3.数式処理ソフトの上で手作業

     数式処理ソフトは何でも解けるような前提で話を進めたけれど、実はそうでもない。
     微分方程式なんか(そもそも解析的に解ける方が少ないのだけれど)丸投げでちゃんとした答えが得られるのは簡単なものに限られる。
     それでも適当に変数転換すれば、解ける範囲はぐんと増える。
     実のところ、数式処理ソフトに丸投げしてできることなど知れている。
     分かりきったことは任せて、手作業と思考の負担を軽減するのが本来の使い方である。そんな風に使うことで、数式処理ソフトはプロにとっても使いでのある道具になる。
     数式処理ソフトに丸投げできることでも、一部分は任せながら手作業でやってみることもオススメだ。
     たとえば教科書とおりの解法を数式処理ソフトの上でやってみることは、教科書の内容を理解できるし、数式処理ソフトの使い道をマスターするよい方法でもある。
     

    4.試行錯誤とモデル・スペキュレーションの援助

     人は外界に働きかけて、そのフィードバックを得ることを通じても、思考する。いや複雑な思考の多くはそうして行われるといっていい。
     数学的なことで「このような場合はどうなるか?」という疑問を抱いたとしても,その疑問の解決には多くの困難な計算をしなければならないとなると、我々の思考はそこで頓挫してしまう。
     しかし,困難な単純(?)計算を数式処理ソフトにまかせれば、自分の思考をどんどん推し進めることが可能になる。
     めんどくさい試行錯誤やコンピュータ上の実験も手軽にできる。
     先に述べたが、自分が立てた問題には、解答集はない。数式処理システムは前に進むのを助ける杖になる。
     


    (おまけ)Maximaのリソース

     記事のタイトルにMaximaと入れてしまったが、中身はMaximaに限らず、数式処理ソフトすべてに当てはまる。
     ただ無料で手に入って、すぐに使えて、ネット上に参考情報も多いとくれば、Maximaが第一推薦になると思う。
     
     Maximaは、FreeBSD、Linux、Windows、 Mac OS X などで動くが、
     導入、インストールについては、http://www.cymric.jp/maxima/top.htmlを参考。
     Windowsユーザーは、公式サイトhttp://maxima.sourceforge.net/からWindows 用バイナリは入手できるが、不慣れな人がつまずきそうなところをhttp://www.cymric.jp/maxima/maxima-winxp.htmlがフォローしているので、うまくいかないときは一読を。
     Mac OS X ユーザーには、http://www.muskmelon.jp/macosx/index.htmlにダウンロードしてすぐ使えるバイナリが置いてある。
     
     使い方については、以下が手始めに。
     Maxima による数式処理 http://cosmo.phys.hirosaki-u.ac.jp/wiki.cgi/maxima?page=FrontPage

     数式処理ソフトMaxima(イムジン” のページ‎ >) https://sites.google.com/site/seijiimura/home/suushiki-shori-sofuto-maxima

     教科書の例題をMaximaで解く!(高校生のための Maxima) http://www.max.hi-ho.ne.jp/shizuka/maxima/Maxima1.html
     

    他にも参考になるサイトは沢山あるが日本語では、
     Professional Maxima http://www.muskmelon.jp/maxima/

     Maximaでつづる数学の旅 http://d.hatena.ne.jp/jurupapa/ 

     読み書きプログラミング ブログ(Mathematica―理工系ツールとしての (アジソン ウェスレイ・トッパン情報科学シリーズ)のコードをMaximaに翻訳) http://d.hatena.ne.jp/nextliteracy/archive?word=%2A%5BCrandall%5D

    そして最後に
     Maxima マニュアル(正式マニュアル「Maxima Reference Manual」の日本語訳) http://maxima.sourceforge.jp/maxima.html
     


    (関連記事)
    オープンソースソフトウェアで、一生使える「自前」の環境を 読書猿Classic: between / beyond readers オープンソースソフトウェアで、一生使える「自前」の環境を 読書猿Classic: between / beyond readers このエントリーをはてなブックマークに追加

    Mathematica,Maxima,Spacetimeの関数対照表 読書猿Classic: between / beyond readers Mathematica,Maxima,Spacetimeの関数対照表 読書猿Classic: between / beyond readers このエントリーをはてなブックマークに追加




    はじめてのMaxima (I・O BOOKS)はじめてのMaxima (I・O BOOKS)
    (2006/09)
    横田 博史

    商品詳細を見る


    はじめての数式処理ソフト CD-ROM付 (ブルーバックス)はじめての数式処理ソフト CD-ROM付 (ブルーバックス)
    (2007/07/20)
    竹内 薫

    商品詳細を見る


    Maximaで学ぶ微分積分―フリーの「数式処理ソフト」を使って効率的に学習 (I・O BOOKS)Maximaで学ぶ微分積分―フリーの「数式処理ソフト」を使って効率的に学習 (I・O BOOKS)
    (2011/04)
    赤間 世紀

    商品詳細を見る


    Maximaで学ぶコンピュータ代数 (I・O BOOKS)Maximaで学ぶコンピュータ代数 (I・O BOOKS)
    (2010/05)
    赤間 世紀

    商品詳細を見る


    Maximaで学ぶ線形代数―「ベクトル」「行列」の基礎から「線形空間」「固有値」まで (I・O BOOKS)Maximaで学ぶ線形代数―「ベクトル」「行列」の基礎から「線形空間」「固有値」まで (I・O BOOKS)
    (2011/05)
    赤間 世紀

    商品詳細を見る



    教室に電卓を! (1980年)教室に電卓を! (1980年)
    (1980/10)
    一松 信

    商品詳細を見る


    グラフ電卓を数学に―活用の意義と教材集 (Technology in Education)グラフ電卓を数学に―活用の意義と教材集 (Technology in Education)
    (1995/08)
    不明

    商品詳細を見る

    ・数式処理システムの中で多分一番有名なMathematica
    ・無料で利用できる数式処理システムでは一番知られたMaxima
    ・iPhone/iPod touchで使える数式処理システムMathStuio(元Spacetime)
    の3つについて、同機能の関数等を対照表にまとめてみた。


    MathematicaとMaximaについては、オンライン上のリソースや出版物がいろいろ出ているので、 それらを参考にMathStuio(元Spacetime)を活用するのに役立つかもしれない。


    MathStudio App
    カテゴリ: 教育
    価格: ¥1,700




    A.1 演算と数値
    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a+ba+b;a+b
    a-ba-b;a-b
    a*ba*b;a*b
    a/ba/b;a/b
    a^ba^b;a^b
    Sqrt[a]sqrt(a);sqrt(a)
    N[a]float(a);なし
    N[a,b]fpprec:n; または bfloat(a);なし

    A.2 代数
    A.2.1 方程式を解く

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Solve[f[x]==g[x],x]solve(f(x)=g(x),x);Solve(f(x))
    Solve[{f==g,h==k},{x,y}]solve([f=g,h=k],[x,y]);Solve(f(x),g(y))または
    SolveSystem(f(x),g(y))
    NSolve[f==g,x]expand(float(solve(f=g,x)));Solve(f(x),g(y))
    FindRoot[f(x)==g(x),{x,a}]load(newton);
    newton(f(x)-g(x),x,a);
    nSolve(f(x), x, guess)
    またはSolve(f(x), x, guess)

    A.2.2 多項式の操作

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Expand[f[x]]expand(f(x));Expand(f(x))
    Factor[f[x]]factor(f(x));Factor(f(x))
    Together[f[x]]ratsimp(f(x));Together(f(x))
    Apart[f[x]]partfrac(f(x));Apart(f(x))
    Cancel[f[x]]ratsimp(f(x));SimplifyPoly(f(x))

    A.2.3 式の簡約化

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Simplify[f[x]]ratsimp(f(x));SimplifyFunction(f(x),x)
    FullSimplify[f[x]]fullratsimp(f(x));なし

    A.2.4 複素数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a+b*Ia+b*%i;a+bi
    Re[z]realpart(z);Re(z)
    Im[z]imagpart(z);Im(z)
    Abs[z]cabs(z);Abs(z)
    Arg[z]carg(z);Arg(z)
    Conjugate[z]realpart(z)-imagpart(z)*%i;Conj(z)

    A.3 リストと行列

    A.3.1 リストや行列の作成

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    {a,b,c}[a,b,c];[a,b,c]
    {{a,b},{c,d}}リスト:[[a,b],[c,d]];
    行列:matrix([a,b],[c,d]);
    [[a,b],[c,d]]
    リストモードに
    Command(MatrixDetection=0)
    行列モードに
    Command(MatrixDetection=1)
    Table[a[i],{i,p,q}]makelist(a(i),i,p,q);Sequence(f(x), x, start, end, step,)
    Table[a[i],{i,p,q,r}]makelist(a(p+(q-p)*r),i,1,(q-p)/r);なし

    A.3.2 行列の演算

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a.ba.b;Dot(a,b)
    Cross[a,b]transpose(adjoint(matrix(a,b,[1,1,1])))[3];Cross(a,b)
    Outer[f,a,b]outermap(f,a,b);
    Tr[a]load(nchrpl);
    mattrace(a);
    Det[a]determinant(a);Det(a)
    CoFactor[a]adjoint(a);coFactor(a)
    Inverse[a]invert(a);Inverse(a)
    Transpose[a]transpose(a);Transpose(a)
    Eigenvalues[a]load(eigen);
    eigenvalues(a);
    Eigenvalues(a)
    Eigenvectors[a]load(eigen);
    eigenvectors(a);
    Eigenvectors(a)

    A.4 三角関数と指数関数

    A.4.1 三角関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Sin[x]sin(x);Sin(x)
    Cos[x]cos(x);Cos(x)
    Tan[x]tan(x);Tan(x)
    ArcSin[x]asin(x);Asin(x)
    ArcCos[x]acos(x);Acos(x)
    ArcTan[x]atan(x);Atan(x)
    TrigExpand[f[x]]trigexpand(f(x));TrigExpand(f(x))
    TrigReduce[f[x]]trigreduce(f(x));TrigReduce(f(x))

    A.4.2 指数と対数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Log[x]log(x);Ln(x)
    Log[10,x]log(x)/log(10);Log(x)
    Exp[x]exp(x);Exp(x)

    A.4.3 双曲線関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Sinh[x]sinh(x);Sinh(x)
    Cosh[x]cosh(x);Cosh(x)
    Tanh[x]tanh(x);Tanh(x)
    ArcSinh[x]asinh(x);Asinh(x)
    ArcCosh[x]acosh(x);Acosh(x)
    ArcTanh[x]atanh(x);Atanh(x)

    A.5 微分積分 A.5.1 通常の演算

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    D[f[x],x]diff(f(x),x);D(f(x),x)
    Integrate[f[x],x]integrate(f(x),x);Integrate(f(x),x)
    Integrate[f[x],{x,a,b}]integrate(f(x),x,a,b);Integrate(f(x),x,a,b)
    Sum[x[k],{k,a,b}]sum(x(k),k,a,b);Sum(x(k),k,a,b)
    Product[x[k],{k,a,b}]product(x(k),k,a,b);Product(x(k),k,a,b)
    Limit[f[x],x->a]limit(f(x),x,a);Limit(f(x),x,a)
    Series[f[x],{x,a,n}]taylor(f(x),x,a,n);Taylor(f(x),x,n,a)または
    Series(f(x),x,n,a);

    A.5.2 微分方程式

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    DSolve[f[y[x]]==0,y[x],x]desolve(f(y(x))=0,y(x)); または
    ode2(f(y(x))=0,y(x),x);
    DSolve(y'(x)=f(x),y(x),no)
    DSolve[{f==0,g==0},y[x],x]desolve([f=0,g=0],y(x));
    DSolve[{f==0,y[0]==a},y[x],x]atvalue(y(x),x=0,a);
    desolve(f=0,y(x));
    DSolve(y'(x)=f(x),y(x),a)

    A.5.3 変換

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    LaplaceTransform[f[t],t,s]laplace(f(t),t,s);Laplace(f(t),t,s)
    InverseLaplaceTransform[g[s],s,t]ilt(g(s),s,t);iLaplace(g(s),s,t)
    FourierTransform[f[t],t,w]load(fft);
    fft(f(t),t,w);
    なし
    InverseFourierTransform[g[w],w,t]load(fft);
    ift(f(t),t,w);
    なし

    A.5.4 ベクトル解析

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Needs["VectorAnalysis`"]
    Curl[vector]
    load(vect);
    curl(vector);
    Curl(vector, [varlist], [mode])
    Needs["VectorAnalysis`"]
    Div[vector]
    load(vect);
    div(vector);
    Divergence(vector, [varlist], [mode])
    Needs["VectorAnalysis`"]
    Grad[vector]
    load(vect);
    grad(function);
    Gradient(function, [varlist], [mode])
    Needs["VectorAnalysis`"]
    HessianH[f_, x_List?VectorQ]
    load(linearalgebra);
    hessian(function, [varlist]);
    Hessian(function, [varlist], [mode])
    Needs["VectorAnalysis`"]
    JacobianMatrix[f_List?VectorQ, x_List]
    load(linearalgebra);
    jacobian(function, [varlist]);
    Jacobian(function, [varlist], [point])
    Needs["VectorAnalysis`"]
    Laplacian[vector]
    load(vect);
    laplacian_matrix(a);
    Laplacian(function, [varlist], [mode])

    A.6 その他の関数

    A.6.1 整数関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Round[x]?round(x);Round(x)
    Mod[n,p]mod(n,p);Mod(n,p)
    GCD[a,b]gcd(a,b);GCD(a,b)
    LCM[a,b]lcm(a,b);LCM(a,b)
    FactorInteger[n]factor(n);nPrimes(n)
    Rationalize[x]ratsimp(x);(ToFractions(x))

    A.6.2 特殊関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    n!n!;n!
    BesselI[v,z]bessel i(v,z);BesselI(v,z)
    BesselJ[v,z]bessel j(v,z);BesselJ(v,z)
    BesselK[v,z]bessel k(v,z);BesselK(v,z)
    BesselY[v,z]bessel y(v,z);BesselY(v,z)
    Erf[x]erf(x);Erf(x)
    Gamma[x]gamma(x);Gamma(x)
    Zeta[x]zeta(x);Zeta(x)

    A.7 グラフ

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Plot[y,{x,a,b}]plot2d(y,[x,a,b]);Plot(y,[x,a,b])
    Plot[{y1,y2},{x,a,b}]plot2d([y1,y2],[x,a,b]);Plot(y1,y2,[x,a,b])
    ParametricPlot[{x,y},{t,a,b}]plot2d([parametric,x,y],[t,a,b]);ParametricPlot([x,y],[t,a,b])
    Plot3D[z,{x,a,b},{y,p,q}]plot3d(z,[x,a,b],[y,p,q]);Plot3D(z,[x,a,b],[y,p,q])
    ParametricPlot3D[{x,y,z},{s,a,b},{t,p,q}]plot3d([x,y,z],[s,a,b],[t,p,q]);ParametricPlot3D([x,y,z],[s,a,b],[t,p,q])
    ListPlot[x]openplot curves(x);ListPlot(x)





     先日、 iPhone/iPod touchで使える数学系アプリを紹介した

     その中で「愛用している」と紹介したMathStuio(元Spacetime)であるが、Mathematicaのように充実したオンライン・リソースがある訳でも、Maximaのように世界中でたくさんの人がドキュメントを提供している訳でもない。

     日本語だと特に資料がないので、役に立つ人もいるかもしれないので、メモ程度のものだが出してみる。

    MathStudio App

    カテゴリ: 教育

    価格: ¥1,700




    第 1 章 MathStuio(元Spacetime)の基本

    1.1 MathStuio(元Spacetime)とは

     MathStuio(元Spacetime)はクロス・プラットフォームの数式処理システムである。、iPhone/iPad、Windows、Macintosh、Windows Mobile、Windows Mobile Smartphones、Palm OS5、(そのうちAndroid)で動く。
     微積分ができる、方程式が解ける。二次元、三次元のグラフが描ける、それらを簡単にアニメーション化できる。グラフはもちろん指先でぐるぐる回したり拡大したりできる。パッケージを呼び出すことなしに、ベクトル解析も特殊関数も使える。
     カッコの数が合わなくても、そもそも閉じてなくても、いいように解釈してへっちゃらで動く。 


    1.2 情報源

     [Menu]ボタンを押して下の方にある「? Tutorials」を選ぶと、ステップバイステップで(指示される通りにボタンを押して、実際にMathStuio(元Spacetime)を操作する)基本機能と操作が学べる。
     コースは9通り。
    Basics(基本;Button Padの使い方など)
    Solve Equations(方程式を解く)
    Calculus(微積分)
    2D Graphing(2次元グラフ)
    3D Graphing(3次元グラフ)
    Matrics(行列)
    Functions(関数をつくる)
    Scripting(プログラムする)
    Scroll Function(変数の値をバーで操作できる機能)

     [Menu]ボタンを押して「? Tutorials」のほかに「Online Manual」がある。
     これを選ぶとhttp://www.mathstudio.net/manual/ が開く。
     簡素なものだが、MathStuio(元Spacetime)で使える組み込み関数がジャンル別+アルファベット順に整理してあって、解説と使用例をみることができる。

     [Catalog]ボタンを押すと、MathStuio(元Spacetime)で使える組み込み関数がアルファベット順になっているので、ここから選ぶことで関数を入力できる。
     また、多くの関数では、ここから簡単な解説と使用例をみるとができる(使用例もペーストできる)。
     ユーザーが定義した変数や関数も、この[Catalog]に登録されるので、入力を助けてくれる。

     最後の砦は、掲示板http://www.mathstudio.net/forums/である。
     オンライン・マニュアルを含めて提供されているものはどれも簡素すぎるので、最終的にはここに当たって疑問を解くことになる。


    1.3 電卓として使ってみる

     基本的に本に書いてある通りに式を入力して[Solve]ボタンを押せば答えが出る。×(掛ける)が「*」、÷(割る)が「/」、べき乗が「^」となるのはお約束。

     普通の電卓だと3÷5は0.6と小数で表示するところだが、数式処理システムなので、分数で処理してくれる。「3/5」の式のところをタップして、もう一度[Solve]ボタンを押すと小数表示になる。

     平方根は例えばsqrt(3) だが、ルートのボタンを押して入力した方が速い。対数、三角関数もlog、sinなどと入力してもいいがボタンがある。階乗、極限、微分,積分もボタンがある。

     方程式を入力して[Solve]ボタンを押せば、方程式も解いてくれる。

     直前の答えはansと書く(answerの略)。
     これもボタンがあるが、何も入力せず+ボタンを押すと「ans+」と入力され、直前の答えに足し加えるのが簡単。「-」「*」「/」「^」でも同様。
     直前でなく、もっと前の答えを参照したいときは、エントリー番号とansを組み合わせる。たとえば11番目のエントリーの答えを参照したいときは ans(11)とする。


     電卓篇の最後に、お手軽に回帰分析をやろう。
     次のような体重と身長のデータがある。
     こうした複数の数値が集まったデータを扱うには、コンマで区切ってひとまとめに[]でくくっておくと便利である。こうした形のデータをリストという(後述)。

    weight=[57,53,47,52,47,53,48,48,43,57,50,44,53,41,60,53,48,42,57,47,52,54,51,45,65,43,50,50,49,48,47,49,50,47,46,50,53,47,47,55,47,46,60,50,45,49,65,68,68,58,55,64,57,66,65,55,57,60,62,67,60,65,51,72,60,62,57,56,54,67,70,55,70,80,62,68,75,56,67,60,60,90,70,60,90,60,65,75,57,56,72,62,65,73,78,65,70,55,64,62]
    tall=[170,166,157,164,157,160,163,160,153,165,162,150,165,151,165,169,158,153,172,162,160,175,165,155,177,161,160,166,162,161,165,158,158,164,160,159,165,163,160,175,159,161,173,158,159,162,175,178,185,163,165,175,168,180,180,170,167,175,164,178,175,169,171,190,173,171,175,171,166,181,175,163,180,188,180,185,181,167,178,177,172,198,171,169,190,164,170,188,177,169,186,179,176,190,171,171,186,169,179,180]

     さらに体重と身長も[ ]でくくる。

    [weight,tall]

     ここでEntryボタン →Statボタン →Regressionボタンと押していくと、今のデータを散布図で表示したグラフが描かれる。Select Regressionのプルダウンメニューがあるから、そこからどんな曲線に回帰させるかを選ぶ(Liner ならy=ax+bに回帰)。すると散布図上に曲線が引かれ、回帰曲線の係数が表示される。

    ch1-3.png

     回帰曲線の種類は、Cubic, e, Exponential, Liner, Logarithmic, Logistic, Median-Median, Quadratic, Quartic, Power, Sinusoidal, Custom Regression(ユーザー定義)の中から選ぶことができる。
     


    1.4 グラフを描いてみる

     数式を書いて[Plot]ボタンを押すとグラフが描ける。たとえば[sin]ボタン→[x]ボタン→[Plot]ボタンでこんなグラフ。

     グラフ部分をダブルタップすると全画面表示。もう一度ダブルタップすると戻る。
    Zeroz、Minima、Maximaをタップしてそれぞれにチェックを入れると、ゼロ点、極小点、極大点に丸印がつく。複数のグラフを表示したときはこれにintersections(交点)が加わる。

     3次元グラフも[Plot]ボタンを押すだけで描ける。たとえばsin(x)*cos(y)と入力して[Plot]ボタンでこんなグラフ。

    ch1-4.png


     指で触れるとくるくる回転する。
     全画面表示にして、右下の数字をタップすると1:メッシュ有り(標準)、2:メッシュなし、3:メッシュだけ、4:ドット表示、と表示形式が切り替わる。

     フラクタルも簡単に描ける。z^2+cと入力して[Plot]ボタンでこんなグラフ。

    ch1-4-2.png


     古典的なマンデルブロ集合(zn+1 = zn^2+cの漸化式で定義される複素数列 {zn}n∈N が n → ∞ の極限で無限大に発散しないという条件を満たす複素数 c 全体が作る集合)。
     ピンチインでどんどん拡大できる。


    1.5 変数と関数の定義

     a という変数に、2 という値を記憶させるには、a=2でいい。
     b という変数に、sin(z) という数式を記憶させるには、b=sin(z)。
     a,bという変数の値を消去するには、clear("a',"b")。クォーテーションで変数名をくくる必要がある。clear(all)ですべての変数の値を消去できる。

     関数の定義も普通のイコールでできる。
     多変数関数を定義するには、変数をカンマ(,)で区切って f(x, y, z) のようにする。
     たとえば 2財におけるコブ・ダグラス型生産関数は、p(x,y,s,t)=x^s*y^tで定義できる。
    p(x,y,s,t)=x^s*y^t
    Plot3D(p(x,y,0.2,0.3),[x,0,10],[y,0,10]


    1.6 作業の保存など

     [Menu]ボタンを押すと、New(新規作成)やOpen(保存したファイルを開く)やSave(保存する)やSave as(名前を付けて保存)などがある。ファイルの拡張子は.st。
     Include Script Filesで.stファイルを開くと、そのファイルで定義された変数や関数がつかえるようになるが、スクリプト自体は展開されない。他のファイルの関数を使いたいときなど便利。
     Transfer Filesを選んでしばらくするとIP-addressが表示されるので、そのアドレスをPCのWebブラウザで開くと、WiFi経由でファイルの転送(PCからMathStuio(元Spacetime)へ/MathStuio(元Spacetime)からPCへ)ができる。



    第 2 章 グラフの描画

     MathStuio(元Spacetime)にはグラフを描く関数がたくさんある。さっき触れた[Plot]ボタンは、それらの関数を自動的に使い分けしてくれていたのだ。
     電卓的な使い方から進んで、自分でプログラムをつくる場合は、作り手の方で関数を使い分けする。その方が細かい指定もできる。

    2.1 平面的なグラフ

    (書式)
    Plot(equation, window, [type])
    plot(関数式,[定義変数名,開始値,終了値],[y成分変数名,開始値,終了値],オプション)

    (例)
    plot(sin(x))……関数式以外は省略できる
    plot(sin(x),[x,-2,2])……グラフの範囲を指定してみた
    plot(sin(x),[x,-2,2], style=middleShade, color=red)……赤色にして、グラフとx軸の間を塗りつぶした

    plot(sin(x+T))……時間変数Tを使うと簡単にアニメーション化できる(時間変数Tは他のPlot系関数でも使える)。



    2.1.1 陰関数
    (書式)
    ImplicitPlot(equation, window, [type])

    (例)
    ImplicitPlot(cos(x)+sin(y)=1, x=[-8, 8], y=[-8, 8])

    2.1.2 媒介変数表示
    (書式)
    ParametricPlot(equation, window, [type])

    (例)
    ParametricPlot(cos(u), sin(u), color=red)

    2.1.3 極座標表示
    PolarPlot(sin(2\theta))

    2.1.4 等高線グラフ
    ContourPlot(x^2+y^2)

    2.1.5 ベクトル場グラフ
    VectorPlot(-y,x)

    2.1.6 グラフを重ねて表示
    同じ関数で描けるグラフなら、数式をコンマで区切るだけでいい。グラフの色は、指定しなくても適当に変えてくれる。
    Plot(sin(x),cos(x))

    複数のグラフを重ねて描くと、たとえば近似関数が元の関数のどれくらいよい近似になっているかが一目瞭然である。
    Taylorという関数でテイラー多項式による近似関数がつくれる。たとえば
    Taylor(sin(x),x,7)
    で7次の近似。
    スクロールバーを動かして変数の値を動かせるScrollという関数と組み合わせて
    Scroll(1,13,n)
    Plot(sin(x),Taylor(sin(x),x,n))
    スクロールバーを動かして次数をあげていくと、テイラー近似がどんどん元のsin(x)のグラフに近付いていく様子を見ることができる。簡単にグラフをインタラクティブにできた。


    描くのに異なる関数を使うグラフ同士を重ねるにはMultiPlotという関数を使う。こっちはグラフの色を指定しないとこんな風に同じ色(デフォルトだと青)になる。
    MultiPlot(VectorPlot(1,2x),Plot(x^2))

    今のを少しいじって、与えられた関数を微分し勾配の場をベクトル表示して、元の関数のグラフを重ねたものを描こう(赤色にして少し太めにする)。
    ch2-1.png




    2.2 立体的なグラフ

    3次元のグラフを描く基本関数はPlot3Dである。

    (書式)
    Plot3D(equation, window, [type])
    Plot3D(関数式,[x成分変数名,開始値,終了値],[y成分変数名,開始値,終了値],オプション)

    (例)
    Plot3D(sin(x)+cos(y))
    Plot3D(x^3-3*x*y^2,[x,-1,1],[y,-1,1])


    2.2.1 媒介変数表示の場合
    ParametricPlot3d([cos(u)*cos(v),cos(u)*sin(v),sin(u)],[u,-\pi/2,\pi/2],[v,-0,2\pi])
    ……球を描いてみた

    ch2-2.png


    ……2つのリングを絡めてみた。リングごとに色を塗り分け(colors=[[orange,red],[blue,skyBlue]])、座標は消してある(axis=0)。

    2.2.2 ベクトル場グラフ
    VectorPlot3D([x,y,z])

    2.2.3 グラフを重ねて表示
    Plot3D(sin(x+T),cos(y+T))



    第 3 章 数式の操作

    3.1 多項式の操作
    3.1.1 多項式の展開
     多項式を展開するには関数expandを使う。
    expand((a+b)^5)

     項が多くなって分かりにくいとき、欲しい変数の係数だけを拾いだすにはCoefficientという関数を使う。
    Coefficient((a+b)^5,a,2)
    これでaの2乗の係数を拾いだしてくれる(10b^3)。

    3.1.2 多項式の因数分解
    Factor(x^4-18x^2+81)

    Factor(x^5+111105x^4+1121766570x^3+1118845033650x^2+108868944188565x+890011088900109)


    3.2 有理式の操作
    3.2.1 有理式の通分
    Together(2/(x+1)-1/(x-1))

    3.2.2 有理式の部分分数展開
    Apart((x^3+2*x^2-4*x-3)/(x+1))
    →x^2+x+(2/(x+1))-5


    3.3 方程式を解く
    solve(x^3+2*x^2+3*x+4=0,x)

    solve(a*x^2+b*x+c=0,x)
    二次方程式の解の公式がでてくる。

    連立方程式は式をコンマで区切る。
    solve(2*x+4*y=30,x+y=12)


    3.4 方程式の近似解

    もう少し難しいのを解かせてみる。
    solve(exp(x)=3-x^2,x)
    =>[7019575/8411846, …]

    Maximaあたりだとうまくいかないのだが、あっさり解かれてしまった。
    実はMathStuio(元Spacetime)のSolve関数は、式変形で解くのが難しいときは,数値的に解くように、自動的に切り替えを行っている(NSolveという関数にバトンタッチしてる)。MathematicaでいうとFindRootをつかって反復法で解くのに当たる。このやり方だととにかく答えは出してくれるのだが、複数の解があっても一つしか答えない。
     答えに「…」とあるのは、他にも解があるんだけど、ひとつしか見つけてないよ、という意味だ。
     こういう時は、初心に返る。
    Plot(exp(x),3-x^2)と、元の方程式の右辺と左辺のグラフを書いて重ねてみる。
    グラフをダブルタップして全画面表示し、拡大する。やはり解はふたつありそうである。

    ch3-4.png

    [trace]をタップして、グラフの交点の座標を確かめる。x=0.84と-1.58あたりである。
     あたりがついたら、さっきの解でないほうのx=-1.58を教えてやって,その近くで解を探させる

    solve(exp(x)=3-x^2,x,-1.58)

    と最後にコンマで区切って付け加えるだけでOKだ。
    [-3882309/2314711]=-1.67723…という解が見つかった。


    第 4 章 微分と積分

    4.1 極限
    (書式)
    Limit(function, variable, point, [direction])
    limit(函数, 変数, 近づける値,方向);
    ……direction(方向)は、0のとき両側、+1のとき右極限、-1のとき左極限
    (例)
    Limit((3x-15)/sqrt(x^2-10x+25), x, 5, +1)
    =>3
    Limit((3x-15)/sqrt(x^2-10x+25), x, 5, -1)
    =>-3

    グラフを描くとわかる。
    Plot((3x-15)/sqrt(x^2-10x+25),[x,0,10])


    4.2 微分
    まずは極限を使って微分の定義をかいてみる。試しにsin(x)を微分してみる。
    f(x)=sin(x)
    Limit((f(x+h)-f(x))/h,h,0)

    ちゃんとcos(x)が得られる。

    もちろん微分する関数も用意されている。
    (書式)
    D(f(x), x, [n])
    D(関数, 微分用変数, 階数)

    (例)
    D(x^6+3x^5-4x^3+x-1)
    D(f(x)*g(x), x)
    D(cos(x)*sin(x), x)
    D(sin(3x+6), x, 3)

    大抵はDで間に合うが、特殊関数が入っている場合はDiffという関数を使う。
    Diff(z^2*Zeta(z, a), z)

    全微分はfDiffという関数を使う。
    fDiff(x^2*y^2,[x,y])


    テイラー展開
    (書式)
    Series( function , var , n , value )
    Series(函数, 展開変数, 近似次数,展開の中心)
    Taylor( function , var , n , value )
    Taylor(函数, 展開変数, 近似次数,展開の中心)

    (例)
    Series(tan(x),x,9,2)
    Taylor(tan(x),x,9,2)
    テイラー展開をやってくれる関数は、Mathematica風にSeriesでもMaxima風にTaylorでも、どちらでもOK。ただし近似次数と展開の中心の位置が、MathematicaやMaximaとは逆になっている。


    4.3 級数
    総和
    (書式)
    Sum( function , n , start , end)
    Sum(関数, 添え字変数, 初期値, 終値)

    (例)
    Sum(1/a!,a,0,20)
    Sum(1/a^n,n,1,5)

    総積
    (書式)
    Product( function , n , start , end)
    Product(関数, 添え字変数, 初期値, 終値)

    (例)
    Product(i,i,1,30)
    Product((n+k),n,0,4)


    4.4 積分
    不定積分
    (書式)
    Integrate(f(x), x, [a], [b])
    Integrate(被積分関数, 積分変数)

    (例)
    Integrate(x^2+3x-6, x)
    Integrate(2sin(3x)/sqrt(5+cos(3x))^3,x)

    定積分
    (書式)
    Integrate(f(x), x, [a], [b])
    Integrate(被積分関数, 積分変数, 開始値, 終了値);

    (例)
    Integrate(sin(x^2/2),x,0,2)
    Integrate(Integrate(x^2,x,sqrt(y),y),y,0,1)

    数値積分
    (書式)
    Nintegrate(f(x), x, [a], [b])
    Nintegrate(被積分関数, 積分変数, 開始値, 終了値);

    (例)
    NIntegrate( (sin(x)-cos(x)) / (sin(x)+cos(x)) , x , 0 , 1)
    NIntegrate( ((x+1)/x) * ln(x) , x , 0 , 1)

    4.5 微分方程式
    (書式)
    DSolve(equation, dependent(independent), values, mode)
    Dsolve(微分方程式, 求める関数, 関数の値, モード)

    (例)
    微分はアポストロフィで表す。二階微分ならf''(x)
    DSolve(x''(t)=g,x(t),[0,0])
    =>1/2 g t^2

    一階の微分なら
    DSolve(d@R/d@S=n*R(S)/S,R(S),no)
    DSolve(d@y=sin(t)*d@t, y(t), no)

    DSolve(m*x''(t)=-k*x(t),x(t),[A,0])……x(0)=A,x'(0)=0
    =>A cos(sqrt(kt)/sqrt(m))


    4.5.1 ラプラス変換を使って微分方程式を解く

      MathStuio(元Spacetime)のDSolve関数は、どうもラプラス変換を使って元の微分方程式を代数方程式に直して解いている感じがする。 Maximaの Desolve関数みたいな感じだ。

     自動化されているが、これを1ステップずつ、解いていくと次のような感じになる。

    (例)f''(t)+f(t)=sin(t)

    ラプラス変換をつかう。
    Laplace(f''(t)+f(t)=sin(t),t)

    変換後の代数方程式を解く。
    関数について解くにはSolveでなくSolve_Equationを使う。
    Solve_Equation(ans,F(s))

    さらにその結果をラプラス逆変換すると、
    iLaplace(ans,s)

    ch4-5-1.png


    Dsolveで解いたのとおなじになる。



    4.5.2 微分方程式の数値解析

    常微分方程式の近似解を数値解析で求めるのには、4次のルンゲ=クッタ法を行う関数RK4と、4次と5次のルンゲ=クッタ法をやって両者の差が許容限界に収まるように刻み幅を調節する関数RK45が用意されている。

    (書式)
    RK4(function, t, y, a, b, y0, N=10)
    RK4(微分方程式, 独立変数, 従属変数, 範囲の開始値, 範囲の終了値, 初期値, 区間の分割数(デフォルト=10)

    RK45( function , t , y , a , b , y0 , Tol=10E-5 , hmax=0.25 , hmin=0.25 , N=20)
    RK45(微分方程式, 独立変数, 従属変数, 範囲の開始値, 範囲の終了値, 初期値, 誤差の許容限界(デフォルト=10E-5),刻み幅の上限(デフォルト=0.25),刻み幅の下限(デフォルト=10E-6 ),区間の分割数(デフォルト=20))

    (例)
    RK4(t-y^2,t,y,0,3,1)
    ListPlot(ans)

    RK45(t-y^2,t,y,0,3,1)
    ListPlot(ans)

    RK4とRK45は、x,yの組をリストにして返す。これを見るためにリストをグラフにする関数ListPlotに結果を渡す。するとこんなグラフになる。



    第 5 章 リスト、ベクトル、行列

    5.1 リスト

     多くの数式処理システムと同様に、MathStuio(元Spacetime)でも、リストという《データを組にしたもの》を扱うことができる。

     リストをつくるには、データの各要素をコンマで区切って,全体を[](中括弧)でくくる。
    [4,5,6]
     リストは変数に代入できる。
    a=[4,5,6]

     また関数Listでも、リストをつくることができる。
     単にList(数値)とすれば、その数値の個数だけ0でできたリストができる
    List(4)
    a
    [0,0,0,0]

     ルールを計算式で表して、リストをつくることもできる。
    (書式)
    List(expression, variable, start, step, length)
    List(計算式, カウンタ変数, 初期値, 増分,個数)
    Sequence(計算式, カウンタ変数, 初期値, 終了値)

    (例)
    List(i^2,i,1,1,5)
    =Sequence(i^2, i, 1, 5)

    [1,4,9,16,25]


    二つのリストを連結させる
    (書式)
    Append(expression1, expression2)
    (例)
    Append([1, 2, 3], [4, 5, 6])
    →[1,2,3,4,5,6]

    リストの一部を取り出す
    (書式)
    Extract(expression, position, [length])
    (例)
    Extract([1, 2, 3, 4, 5], 2, 3)
    →[2,3,4]

    変数にリストが入っている場合、「変数()」でも一部を取り出すことができる。
    (例)
    a=[1,2,3,4,5]
    a(2:3)
    →[2,3,4]


    リストの中身を昇順で並びかえる
    Sort([2, 5, 3, 4, 1])
    →[1,2,3,4,5]

    リストの順序を逆にする
    Reverse([3, 2, 1])
    →[1,2,3]

    リストの中の要素の数
    Length([3,2,1])
    →3


    スカラー値を引数にしてスカラー値を返す関数にリストを渡すと、リストの要素それぞれを引数にして計算したスカラー値をリストにまとめて返してくる。
    つまりリストにまとめて関数を使うと、いっぺんにリストにまとまった結果が得られる。
    sin([0,\pi/6,\pi/4,\pi/3])
    →[0,1/2,√2/2,√3/2]


    複数のデータを統計処理するときもリストを使う。

    最大値 Max([3, 0, -5, 0.5, 4]) →4
    最小値 Min([3, 0, -5, 0.5, 4]) →-5
    平均値 Mean([3, 0, -5, 0.5, 4]) →1/2
    分散 Variance([3, 0, -5, 0.5, 4]) →49/4
    標準偏差 StandardDeviation([3, 0, -5, 0.5, 4]) →7/2


    5.2 ベクトルの演算

    v1=[1,0,2]
    v2=[2,1,-2]

    ベクトルの足し算
    v1+v2

    ベクトルの引き算
    v1-v2

    スカラー倍
    3*v1

    ベクトルの内積
    Dot(v1,v2)

    ベクトルの外積
    Cross(v1,v2)

    ベクトルのノルム
    Norm(v1)

    ベクトルの間の角度
    Angle(v1,v2)




    5.3 行列の演算

    行列はリストを組み合わせて作る。
    a=[[1, 2], [3, 4]]

    変数に行列が入っている場合、行列のm行n列を抜き出してスカラーを得るには、
    a(1, 2)
    →2

    1~2行×2~3列だけを抜き出して行列にするには
    a(1:2,2:3)


    数式で行列を定義する
    (書式)
    ConstructMat(数式,行カウンタ変数,列カウンタ変数,行数,列数)
    (例)
    ConstructMat(i*j,i,j,3,3)

    与えられた行列をm行n列の行列に組み直す
    Reshape(matrix,m,n)
    Reshape([[1,2,3,4,5,6,7,8,9]],3,3)

    n×nの単位行列
    Identity(n)

    逆行列
    Inverse(matrix)

    転置行列
    Transpose(matrix)
    あるいは変数名にアポストロフィで
    A' は Transpose(A)と同じ


    行列の行列式
    Det(matrix)

    行列の積
    Command(MatrixDetection=1)
    [[1, 2], [3, 4]]*[[5, 6], [7, 8]]

    行列の固有値のリストを得る
    Eigenvalues(matrix)

    行列の固有ベクトル
    Eigenvectors(matrix)

    行列の(i,j)余因子
    coFactor(matrix, i, j)


    ガウスの消去法
    RowReduce(matrix)

    次の連立方程式を解く。
    2x1 + 4x2 + 2x3 = 8
    4x1 + 10x2 + 3x3 = 17
    3x1 + 7x2 + x3 = 11

    上の連立方程式の係数から次のような行列を作る
    A=[[2,4,2,8],[4,10,3,17],[3,7,1,11]]

    これにガウスの消去法をおこなう。
    RowReduce(A)
    次のような行列が得られる。

    ch5-4.png


    上の連立方程式の解はx1=1,x2=1,x3=1である。