科学・技術の世界(数式処理システムによる新時代の数学)

初歩的な使い方(微分積分学I相当第二回)

厳密に解ける方程式の解
二次方程式 $x^2=1$:
solve(x^2=1,x);
連立方程式:
solve([2*x+3*y=1,3*x+2*y=1],[x,y]);
厳密には解けない方程式の数値解(解の近似値)
allroots(x^8+x+1=0);
関数を定義
f(x,y):=x^2+y^2
define(f(x),diff(sin(x),x))
両者の違い:前者の方が簡単である。一方、 f(x):=diff(sin(x),x);とすると、f(%pi)など具体的な 値の代入時に違いが出る。:=は単純に左辺を右辺で置き換えるだ け。deine();は、第2引数を処理した結果を第1引数として定義 する。
定義した関数を操作
      define(f(x,y),x^2+y^2);
      diff(f(x,y),x);
    

初歩的なプログラム

初歩的な使い方を理解したところで、これらを組み合わせて使う手段を学習 する。これをプログラムとよぶ。次の概念は手続き型言語という枠組みのプ ログラム言語では共通である。Maximaでのプログラムを通じ、どのような プログラム言語を使う必要が出ても対応できるようになってほしい。
変数への代入
変数 x に数値を代入する。変数名は1文字に限らない。:
      x:1;
      x:%i;
  
f(x)等がf(1)あるいはf(%i)として処理される。
配列
$x_0,x_1,\dots,x_{n-1}$などを処理するためにn個の変数が必要になる 場合、配列を使う。
      array(x,5);
      x[0]:1; x[1]:2; x[2]:3; x[3]:4; x[4]:5; x[5]:6;
    
array(x,5);とすれば配列xを長さ$6$の配列として定 義する。x[0]は第0番目の配列要素とよぶ。 配列要素は0番目から始まることに注意する。上の例では各配列要素に 数値を代入している。
繰り返し処理:for文
配列への代入を処理する場合など、定型的な処理を必要とする場合 にfor文を使う。
      array(x,5);
      for n:0 thru 5 do x[n]:n^2;
    
配列に $n^2$を代入している。変数nを0から5まで順に変化さ せながらdo以下の処理を実行する。
条件分岐:if文
条件に応じて処理を変える場合にはif文を使う。
変数xの値が0である場合に変数yへ2を代入:
      if x=0 then y:2;
    
変数xの値が0である場合に変数yへ2を代入し、そうでなければyへ3を代 入:
      if x=0 then y:2 else y:3;
    
変数xの値が0である場合に変数yへ2を代入し、xの値が1である場合にyへ3を代 入:
      if x=0 then y:2 elseif x=1 then y:3;
    
条件式の種類: x#y : xとyが異なる, x>y : xよりyが小さい, x>=y : xよりyが小さいか等しい, x<y : xより yが大きい, x<=y : xよりyが大きいか等しい。
論理演算 x=y and z=w : x=yかつz=y, x=y or z=w : x=yまたはz=y, (x=y or z=w)and v=u : x=yまたはz=w が成立し、かつv=u.
複雑な関数(手続き、サブルーチン)
複数の処理をまとめて一つの関数を作成する場合など、下記のよう にblock()を用いる。block()の内部だけで有効な変数をローカル 変数とよび、block([xx,yy], ... )などのようにblock()の先頭で 宣言(指示)する。block()内では処理の区切りをカン マ,とする。また、文末を$とすれば不要な出力がない。
      f(x):=block(if x<0 then 0 else exp(-1/x))$
    
      x[0]:1;
      y[0]:1;
      for n:1 thru 5 do
      block(
        x[n]:x[n-1]+n,
        y[n]:2*y[n-1]
      )$
    
以上を用いて漸化式$x_{n+1}=f(x_n)$で定る数列$x_n$を初期値$x_0$か ら順に求める。
      f(x):=1+x/2;
      array(a,5);
      a[0]:1;
      for n:1 thru 5 do a[n]:f(a[n-1]);
      listarray(a);
  
配列の各数値をグラフ化
      array(y,100);
      for n:0 thru 100 do y[n]:n^2;
      plot2d([discrete, listarray(y)],[x,0,100])
    
バッチファイル
次の形式でMaximaの処理を各行へ順に列挙したテキストファイルを作成 しておく。
      g(x):=diff(x^2,x)$
      diff(g(x),x);
    
Maxima からこのファイルの内容を実行する際は次のようにする。
      batch("filename");
    
ファイル名の指定には、フォルダを含めて指定する必要があるかもしれな い。それぞれの環境による。

演習問題

  1. f(x):=diff(sin(x),x);define(f(x),diff(sin(x),x));の違いを確かめる。 f(%pi)の値を両者で計算してみよ。
  2. レポート問題の準備として、$f(x,y)$のグラフを描いてみる。 次のようにすると等高線図をプロットする。
    	contour_plot(f(x,y),[x,-2,2],[y,-2,2],  [gnuplot_preamble, "set cntrparam levels 12"]);
          
    関数値を色分けしてプロットする。
    	contour_plot(f(x,y),[x,-2,2],[y,-2,2],  [gnuplot_preamble,"set cntrparam levels 12; set pm3d"]);
          

レポート問題(11/13提出)

  1. \(f(x,y)=(x^2-1)^2+y^2\)の極値を求めよ。もちろん解析的に解ける 問題であるが、偏導関数をMaximaによって求める練習でもある。
  2. 配列xを用い、1から100までの自然数nについ てnが3の倍数または5の倍数であればx[n]:nとする。 nが3と5の公倍数であればx[n]:0とする。これら以外 の場合はx[n]:1とする。以上の処理を実行し、実行結果として 配列xに格納された値をlistarray(x)を用いて出力す る。自然数$n$を$k$で割った剰余はmod(n,k)を用いる。
  3. 数列$\{x_n\}_{n=0}^\infty$を漸化式$x_{n+1}=4x_n(1-x_n)$で定める。 $0<x_0<1$を与えて、$x_{100}$までを求めよ。for文を用い るとよい。

バッチファイル

Windows
「メモ帳」(notepad)を起動し、今回授業資料中のバッチファイルの 説明中に「テキストファイルを作成する」と指示した内容で新規ファイルを作 成。保存する際にテキスト形式で保存する。保存の際に「全ての形式」を 選択肢、ファイル名を 「maxima1020.bat」のように拡張子を「bat」とする。
Mac
「アプリケーション」「ユーティリティ」内の「テキストエディット」 を起動し、Windowsと同様の内容のファイルを作成。保存する前に、「フォ ーマット」メニューから「標準テキストにする」を選択し、改めて保存す る。
バッチファイルの実行
Windows: Mac: maximaのbatchに指定するファイル名には次の形で指 定する。/Users/username/Desktop/maxima1020.txt ただし、username の部分は各自のMacのユーザ名である。