Top Banner
2008 ( 7 ) ( 2) 2008 ( 7 ) ( 2) – p. 1
24

計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

Aug 12, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

計算情報数学 2008 (第 7回)プログラミング入門 (その2)

野呂正行

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 1

Page 2: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

Q & A :線形代数編について

少し難しかった

ちょっとやりすぎたでしょうか.

固有値,固有ベクトルの話ができなかったのは

残念.

線形代数を復習しないと . . .

あとで,剰余環の基底計算のところで応用が現れ

ます.

基底計算の実装に挑戦中

付随するデータも一緒に保持するようにすると,

以外に簡単に書けます.計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 2

Page 3: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

Q & A :ファイルの複数部数プリントアウト

印刷ダイアログが出る⇒自明

lpr の場合

本来なら, lpr -Pp-329 -#20 ... (20部の場

合)で OKのはず⇒実際にはうまくいかないので,

lprを繰り返す (Control-P が便利)

ファイルにコマンドを複数書いて, shellで実行

sh print.sh

shellの for文を使う

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 3

Page 4: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

Q & A :プログラミングに向いていない?

線形代数編で少し深入りしすぎた?

実際に必要となるのは,対話的なシステムで提供され

る基本機能を組み合わせて使える程度のプログラミ

ング能力

⇒あまり深刻にならずにつき合って下さい.

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 4

Page 5: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

繰り返しの例 (つづき): πの近似計算

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

Page 6: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

条件分岐

if文 ( if条件 then操作 )

「条件」が成立したときだけ「操作」を行う.

if-else文 ( if条件 then操作1 else操作2

「条件」が成立したときは「操作1」,成立しない

ときは「操作 2」を行う.

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 6

Page 7: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

条件分岐の例例 : 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

Page 8: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

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

Page 9: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

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

Page 10: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

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

Page 11: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

補足 : 繰り返しからの脱出gotoで脱出

場合 (多重ループの脱出など)によってはスマート

脱出条件を (無理矢理)設定

例 : Maxima, Asirによる二分法プログラム

不自然な場合もある

ループを脱出する命令を使う

これが一般的

BASIC : EXIT DO

Asir : break (関数中でのみ使用可)

Maxima : ??? (行列の主成分を探し難い理由)

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 11

Page 12: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関数

組み込み関数

はじめから入っている関数 (コマンド)

ライブラリ関数

あらかじめインストールされているファイル (ラ

イブラリ)を読み込めば使える関数

ユーザ定義関数

ユーザがファイルに書くなどして定義した関数

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 12

Page 13: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関数の必要性

手間を省く

入力をいろいろ変えて計算を行う時に便利

部品を増やす

基本的な機能を関数にしておけば,あとで別の用

途に使える

信頼性,保守のしやすさの向上

部品毎にチェックができるので,問題の所在を調

べやすい

バグも一つの関数の修正で済む

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 13

Page 14: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関数定義 : 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

Page 15: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関数定義 : 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

Page 16: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関数定義 : 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

Page 17: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

変数,特に局所変数

変数には通用範囲 (スコープ)がある.

大域変数

どのプログラムからも見える変数

局所変数

ある範囲 (通常,関数内とかブロック内)でのみ見

える変数

局所変数の実現方法 : 関数呼び出しの際に,動的に場

所が生成される

⇒再帰 (自分を別の引数で呼び出す)が可能になる

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 17

Page 18: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

局所変数を使わないと . . .

� �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

Page 19: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

my prod(5) の計算

blockなし

225を返す

⇒ my_sum内で, s が毎回書き換えられる

⇒ (∑

n

k=1k)2 が返る

blockあり

my_sum内の s は局所変数

⇒ my_prod 内の s には影響を与えない

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 19

Page 20: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

再帰プログラムの例 (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

Page 21: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

レポート問題入力 N に対し, 10Nπ の整数部分を返す関数を書

け. 言語は任意だが,自前で級数計算を行うこと.

オイラー定数

γ = limn→∞

(n∑

k=1

1

k− log n)

のできるだけ高精度な近似値を求めよ. (このまま

だと,収束はとても遅い)

計算情報数学 2008 (第 7回)プログラミング入門 (その 2) – p. 21

Page 22: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

レポート問題

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

Page 23: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

おまけ : 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

Page 24: 計算情報数学 第 回 プログラミング入門条件分岐 if 文( if 条件then 操作) 「条件」が成立したときだけ「操作」を行う. if-else文( if 条件then

関連する関数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