スプレッドシートを使う その2
今日の演習内容
微分(差分)
今週はスプレッドシートの本来の使い方とは少し違う使い方をしてみる。
数学では関数の微分を行なうことがあるが、
これを数値計算で行なう作業を「差分をとる」
という。
微分の定義に立ち帰ると x の関数 f の微分は、
df/dx = limdx -> 0 (f(x+dx)-f(x))/dx
である。
数値計算では dx を本当にゼロまでは持っていけないので、
有限の(ただし小さい)dx を使って微分を近似計算する。
今回はサイン関数 sin(x) の x
による差分を例として計算してみる。
準備
- スプレッドシートの計算機能を使って、
サイン関数 sin(x) の x
による差分計算をしてみる。
- まず Applix スプレッドシート を起動する。
「メインメニュー」の「センターメニュー」「アプリケーション」
「Applixware オフィススイート」「Applix スプレッドシート」
をクリック。
- シート中のセルA1からE1に
「x」「sin(x)」
「diff」「diff/dx」
「cos(x)」と書き込む。
従って、これから列Aに変数 x の値、列Bに sin(x) の値
(差分をとるべき関数値)、列Cに sin(x+dx)-sin(x) の値、
列Dに差分の値(つまり (sin(x+dx)-sin(x))/dx の値)、
列Eに差分と比較するために sin(x) の微分値(つまり cos(x) の値)
をそれぞれ入力して行く。
- またセルG1に
「dx」と書き込み、
セルG2に数値
0.1 を入力する。
従って、dx の値として 0.1 を使うことにする。
後に説明するが、
この数値 0.1 はいつでも変更可能で、
差分や微分の計算に反映できる。
変数 x の数値入力
- セルA2に数値
0 を入力する。
これが変数 x の最小値になる。
- セルA3に以下のように入力する。
=A2+$G$2
この式は、基本的にはセルA2(x の最小値)とG2(dx の値)
を足しなさいという計算だが、「G2」が「$G$2」となっている。
この「$」の意味については次に述べる。
- セルA3の内容を、他の列Aのセルにコピーする。
まずセルA3を選択し(セルA3をクリック)、
「編集」プルダウンメニューの
「コピー」をクリック。
次にセルA4からA70を選択。
セルA4でマウスボタンを押し、
ポインターをA70まで移動した後にマウスボタンを離しても良いが、
マウスの動きに対して画面スクロールが速く動き過ぎるので、
最初にA70でマウスボタンを押し、
A4まで移動する方がセル選択がし易い。
「編集」プルダウンメニューの
「貼り付け」をクリック。
この操作で、dx ずつ(0.1 ずつ)増加する数値が列Aに入ったはず。
これと同等のことを手で入力するのは大変なことは予想できるはず。
- ここでコピーされたセルA4の数式を見てみる
(セルA4をクリック)。
内容は以下のようになっているはず。
=A3+$G$2
前回の演習内容で、セルのデータを別のセルにコピーしたときには、
今回のようにセルA4がコピー元のセルA3から見て、位置が
縦に1行ずれている場合は、
=A3+G3
となるはずであるが、「$G$2」は「$G$3」とは変わらずに元のままである。
今回の作業では、常に 0.1 というセルG2の値だけ増加させたいので、
これで良いのである。
もし $G$3 となってしまうとセルG3は空白なので 0 が足されてしまう
(従って x が増加してくれない)。
- 予想が付くと思うが「$」は、
セルの数式を他のセルにコピーした際に、
セルの列や行を変更しないようにするための指定法である。
「$」 は列と行それぞれに付けたり付けなかったり出来る。
例えばセルの列は変更せず行は自動変更する場合には
「$G2」のように、
セルの列は自動変更し行は変更しない場合には
「G$2」
のようにも指定できる。
今回の場合はA3のセルを以下のようにしても結果は同じである。
=A2+G$2
関数 sin(x) の用意
- 変数 x が用意できたので、関数 sin(x) を計算するのは簡単である。
まずB2に以下のように入力する。
=sin(A2)
サイン関数はスプレッドシートの関数として用意されている。
A2のセルには x の値が入っているのでセルB2には、
その x の値に対応して sin(x) の値が入ることになる。
- あとは単純にセルB2の数式を、
セルB3からB70までコピーすれば良い。
差と差分の計算
- 差 sin(x+dx)-sin(x) の計算は簡単である。
セルC2に以下のように入力する。
=B3-B2
- あとはセルC2の数式を、
セルC3からC69までコピーすれば良い。
ここで、セルの最後がC69になっているのは、
もしセルC70にもコピーを行なった場合セルの数式が
=B71-B70
となってしまうためである。
B71は定義されていないので(計算上は 0 と見なされる)
変な結果になってしまう。
- 同様に差分の計算は、
まずセルD2に以下のように入力する。
=C2/$G$2
ここでも dx の値が入っているセルG2は変化させたくないので、
「$」を付けている。
あとはセルD2の数式を、
セルD3からD69までコピーすれば良い。
先にも言ったように、上の数式は
=C2/G$2
としても結果は同じである。
- 差の計算と差分の計算を一緒にするのであれば以下の数式を用いても良い。
=(B3-B2)/$G$2
この場合には列Cの設定は必要無くなる。
関数 cos(x) の用意
- 差分の結果と比較するために関数 cos(x) を計算する。
やりかたは sin(x) の場合と同様で、まずE2に以下のように入力する。
=cos(A2)
コサイン関数はスプレッドシートの関数として用意されている。
- あとはセルE2の数式を、
セルE3からE69までコピーすれば良い。
差分と微分の比較
- これまでの入力と操作で、サイン関数の差分(列D)
とサイン関数の微分(コサイン関数、列E)が計算できているので、
数値的には比較可能である。
これを視覚的に見るためにグラフを描くことにする。
- まずセルの領域A2からA69を選ぶ。
これがグラフのX軸になる。
行1を選ぶとうまくグラフにならないので行1は避けた(バグ?)。
- 更にY軸の値としてサインの差分と微分を選ぶ。
先ほどのセルの領域に追加したいので、キーボードの
CTRL キーを押しながら、
セルの領域D2からE69を選ぶ。
- この状態で、グラフのボタン
(「棒グラフ」のアイコン)をクリック。
ポインターが小さな棒グラフとなるので、
シートの適当な場所でマウスボタンを押し、
そのままポインターを適当な量だけ移動する。
長方形の領域が表示され、それがグラフの描画領域となる。
- 後はグラフ描画のウィザードに従ってグラフ描画の条件を決めて行く。
今回のグラフは、「散布図」のグラフとし
(中段左から3番目)、
点と点をつなぐように指定すること
(下段左から2番目)。
- 差分計算は結構精度が良いことが分かるはず。
違いを見るには図を横長に引き延ばすのが良い。
シートの dx の値を変化させると、
シート中の差分値計算の結果が変化し、またグラフの内容も変化する。
dx の値により計算精度が変わる様子を見ると良い。
- なお間違って作ったグラフを消すには、「編集」プルダウンメニューの
「削除」「オブジェクト」で「グラフ」を削除する。
以上の操作で出来たシートを前回作った spred というディレクトリーに、
Applix スプレッドシート固有の形式で保存する。
「ファイル」プルダウンメニューの
「上書き保存」をクリック。
ファイル名を付けて保存。
ここでは差分される関数としてサイン関数を用いたが、
一般的には差分されるものは数値データでも良い。
また変数 x の間隔も今回は一定であったが、
一般には非等間隔の x について与えられた数値データの差分が計算できる。
数値積分
今度はスプレッドシートの計算機能を使って、
差分の逆操作である数値積分をやってみる。
まず積分の定義を思い出すことにする。
積分区間を dx の長さで N 等分した場合の各分割点での関数 f
の値を fN と書くと、関数 f の x
に関する積分は以下のように定義できる。
limdx -> 0( f0dx + f1dx + ... + fNdx )
数値積分では dx を無限小には持っていけないので、ある有限の(ただし小さい)
dx で数値計算を行なう。
今回積分する関数は 1/x とし、不定積分を計算する。
積分区間の下限は x=1 とする。
準備
- 「ファイル」プルダウンメニューの「新規作成」で新しいシートを用意する。
- セルA1からE1に
「x」
「1/x」
「(1/x)dx」
「sum of (1/x)dx」
「log(x)」と書き込む。
従って、列Aが変数 x の値、列Bが積分すべき関数 1/x の値、
列Cが被積分関数と微小な変数 x の区間 dx の積、
列Dが数値積分の結果、列Eが比較のための関数 loge(x)
の値というように計算してゆく。
- セルG1に dx
と書き込み、その値 0.1
をセルG2に書き込む。
- 先ほどと同じやりかたで x の準備をする。
セルA2に x の初期値
1 を入力。
セルA3には以下の数式を書き込む。
=A2+$G$2
更にセルA3の数式を、
セルA4からA70までコピー。
これで変数 x の用意が出来たはず。
被積分関数の用意から数値積分まで
- 次に被積分関数 1/x の値を用意する。
セルB2に以下の数式を入れる。
=1/A2
更にセルB2の数式を、
セルB3からB70までコピーする。
- 被積分関数と dx の積を計算する。
セルC2に以下の数式を書き込む。
=B2*$G$2
またセルC2の内容を、
セルC3からC70までコピーする。
- 数値積分は列Cの数値を順次足して行けば良い。
まず積分区間の下限では積分値がゼロなので、
セルD2に
0 を代入。
セルD3には以下の数式を代入。
=D2+C2
後はセルD3の数式を、
セルD4からD70までコピー。
この操作で列Cの和が順次とれることは、良く考えれば分かるはず。
- もちろんセルCの計算とセルDの計算は、
=D2+B2*$G$2
と書けば列Cは省略できる。
ここでは、計算の手順が分かり易いように列Cを一旦入れている。
関数 loge(x) の用意
- 数値積分の結果と比較するために関数 loge(x) を計算する。
E2に以下のように入力する。
=ln(A2)
自然対数 e を底とするログ関数は、
スプレッドシートの関数として用意されている。
関数の名前が ln(log natural の意味)である点に注意。
- あとはセルE2の数式を、
セルE3からE70までコピーすれば良い。
数値積分と解析的な積分の比較
- 1/x の数値積分(列D)と解析的な積分結果である loge(x)
(列E)の違いを視覚的に見るためにグラフを描く。
- セルの領域A2からA70を選ぶ
- 更にキーボードの
CTRL キーを押しながら、
セルの領域D2からE70を選ぶ。
- この状態で、グラフのボタン
(「棒グラフ」のアイコン)をクリック。
ポインターが小さな棒グラフとなるので、
シートの適当な場所でマウスボタンを押し、
そのままポインターを適当な量だけ移動する。
- 後はグラフ描画のウィザードに従ってグラフ描画の条件を決めて行く。
今回のグラフも、「散布図」のグラフとし、
点と点をつなぐように指定すること。
- 数値積分は結構精度が良いことが分かるはず。
シートの dx の値を変化させると、
シート中の差分値計算の結果が変化し、またグラフの内容も変化する。
dx の値により計算精度が変わる様子を見ると良い。
以上の操作で作ったシートを、Applix スプレッドシートの固有形式で保存する。
スプレッドシートで力学?
これまでやったことの応用として、スプレッドシートの計算機能を使い、
力学で出て来るようなニュートンの運動方程式の、数値解を求めることにする。
扱う運動方程式は最も簡単なバネの振動の運動方程式とする。
運動方程式は、例えば、
m d2x/dt2 = - kx
のように書けるが、簡単のために m=k=1 としてしまう。
従って扱う微分方程式は、
d2x/dt2 = - x
となる。
準備
- 「ファイル」プルダウンメニューの「新規作成」で新しいシートを用意する。
- まずセルA1からE1に、
「t」
「x」
「v」
「a」
「sin(t)」
と書く。
従って、列Aには時刻 t の値(今回は位置 x が時間 t
の関数であることに注意)、列Bには位置 x の値(これが運動方程式の解)、
列Cには速度 v の値、列Dには加速度 a の値、
列Eには比較のために運動方程式の特解の一つである sin(t)
の値を書き込むことになる。
- 更にセルG1に
dt と書き込み(微小な時間)、
その値 0.1
をセルG2に書き込む。
- 時刻 t の値を入力する。
時刻の初期値をゼロとするので、
セルA2に
0 を記入。
セルA3には以下の数式を書き込む。
=A2+$G$2
後はセルA3の数式を、
セルA4からA70までコピーすれば、
時刻 t の値が用意できる。
位置、速度、加速度の計算
- まず位置 x と速度 v の初期値を設定する。
セルB2とC2にそれぞれ、
0 と 1
を入力する。
これにより、時刻 t=0 の位置が x=0 速度が v=1
と設定されたことになる
(運動方程式の特解を決めるには2つの条件が必要)。
- 次に運動方程式を使うと加速度 a が計算できる。
セルD2に以下のように書き込む。
=-B2
- 加速度 a が与えられると速度 v が計算できる。
加速度と速度の関係は、
dv/dt = a
であり、これを書き直すと、
dv = a dt
となり、これが時間 dt の間の速度 v の変化量となる。
これを考慮すると、
セルC3には以下のような数式を代入すれば良い。
=C2+D2*$G$2
- 位置 x に付いても同様の考察を行なうと、
セルB3に入れる式は以下のようになる。
=B2+C3*$G$2
ここで、速度の計算のときと違って、
速度の行3の値(C3)を使っているが、
この方が数値計算結果の精度が良いのでこうした(余り気にしないように)。
- 最後にセルD2の数式を、
セルD3にコピーすれば、
列BからDまでの3行目が全てそろったことになる。
- セルB3からD3までをそれ以外の行にまとめてコピーする。
まずセルB3からD3までを選択する
(セルB3でマウスボタンを押し、
ポインターをD3まで移動しマウスボタンを離す)。
この状態で「編集」
プルダウンメニューの「コピー」をクリック。
次にセルB4からD70を選択
(3列を一気に選択している点に注意)。
この状態で「編集」
プルダウンメニューの「貼り付け」をクリック。
このように、1つのセルだけでなく複数のセルを一気にコピーすることもできる
(ただしあまり変なセルの選択をしない限り)。
特解 sin(x) の計算とグラフ化
- セルE2に以下のように入力。
=sin(A2)
後はセルE2の数式を、
セルE3からE70までコピーする。
- 時刻 t(列A)、数値計算による位置 x(列B)、
解析的に解いた場合の特解 sin(x)(列E)
をグラフにしてみる。
ここでも「散布図」のグラフが見易い。
- 数値計算による微分方程式の解は結構精度が良いことが分かるはず
(dt が 0.1 の場合にはほとんど区別が付かない)。
時間の区切りの大きさ dt を変化させると計算精度が変わるのが見れるはず。
以上の操作で出来たシートを Applix スプレッドシートの固有形式で保存する。