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

削除された内容 追加された内容
数値計算のプログラム例
 
計算手法の解説を追加。
1 行
==数値計算とコンピューター==
実際の教科書が手に入らないので何を書いたら良いか分らないのですが、
とりあえず、ユークリッド互除法、2分法、台形公式のプログラム例を
書きます。
言語は(趣味にはしって)pythonです。
おそらく実際の学校現場では
ユビキタスなVisual Basicが採用されるものと思うのですが、
残念ながら筆者はVisual Basicを持っていないので、
別の言語を使っています。
(プログラムに間違いがあったらすみません。)
(とはいえ、無保証でということなので
諦めてもらえるとありがたいです。)
 
<!-- 実際にはどの言語が用いられるのだろうか? -->
<!-- やはりVisual Basic? -->
<!-- (先生の立場も考えると) -->
 
初等的な算法を扱い、計算機を用いて
それを計算する方法を学ぶ。
プログラム例としては、pythonという言語を扱うが
言語の詳細に立ち入らず、考え方を学ぶことが重要となる。
 
===整数の算法===
 
====ユークリッド互除法====
 
ユークリッドの互除法は2つの整数の間の最大公約数を求める
算法である。
 
ある整数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)
が成り立つ。
ここで、仮にn、rが共通因数を持つならその因数は
mの因数でもあるがこれはm、nが互いに素であることに矛盾する。
よって、n、rは互いに素である。
ここから上の1、2を行なうと互いに素でありより小さい2つの整数n,rが得られる。
これを繰りかえすと小さい側の整数は1となる。
実際 余りが2以上になるときは2数が互いに素であることから
次の計算で更に小さい数が得られ、
余りが0になることは小さい方の数が1である場合を除いて、
2数が互いに素であることに反する。
<!-- また、余りは負になることは出来ない。(?) -->
よって、確かに小さい側の整数は1となる。
よって、m,nが互いに素であるときユークリッドの互除法は確かめられた。
 
次にm,nが最大公約数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が共通因数を持つ場合にもユークリッド互除法は示された。
 
実際の計算には 計算機を用いると
(特に2数が大きいときには)便利である。
 
<!-- よく見ると上の導出の方針と違っている...。 -->
def euclid():
39 ⟶ 97行目:
#(left ,right)= (45 ,30)
#(45 ,28),(30 ,28)
 
 
===実数の算法===
 
==== 2分法====
 
ある関数f(x)とx軸との接点を求める方法の1つに、2分法がある。
特にf(x)が求める点で正の傾きを持っているものとして考える。
この方法は、
*1 範囲[a,b]内にx軸と求める関数f(x)の接点が含まれるように、2数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]の中点を取り、解が中点から見てどちらにあるかを
判断し、範囲を狭めていく方法である。
 
プログラム例
 
def bisection():
#Could be a too simple function. But seems ok,
66 ⟶ 142行目:
print bisection()
#ok that work well if I put
71 ⟶ 148行目:
# x-1 or x**2 - 1
#The result of both calculation was 1.0.
 
 
このコードはf(x)=x-1、または、f(x)=<math>x^2-1</math>のときに
試された。結果はどちらもx=1.0となり、正しい値を
返している。
 
 
==== 台形公式====
 
台形公式は、あるグラフ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=\sum _{i=0} ^N s _i
</math>
で近似できることが分かる。
 
プログラム例では、半径1の円の面積を近似的に求め、
それによって<math>\pi</math>の値を計算する。
from math import sqrt,pi
97 ⟶ 202行目:
#the result reads
#0.782116219939 for trapezoid_formula()
#0.785398163397 for pi/4
 
 
実際の<math>\pi</math>の値と近い値が得られていることが分かる。