「旧課程(-2012年度)高等学校数学B/数値計算とコンピューター」の版間の差分

削除された内容 追加された内容
編集の要約なし
1 行
==数値計算とコンピューター==
初等的な算法を扱い、計算機を用いてそれを計算する方法を学ぶ。プログラム例としては、[[Python]]と[[Scheme]]という言語を扱うが言語の詳細に立ち入らず、考え方を学ぶことが重要となる。
 
<!-- 実際にはどの言語が用いられるのだろうか? -->
<!-- やはりVisual Basic? -->
<!-- (先生の立場も考えると) -->
 
初等的な算法を扱い、計算機を用いて
それを計算する方法を学ぶ。
プログラム例としては、[[Python]]と[[Scheme]]いう言語を扱うが
言語の詳細に立ち入らず、考え方を学ぶことが重要となる。
 
===整数の算法===
====ユークリッドの互除法====
 
ユークリッドの互除法は2つの整数の最大公約数を求める算法である。ある整数m, n (m > n > 0) をとる。このときユークリッドの互除法は
====ユークリッド互除法====
#mをnで割った余りを計算し、それをrとおく。このときr=0なら3に進み、r<math> \ne </math> 0なら、2に進む。
 
#mを以前のnの値で置き換え、nをrの値で置き換え、1に戻る。
ユークリッドの互除法は2つの整数の間の最大公約数を求める
#nの値が最大公約数となっている。
算法である。
 
ある整数m,n(m<math>></math>n<math>></math>0)をとる。
このときユークリッドの互除法は
*1 mをnで割った余りを計算し、それをrとおく。このときr=0なら3に進み、
r<math> \ne </math> 0なら、2に進む。
*2 mを以前のnの値で置き換え、nをrの値で置き換え、1に戻る。
*3 nの値が最大公約数となっている。
で与えられる。
 
(導出)
 
m,nが互いに素であるときを考える。mをnで割った商をa、余りをrとするとき、
:<math>m=na+r</math> (r<math><</math>n<math><</math>m)
mをnで割った商をa、余りをrとするとき、
が成り立つ。ここで、仮にn、rが共通因数を持つならその因数はmの因数でもあるがこれはm、nが互いに素であることに矛盾する。よって、n、rは互いに素である。ここから上の1、2を行なうと互いに素でありより小さい2つの整数n,rが得られる。これを繰りかえすと小さい側の整数は1となる。
<math>
m=na+r
</math>
(r<math><</math>n<math><</math>m)
が成り立つ。
ここで、仮にn、rが共通因数を持つならその因数は
mの因数でもあるがこれはm、nが互いに素であることに矛盾する。
よって、n、rは互いに素である。
ここから上の1、2を行なうと互いに素でありより小さい2つの整数n,rが得られる。
これを繰りかえすと小さい側の整数は1となる。
実際 余りが2以上になるときは2数が互いに素であることから
次の計算で更に小さい数が得られ、
余りが0になることは小さい方の数が1である場合を除いて、
2数が互いに素であることに反する。
<!-- また、余りは負になることは出来ない。(?) -->
よって、確かに小さい側の整数は1となる。
よって、m,nが互いに素であるときユークリッドの互除法は確かめられた。
 
実際余りが2以上になるときは2数が互いに素であることから、次の計算で更に小さい数が得られ、余りが0になることは小さい方の数が1である場合を除いて、2数が互いに素であることに反する。よって、確かに小さい側の整数は1となる。よって、m,nが互いに素であるときユークリッドの互除法は確かめられた。次にm,nが最大公約数Mを持つときを考える。このときもmをnで割った商をa、余りをrとするとき、
次にm,nが最大公約数Mを持つときを考える。
:<math>m=na+r</math> (r<math><</math>n<math><</math>m)
このときもmをnで割った商をa、余りをrとするとき、
<math>
m=na+r
</math>
(r<math><</math>n<math><</math>m)
が成り立つが、
:<math>r = m - na</math>
を考えると、rもm、nと同じ最大公約数Mを持つ。r,m,nをMで割ったものをそれぞれr',m',n'とおくと、これらは互いに素であるが(最大公約数の定義)、このとき上の2数が互いに素であるときのユークリッド互除法の導出から小さい方の整数は1が得られる。よって元の整数に戻るためにMをかけることで、この方法が2数の最大公約数Mを与えることが分かる。よって、m、nが共通因数を持つ場合にもユークリッド互除法は示された。
r = m - na
</math>
を考えると、rもm、nと同じ最大公約数Mを持つ。
r,m,nをMで割ったものをそれぞれr',m',n'とおくと、
これらは互いに素であるが(最大公約数の定義)、このとき上の
2数が互いに素であるときのユークリッド互除法の導出から小さい方の整数は
1が得られる。よって元の整数に戻るためにMをかけることで、この方法が2数の
最大公約数Mを与えることが分かる。
よって、m、nが共通因数を持つ場合にもユークリッド互除法は示された。
 
実際の計算には 計算機を用いると(特に2数が大きいときには)便利である。
(特に2数が大きいときには)便利である。
 
[[Python]]によるプログラム例
<!-- よく見ると上の導出の方針と違っている...。 -->
def euclid():
100 ⟶ 55行目:
 
[[Scheme]]によるプログラム例
<!-- 上の導出の方針に従いました。 -->
 
(define (euclid m n)
117 ⟶ 71行目:
 
===実数の算法===
 
==== 2分法====
ある関数f(x)とx軸との接点を求める方法の1つに、2分法がある。特にf(x)が求める点で正の傾きを持っているものとして考える。この方法は、
 
# 範囲[a,b]内にx軸と求める関数f(x)とx軸との接点を求めが含まれ方法の1つように、2分法があ数a,bを定める。
# mid_point = (a+b)/2 を計算する。もしf(mid_point)が十分に0に近ければ4に進む。
特にf(x)が求める点で正の傾きを持っているものとして考える。
# もしf(mid_point)<math>></math>0なら、mid_pointの値をbの値に代入し、2に戻る。もし、f(mid_point)<math><</math>0なら、mid_pointの値をaの値に代入し、2に戻る。
この方法は、
*1# 範囲[a,b]内にx軸とmid_pointの値が求める関数f(x)の接点が含まれるように、2数a,bを定めのx座標である。
この方法は元々の範囲[a,b]の中点を取り、解が中点から見てどちらにあるかを判断し、範囲を狭めていく方法である。
*2 mid_point = (a+b)/2 を計算する。もしf(mid_point)が十分に
0に近ければ4に進む。
*3 もしf(mid_point)<math>></math>0なら、
mid_pointの値をbの値に代入し、2に戻る。もし、f(mid_point)<math><</math>0なら、
mid_pointの値をaの値に代入し、2に戻る。
*4 mid_pointの値が求める接点のx座標である。
 
この方法は元々の範囲[a,b]の中点を取り、解が中点から見てどちらにあるかを
判断し、範囲を狭めていく方法である。
 
[[Python]]によるプログラム例
167 ⟶ 112行目:
 
 
このコードはf(x)=x-1、または、f(x)=<math>x^2-1</math>のときに試された。結果はどちらもx=1.0となり、正しい値を返している。
試された。結果はどちらもx=1.0となり、正しい値を
返している。
 
[[Scheme]]によるコード例
189 ⟶ 132行目:
;;1.0000000000291038
 
このコードもλ(x)=x-1、または、λ(x)=<math>x^2-1</math>のときに試された。[[Python]]版と違うが、結果はどちらもx=1.0に極めて近い値を返している。計算精度の違い、である。
試された。[[Python]]版と違うが、結果はどちらもx=1.0に極めて近い値を返している。
計算精度の違い、である。
 
==== 台形公式====
台形公式は、あるグラフf(x)とx軸とx=a,x=bに囲まれた面積を近似的に求める公式である。この公式では、[a,b]の範囲をN個の小さい範囲に分け、i個目の範囲を、<math>[x _i,x _{i+1}]</math>と書く。このときその範囲においては求める面積を台形で近似しても面積のずれは小さい。
 
台形公式は、あるグラフf(x)とx軸とx=a,x=bに囲まれた面積を
近似的に求める公式である。
この公式では、[a,b]の範囲をN個の小さい範囲に分け、
i個目の範囲を、<math>[x _i,x _{i+1}]</math>と書く。
このときその範囲においては求める面積を
台形で近似しても面積のずれは小さい。
:正確な面積と台形の面積のずれの絵
ここで、台形の面積<math>s _i</math>は
:<math>
s _i = \frac12 \{ f(x _i)+f(x _{i+1}) \} \cdot (x _{i+1}-x _i )
</math>
で書かれることを考慮すると、求める面積Sは
:<math>
求める面積Sは、
<math>
S=\sum _{i=0} ^N s _i
</math>
で近似できることが分かる。
 
[[Python]]によるプログラム例では、半径1の円の面積を近似的に求め、それによって<math>\pi</math>の値を計算する。
それによって<math>\pi</math>の値を計算する。
<!-- この説明はちょっと違うのでは? -->
<!-- 実際は、4分の1円の面積を求め、それとpi/4の数値の比較を行っているだけ、だと思う。 -->