View
2
Download
0
Category
Preview:
Citation preview
計算情報数学 2008 (第 7回)プログラミング入門 (その2)
野呂正行
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 1
Q & A :線形代数編について
少し難しかった
ちょっとやりすぎたでしょうか.
固有値,固有ベクトルの話ができなかったのは
残念.
線形代数を復習しないと . . .
あとで,剰余環の基底計算のところで応用が現れ
ます.
基底計算の実装に挑戦中
付随するデータも一緒に保持するようにすると,
以外に簡単に書けます.計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 2
Q & A :ファイルの複数部数プリントアウト
印刷ダイアログが出る⇒自明
lpr の場合
本来なら, lpr -Pp-329 -#20 ... (20部の場
合)で OKのはず⇒実際にはうまくいかないので,
lprを繰り返す (Control-P が便利)
ファイルにコマンドを複数書いて, shellで実行
sh print.sh
shellの for文を使う
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 3
Q & A :プログラミングに向いていない?
線形代数編で少し深入りしすぎた?
実際に必要となるのは,対話的なシステムで提供され
る基本機能を組み合わせて使える程度のプログラミ
ング能力
⇒あまり深刻にならずにつき合って下さい.
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 4
繰り返しの例 (つづき): πの近似計算
tan−1x = x− x3
3+ · · ·+ (−1)n−1 x
2n−1
2n−1+ Rn+1
|Rn+1| ≤ 1
2n+1|x|2n+1 (明らか)
tan−1(1) = π
4= 1− 1
3+ 1
5− · · ·
収束遅い (O(n−1))
π
4= 4tan−1 1
5− tan−1 1
239
マチンの公式⇒収束速い (剰余項が指数減少)
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 5
条件分岐
if文 ( if条件 then操作 )
「条件」が成立したときだけ「操作」を行う.
if-else文 ( if条件 then操作1 else操作2
「条件」が成立したときは「操作1」,成立しない
ときは「操作 2」を行う.
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 6
条件分岐の例例 : f(x) = 0の一解を二分法で求める
a < b, f(a) < 0, f(b) > 0とする� �
while b− a > ǫ do
c← a+b
2
if f(c) = 0 then a← c, b← c
if f(c) > 0 then b← c
else a← c
end while
return a+b
2
� �計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 7
Maxima
� �f(x):=xˆ2-4; a:0; b:4; e:10ˆ(-10);while b-a>e do (
c:(a+b)/2,fc:float(f(c)),if fc=0 then (a:c,a:c),if fc>0 then b:c else a:c
);� �
while条件式 do式
Maximaでは,繰り返しは for文というより do文
for . . . while . . . do . . .において, forの部分がない
もの計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 8
BASIC� �
LET a=0LET b=2LET e=1/10000000000DEF f(x)=xˆ2-2DO
IF b-a<=e THEN EXIT DOLET c=(a+b)/2LET fc=f(c)IF fc=0 THEN EXIT DOIF fc>0 THEN
LET b=cELSE
LET a=cEND IF
LOOPPRINT (a+b)/2END
� �EXIT DO : DOループの脱出
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 9
Asir� �
A=0$ B=2$ E=10ˆ(-10)$ f(x):=xˆ2-2$while ( B-A > E ) {
C = (A+B)/2;FC = deval(f(C));if ( FC == 0 ) { A=C; B=C; }if ( FC > 0 ) B=C; else A=C;
}print(deval((A+B)/2))$
� �
while (条件式 )文 : 「for ( ;条件式 ; )文」と同じ
deval(式) : 「式」の値を倍精度浮動小数に変換
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 10
補足 : 繰り返しからの脱出gotoで脱出
場合 (多重ループの脱出など)によってはスマート
脱出条件を (無理矢理)設定
例 : Maxima, Asirによる二分法プログラム
不自然な場合もある
ループを脱出する命令を使う
これが一般的
BASIC : EXIT DO
Asir : break (関数中でのみ使用可)
Maxima : ??? (行列の主成分を探し難い理由)
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 11
関数
組み込み関数
はじめから入っている関数 (コマンド)
ライブラリ関数
あらかじめインストールされているファイル (ラ
イブラリ)を読み込めば使える関数
ユーザ定義関数
ユーザがファイルに書くなどして定義した関数
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 12
関数の必要性
手間を省く
入力をいろいろ変えて計算を行う時に便利
部品を増やす
基本的な機能を関数にしておけば,あとで別の用
途に使える
信頼性,保守のしやすさの向上
部品毎にチェックができるので,問題の所在を調
べやすい
バグも一つの関数の修正で済む
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 13
関数定義 : Maxima
f(x,y,z) := (expr,...)
expr は式である. 式を順に計算し,最後の式の値
を返す関数 f(x,y,z) を定義している.
f(x,y,z) := block([var,...],expr,...)
上と同様であるが, block内でのみ通用する変数
(局所変数) var が宣言されている.
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 14
関数定義 : Risa/Asir
def f(X,Y,Z) { 文 文 ... 文 }
サブルーチンとしての関数を定義する.
引数 (この例では X,Y,Z )および関数内に現れる
変数は全て局所変数である.
f(x,y,z):=sin(x * y)+cos(y)+z * log(z)
数式に名前,引数をつける (数学における関数)
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 15
関数定義 : BASICDEF f(x)=xˆ2+3 * x+2
数式に名前,引数をつける
FUNCTION f(x,y)...END FUNCTION
プログラム中に書く関数である.
内部に現れる変数は他のプログラムと共有 (引数
は別).
値は LET 関数名=値で返す
SUB f(x,y)...END SUB
手続きに名前をつけたものであり,値は返さない
内部に現れる変数は他のプログラムと共有 (引数
は別).
CALL f(1,2) という形で呼び出す.計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 16
変数,特に局所変数
変数には通用範囲 (スコープ)がある.
大域変数
どのプログラムからも見える変数
局所変数
ある範囲 (通常,関数内とかブロック内)でのみ見
える変数
局所変数の実現方法 : 関数呼び出しの際に,動的に場
所が生成される
⇒再帰 (自分を別の引数で呼び出す)が可能になる
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 17
局所変数を使わないと . . .
� �my_prod(n):=(s:1,for i:1 thru n do
(t:my_sum(i),s:s * t),s);� �� �
my_sum(n):=(s:0,
for i:1 thru n do s:s+i,s);� �� �
my_sum(n):=block([s],s:0,
for i:1 thru n do s:s+i,s);� �
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 18
my prod(5) の計算
blockなし
225を返す
⇒ my_sum内で, s が毎回書き換えられる
⇒ (∑
n
k=1k)2 が返る
blockあり
my_sum内の s は局所変数
⇒ my_prod 内の s には影響を与えない
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 19
再帰プログラムの例 (Asir)
gcd(A, 0) = A
gcd(A,B) = gcd(B,R) (R = A mod B)
� �def my_gcd(A,B) {
if ( A < B )
{ T = A; A = B; B = T; }
if ( B == 0 ) return A;
else return my_gcd(B,A%B);
}� �
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 20
レポート問題入力 N に対し, 10Nπ の整数部分を返す関数を書
け. 言語は任意だが,自前で級数計算を行うこと.
オイラー定数
γ = limn→∞
(n∑
k=1
1
k− log n)
のできるだけ高精度な近似値を求めよ. (このまま
だと,収束はとても遅い)
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 21
レポート問題
A ∗X + B ∗ Y = C (A,B,C は整数)の整数解
(X,Y )を一つ求める関数を書け.
有理数の連分数展開を行う関数を書け.
p
q= a0 +
1
a1 + 1
a2+1
...+ 1an
(a0 は整数, ai (i ≥ 1)は正の整数)
n
√a, e, π などの連分数展開を推測せよ.
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 22
おまけ : Jordan標準形の計算 (Asir)
texmacsで使うのが便利です� �openxm] load("noro_matrix.rr")$
openxm] A=linalg.sample_mat(
[[1,2],[1,2],[1,3],[2,1],[2,2]])$
openxm] L=linalg.jordan_canonical_form(A)$
openxm] P=L[0]$ Z=invmat(P)$ PI=Z[0]/Z[1]$
openxm] PI * A* P;� �
計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 23
関連する関数noro_matrix.rr で定義されている
sample_mat([[a1,s1],[a2,s2...])
Jordan標準形 J(a1, s1) ⊕ J(a2, s2)⊕ · · ·を持つ行列を生成
jordan_canonical_form
Jordan標準形の計算. 出力
[P,[[a1,s1,n1],...] は,変換行列 P ,
Jordan標準形が⊕n1i=1J(a1, s1)⊕ · · ·を意味する.
詳細は授業ページの noro_matrix-ja.pdf を
参照計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 24
Recommended