とらりもんHOME  Index  Search  Changes  Login

とらりもん - C言語による数列処理 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

筑波大学農林工学系 奈佐原(西田)顕郎

!2項間漸化式の処理
a0=2, an+1=2an-1を満たす数列{an}の解析(課題3-4)をやってみよう:

     1  /* series.c
     2   * 2004/02/15 K. Nishida
     4   */
     5  # include <stdio.h>
     6  main()
     7  {
     8  int a;
     9  int i;
     10 a=2;
     11 for (i=1; i<=10; i++)
     12    {a=2*a-1;
     13     printf("%d  %d\n", i, a);
     14    }
     15 }

このように、2項の漸化式は簡単にプログラムにできる。

課題11-1. a0=1, an+1=0.5an+1を満たす数列{an}の、第10項までを計算せよ。(ヒント: 実数型で計算しなければならない)

!GNUPLOTによるグラフ作成
上の、series.cなどの実行結果は、標準出力として画面に表示される。これをグラフにしたいときには以下のようにする:

まず、出力をテキストファイルにリダイレクトする:

$ gcc series.c -o series
$ ./series > series.txt

次に、gnuplotというグラフツールを起動:

$ gnuplot

        G N U P L O T
        Version 3.7 patchlevel 2
        last modified Sat Jan 19 15:23:37 GMT 2002
        System: Linux 2.4.20-28.8

        Copyright(C) 1986 - 1993, 1998 - 2002
        .....

        gnuplot>

ここでコマンドを打ち込むことで、グラフを作成できる。たとえば、以下のようにすれば、先ほど作ったファイルのデータをグラフにできる:

gnuplot> plot "series.txt" using 1:2 w l

[[http://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/numerical/10a.png]][[http://pen.envr.tsukuba.ac.jp/~RStiger/hiki2/numerical/10a.png]]

このGNUPLOTというツールの特徴は、

長所: オープンソース(無料)
長所: LinuxでもWindowsでも使える。
長所: 基本的にスクリプト言語なので、シェルスクリプトに組み込むこともでき、大量処理・自動化に向いている。
長所: PostScriptに対応しており、うまく使えばとてもきれいな図が描ける。
長所: 科学技術の分野ではよく普及している。
短所: すべてコマンドで指定するのがめんどくさい。

などである。

GNUPLOTの使い方については、以下のようなサイトを参考にされたい:

* [[gnuplot 入門|http://www.math.meiji.ac.jp/~mk/labo/howto/intro-gnuplot/]]
* [[GNUPLOT 入門|http://www.sip.eee.yamaguchi-u.ac.jp/lecture/2002/physics/gnuplot/]]
* [[GNUPLOT入門|http://fenix.ne.jp/~cdrtk/misc/gnuplot/]]
* [[GNUPLOT tips|http://t16web.lanl.gov/Kawano/gnuplot/]]
* [[GNUPLOTの第一歩|http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/gnuplot-intro/]]
* [[GNUPLOT 日本語リファレンス・ガイド|http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/gnuplot/index.html]]

!3項間漸化式の処理
フィボナッチ数列:an+2=an+1 + an , a0=1, a1=1を解析してみよう。このような、3項にまたがる漸化式では、前述のように、ひとつの変数を用意して古い項を新しい項に置き換えるという単純な方法は通用しない。ひとつ前の項を覚えておかねばならないからである。たとえば次のようなプログラムになる:

     1  /* Fibonacci.c
     2   * 2004/02/15 K. Nishida
     3   * Fibonacci
     4   */
     5  # include <stdio.h>
     6  main()
     7  {
     8  int a0, a1, a2;
     9  int i;
     10 a0=1;
     11 a1=1;
     12 printf("0  %d\n", a0);
     13 printf("1  %d\n", a1);
     14 for (i=2; i<=10; i++)
     15   {a2=a1+a0;
     16    printf("%d  %d\n", i, a2);
     17    a0=a1;
     18    a1=a2;
     19   }
     20 }

課題11-2 an+2=2an+1 - an , a0=0, a1=1を、n=10まで計算するプログラムを作れ。

課題11-3. 以下の連立漸化式で定義される数列{an}, {bn}を、n =1〜10について計算するプログラムを作れ。

    an+1 = an/3 + bn
    bn+1 = an - bn/2

    初期条件: a0=1, b0=1