区分求積法とその周辺
この節では、高校数学での区分求積法(の図)から始め、大学で学ぶ積分の概念の図を描くことを考えます。
区分求積法
まず、高校数学(数III)での区分求積法です。
高校数学の区分求積法では、[0,1]区間をn等分するのですが、もう少し一般化して、[a,b]区間をn等分した図にします。
放物線より波型のほうがいいでしょうから、f(x)=x+sinx 型のグラフを利用します。xの係数を 1/2 にするとちょうどいい具合になります。
グラフは
Deffun("f(x)",["regional(y)","y=1/2*x+sin(x)","y"]);
Plotdata("1","f(x)","x=[0,2*pi]");
で描けます。
x軸の目盛の数は、πと2πでよいでしょう。
Expr([[pi,0],"s","\pi",[2*pi,0],"s","2\pi"]);
さて、nを設定して [0,2π] をn等分し、矩形を書きます。
このとき、高校数学では、左側の高さをとったものと、右側の高さをとったものを考えます。
まず左から。
repeat(n,t,
x1=(t-1)/n*2*pi;
x2=t/n*2*pi;
name=text(t);
Listplot(name,[[x1,0],[x1,f(x1)],[x2,f(x1)],[x2,0]]);
);
Cinderellaの画面ではちゃんと矩形になっていませんが(下があいてる)これで座標軸をつけて書き出せば問題ないですね。
画面でも座標軸があったほうがよければ(教材としてみせるために)、線分ツールで軸を描いて、矢じりをつけておきます。x,y の文字は、点のラベルでつければよいでしょう。点の大きさは最小にしておきます。原点もつけておきましょう。O の位置は、ラベルOを Shift+ドラッグ すれば位置を変えることができます。軸を描いたら、背景の軸と方眼は非表示にしておきましょう。
これらは、画面上に表示されるだけで TeXには書き出されません。
矩形を色ぬりしてみましょう。TeXの図ではモノクロでよいでしょうから、濃度だけ適当に決めます。
色塗りは Shade() を使いますが、画面の色と透明度は color オプションと alpha オプションを使います。
次のスクリプトを Listplotの次、repeat の閉じかっこの前に追加します。
Shade(["sg"+name],[0.2,"color->[0,1,0],alpha->0.2"]);
他の設定も合わせて、ここまでのスクリプトと、その結果の図、TeXの図を示します。
高さを右側に取るには、Listplot の座標を変えるだけです。
nの値を変えるのに、いちいち書き直すのは面倒なので、スライダを作ってインタラクティブに変えられるようにしましょう。その方が提示教材にするときに便利です。
適当な長さの線分と、その上に点を作図します。
これまでの手順だと、線分は FG 、点は H になるでしょう。端点のF,Gはインスペクタで「ピンで留める」にしておきます。そうしないと、 F,G を不用意に動かしてしまうことがあります。
Hの位置でnの値を決めます。たとえば、次のようにします。
n=ceil(|H,F|*10);
ceil(x) は天井関数です。x以上の最小の整数。|H,F|はHとFの距離。
スライダを動かした時の分割数 n はどこかに表示しましょう。たとえば、点Hの下。
drawtext(H-[0,0.5],n);
次に、矩形の面積の和です。repeat の繰り返しの中で、一つの矩形を表示するたびに面積を計算して合計していきます。
repeat の前に sum=0 を書いておき、repeat の中で s=s+面積とします。
sum=sum+(x2-x1)*f(x1);
数式は EXpr を使って入れます。中は $を略してTeXの書式で書きます。
これで、TeXの図としてはよいでしょう。定積分の計算と結果は本文に書くことになるでしょう。
高さを区間の右側に取る場合もわずかな変更でできますね。
教材提示用の図を描く
ここからは、この図を提示教材としても使う場合の話です。
まず、スライダを動かして分割数を増やしていくと定積分の値に近づくことを見せたいので、定積分の式と値も表示します。
Expr([1,4.5],"e","\displaystyle \int_0^{2\pi} \left(\frac{1}{2} x+\sin x\right)dx {\doteqdot}"+text(Integrate("1/2*x+sin(x)","x",[0,2*pi],"s")));
で書けるのですが、見せるには字の大きさが小さいでしょう。
KETCindy には Fontsize("la"); というフォントサイズを指定する関数がありますが、残念ながらCinderellaの画面にはその大きさは反映されません。
画面だけに必要なので、Cindyscript の drawtext() で書くことにします。
合わせて、和の式も、Letter のオプションに "nodisp" をつけて非表示にし、別途 drawtext() で表示します。
さて、実際にやってみると、分割数nを大きくして行ったとき、9.87 になかなか近づかないことがわかるでしょう。
分割数を70,80とすると値の動きが鈍くなります。もっと大きくしたいけれど、スライダの線分をどんどん伸ばすといっても限界があります。
そこで、直線スライダではなく、円スライダを使います。一般角を考えると、角の値は円周上を何度も回せばどんどん大きくできます。そして、Cinderellaでは、角を一般角で扱えるという大きなメリットがあるのです。
まず、適当な大きさの円を描き、2つの半径をとります。そして、この角度を「角度を測る」ツールで測ります。
文字が重なって見にくいのですが、点Mを動かしてみましょう。1周を過ぎると角は360°を超えるでしょう。
「表示」メニューから「式による表示」を選ぶと、この角が α0 という名称で、角度はText0で表されていることがわかります。(他に文字を表示したりしている場合は番号が変わります)
この α0 で角を取得できるのです。
インスペクタを使って点や線のラベルを非表示にしたり、大きさを変えたりして図をスッキリさせましょう。角度の表示も非表示にします。
先ほどのスライダのスクリプトを次のように書き換えます。
n=ceil(abs(α0)*10);
drawtext([8.5,1],"n="+n,size->20);
表示位置は適当に決めます。
α0 にabs(絶対値)をつけているのは、一般角には負もあるのと、角によっては虚数になることがあるためです。
これで、nをどんどん大きくしたのが次の図です。大きくなると計算量も増えるので反応が遅くなるのであしからず。
図は矩形がわからないくらい黒くなってきました。まだすこし届きませんが、戻すのもたいへんなのでこのくらいでよいでしょう。(スクリプトでは元に戻せません)
あとは、直接 n=500 のように指定して計算してみればよいでしょう。n=3000 くらいで 9.87(四捨五入で)になりますが、計算が終わるまで結構待つことになります。
高校数学ではここまでです。矩形の面積和の極限が定積分の値であるとして、シグマ計算を定積分で行うという問題が出題されます。
大学では、さらに、一般化して、等分しないで、しかも、矩形の高さをその区間での最大値にとったりします。リーマン積分、リーマン・スティルチェス積分、ルベーグ積分と進んでいくわけですが、ここでは等分しない場合やリーマン積分の図もやってみましょう。高校数学+αとして高校の授業で言及しても面白いでしょう。
等分しないで矩形の和を取る
区間の幅を一様にしないで、乱数でとることにします。
まず、適当な乱数列を作ります。
rnd=apply(1..n,randomint(10)+1);
randomint(10) で0から9までの整数の乱数ができます。10は適当な値ですが、合計が2πより大きくなければいけないので、2や3では小さすぎます。
この乱数列の合計と2πで比例計算をすれば、n個の区間の幅が定まります。
interval=apply(rnd,#/sum(rnd)*2*pi;);
かくして、次のようにすればランダムな区間での区分求積ができます。
rnd=apply(1..n,randomint(10)+1);
interval=apply(rnd,#/sum(rnd)*2*pi;);
sum=0;
x1=0;
repeat(n,t,
x2=x1+interval_t;
name=text(t);
Listplot(name,[[x1,0],[x1,f(x1)],[x2,f(x1)],[x2,0]]);
Shade(["sg"+name],[0.2,"color->[0,1,0],alpha->0.2"]);
sum=sum+(x2-x1)*f(x1);
x1=x2;
);
等分ではないので、和を求める式も変わります。分点を x1,x2,・・ として次のようにすればよいでしょう。
(画面の方は積分の式も描いています)
Expr([[1,3],"e","\displaystyle \sum_{k=0}^{n-1} (x_{i+1}-x_i)f(x_i)="+text(sum)]);
リーマン積分
矩形の高さを、左右どちらかの高さではなく、その区間での最大値または最小値にとります。最大値でとったものを上の和、最小値でとったものを下の和ということにしましょう。(数学的には、ここでは「最大値」「最小値」という言葉は使いませんが、そのあたりは大学の解析学できちんと学びます)すべての分割について、上の和の最小値(上方リーマン積分)と下の和の最大値(下方リーマン積分)が等しいとき、これを積分の値としたのがリーマン積分です。
では、上の和と下の和の図を描きましょう。
区間での最大値・最小値は、微分して求めるわけにはいかないので、細かく区切って値を調べてその中の最大値・最小値をとることにします。表示する上ではそれで十分です。
細かく区切った点の関数値をリストにして、max(リスト)で最大値が、min(リスト)で最小値が求められます。
まず、上の和です。区間の幅は先ほどと同じようにランダムにとってあります。
区間ごとの高さのリストを作ります。
height=[];
x1=0;
repeat(n,s,
x2=x1+interval_s;
fval=apply(1..50,
f(x1+(x2-x1)/50*#);
);
height=append(height,max(fval));
x1=x2;
);
この高さを使って矩形を表示し、和を計算します。
sum=0;
x1=0;
repeat(n,t,
x2=x1+interval_t;
name=text(t);
Listplot(name,[[x1,0],[x1,height_t],[x2,height_t],[x2,0]]);
sum=sum+(x2-x1)*height_t;
x1=x2;
);
矩形の色塗りはしていません。曲線が隠れてしまうからです。
また、和の式で hi はそれぞれの区間ごとの高さです。
下の和は
height=append(height,max(fval));
を
height=append(height,min(fval));
に変えるだけです。
< 戻る >