カウンタ

compteur (depuis le 1er décembre 2009)173982

電子講義集(全卓樹)

電子講義集(全卓樹) >> 記事詳細

2018/12/03

*環境とシミュレーション0

Tweet ThisSend to Facebook | by T_Zen
Mathematicaによるプログラミングの基本

1 条件分岐
If文:条件が満たされる満たされないかで違った操作をする
 例:
  p =-1 ;  If[ p > 3,   Print[  p, " :p ha 3 ijou" ] ,   Print[ " p ha 3 ika" ]  ] ;
  p =12 ;  If[ p > 3,   Print[  p, " :p ha 3 ijou" ] ,   Print[ " p ha 3 ika" ]  ] ;
  p = 1 ;  If[  p < 0,  Print[  p, " :p ha fu " ] ] ;
  p =-5 ;  If[  p < 0,  Print[  p, " :p ha fu " ] ] ;


2 繰り返し操作
Doループ:カウンターを動かして規定回数だけ操作を行う
 例:

  n = 10 ;
  s = 0 ;
  Do[   s = s + j ,  {j, 1, n} ] ;
  Print[ " n:", n, " s:", s, " j:", j ] ;
注:終了後のカウンター j の中身に注目

Whileループ:条件が満たされてる間、操作を行う
 例:
   k = 0 ; While[  k <= 5 ,  k=k+1;  Print[ " k:", k ]  ] ;
注:カウンター k を自分で定義してそうさする。無限ループにならないように注意


和を簡単に求める便法もある
 例:
  Sum[ i^2, {i,1,99} ]


3 配列(リスト)

一つの名前のもとにたくさんの数を収容
 例:一次元配列
  Table[ n^2, {n,1,7} ]
あるいは同じことを
  n=7;
  A = ConstantArray[ 0, {n} ];
  Print[ A ];
  Do[ A[[ g ]] = g^2 , {g,1,n} ];
  Do[ t = A[[  h  ]] ;  Print[  "h: ", h, " A_h ", t ] ,  {h, 1, n/2} ] ;
  Print[A];

 例:二次元配列

  Table[m^n, {n, 1, 3}, {m, 1, 7}]
あるいはおなじことを

  m = 3; n = 7;
  B = ConstantArray[0, {m, n}];
  Print[B];
    Print[" gyougoto tsumeru "] ;
  Do[B[[1, g]] = g, {g, 1, n}];  Do[B[[2, g]] = g^2, {g, 1, n}];  Do[B[[3, g]] = g^3, {g, 1, n}];
  Print[B];
    Print[" jidouka "] ;
  Do[Do[B[[t, g]] = g^t, {g, 1, n}], {t, 1, m}]
  Print[B];


 例:範囲、和、内積
範囲を指定:ためしてみよ

  A = Table[n, {n, 1, 10}]

  A[[3 ;; 5]]
範囲を指定:これもためせ

  B = Table[m n, {n, 1, 5}, {m, 1, 5}]

  B[[2 ;; 3, 2 ;; 4]]
和と積:ためせ
  A = Table[m n, {n, 1, 3}, {m, 1, 3}]

  B = Table[If[n == m, 0, 1], {n, 1, 3}, {m, 1, 3}]

  S=A + B
  P=A.B

  Print[ A // MatrixForm, B // MatrixForm, S // MatrixForm, P // MatrixForm ]


課題01

1からnまでの自然数の和を求めるプログラムをつくれ。n=10,100,1000で試してみよ。

課題02

1からnまでの自然数のうちで3で割れない数すべての和を求めるプログラムをつくれ。n=10,100,1000で試してみよ。

ヒント:j を m で割った余りを表す Mod[ j, m ] を用いよ


課題03

n=2, 3, 7で次のことを行え
* 対角要素が0、それ以外の i 行 j 列の要素が i+j であるようなn x n の2次元配列 V を作れ
* j 列目の対角要素がjであり非対角要素はすべて0であるn x n の2次元配列 W を作れ
* 対角要素が1からnまでの乱数であり非対角要素は全て0であるn x nの2次元配列 X を作れ
* V、W、Xすべての二つの組の和(3つ)と積(6つ)を求めよ

課題04

n次元の配列を定義し、その最初の要素は2、次の要素は3、次の要素は5、次の要素は7、そしてそれ以降は7より大きく、2、3、5、7のいずれでも割り切れない自然数を、小さい順に詰めていって全部でn個詰まったらやめるプログラムを作れ。n=10、20、30で試してみよ。

ヒント:関数Prime[jを用いると簡単。または]ブーリアン代数演算子(&&  ||  ==  !=)に注目


課題05

n次元の配列を定義し、0と1を半々の確率でランダムに詰めていってn個詰まったらやめるプログラムを作れ。最後にこの配列の中の1のようその数を計算せよ。n=10、20、100で試してみよ。
ヒント:0と1の間の均一乱数を与える RandomReal[] を用いよ

課題06

n次元の配列を定義し、0から10までのランダムな整数を詰めていって書き出し、さらにn個の要素全部の和を書き出すプログラムを作れ。n=20、30で何度か試してみよ。
ヒント:0とpの間の均一整数乱数を与える RandomInteger[p] を用いよ

応用課題

課題11
n以下の素数を全て求め、配列に収めるプログラムを作れ。 n=10, 100, 500, 1 000, 5 000 で実行して、それぞれについて素数の個数と、かかった時間を計測せよ。(また作った証拠に、大きい方から三つの素数を書き出せ)
ヒント:xxxの生起数を数えるカウンター  ic=0; Do[ If[  xxxxx  , ic=ic+1 ] , {a,2,n} ]; Print[ ic ];
時間計測はTimeUsed[]をプログラム開始時、終了時に二度引いてその差をとって行う)

課題12(発展課題)
数を与えるとそれが素数かどうか判定し、素数でない場合は、その数を素因数分解するプログラムを作れ。

00:40 | 投票する | 投票数(18) | コメント(0) | 教育