定積分3次関数

次のような問題図を作ります。

図自体はシンプルなのですぐ書けるとは思いますが、ちょっとしたテクニックもありますので、順番にいきましょう。

まず、原点を通る直線を「直線を加える」ツールで描きます。

グラフは Cindyscript の plot()関数で描けますが、TeXにも書き出すのでKETCindyのPlotdata()で描きましょう。

Plotdata("1","x^3-6*x^2+9*x","x");

Lineplot([A,B]);

これで、直線とグラフが描け、点Bをドラッグすると直線を動かすことができます。

これに、関数の式と、S1,S2、x軸で接する点の座標を書き込みます。

このとき、3次関数のグラフは動かないので式を書く位置も固定でよいのですが、直線は動かしますので直線の方程式はそれにつれて場所を変えたいでしょう。また、2つの領域も変わっていくので、S1,S2の位置もそれに応じて変わるようにしましょう。

たとえば、直線の方程式は点Bの少し右上、S1はx座標が1で、直線と極大の点(1,4)の中間、S2 も同様にします。

ひとまず、Cinderella上で表示をして、位置を調整しましょう。

スクリプトは

f(x):=B.y/B.x*x;

Expr([[0,5],"e2","y=x^3-6x^2+9x",B+[1,0.5],"s2","y=mx",[1,(f(1)+4)/2],"c","S_1",[3,f(3)/2],"c","S_2",[3,0],"s2","3"]);

さらに、座標軸に矢じりをつけ、原点のOが直線と重なってしまうので位置をずらすことにします。あらためてスクリプトを全部示しましょう。

Addax(1);

Setax(["a","","","","","","nw"]);

Plotdata("1","x^3-6*x^2+9*x","x");

Lineplot([A,B]);

f(x):=B.y/B.x*x;

Expr([[0,5],"e2","y=x^3-6x^2+9x",B+[1,0.5],"s2","y=mx",[1,(f(1)+4)/2],"c","S_1",[3,f(3)/2],"c","S_2",[3,0],"s2","3"]);

これで、冒頭に示した問題図ができます。

面積を計算する

実際に積分を計算して、S1とS2を比較しましょう。

2つの領域を色分けしてもいいかもしれません。

さて、積分の計算ですが、普通は、連立方程式を解いて、まず交点の座標を出します。答えを出すだけなら、3次関数の対称性を使えば答一発なのですが、いまはシミュレーションをしたいので、ちゃんと定積分を計算します。

とはいえ、まともにやるのは大変。

ここで、KETCindyが力を発揮します。

まず、交点の座標を計算しなくても交点をとることができるのです。

積分計算もその交点を利用してできるのです。

交点を取りますが、それを幾何要素にしておく方があとで便利なので、適当な場所に点を2つとります。順番からするとC,Dになるでしょう。

グラフのプロットデータは gr1 ,直線は sgABになっているはずです。(コンソールに表示されます)

この2つのプロットデータを使い、Intersectcrvs() で交点を求めます。

tmp=Intersectcrvs("lnAB","gr1");

とすると、交点の座標のリストが tmp に入ります。(println(tmp); で確かめられます)

そこで、

C.xy=tmp_2;

D.xy=tmp_3;

とすれば、点C,Dが交点に乗ります。

この点C,Dを使ってIntegrate() で積分計算をします。曲線とx軸の間の面積を求めて、三角形・台形の面積を引けばよいですね。

S1=Integrate("x^3-6*x^2+9*x","x",[0,C.x],["s"])-1/2*C.x*C.y;

S2=1/2*(D.x-C.x)*(C.y+D.y)-Integrate("x^3-6*x^2+9*x","x",[C.x,D.x],["s"]);

Expr([[5,4],"c","m="+text(B.y/B.x),[5,3],"c","S_1="+text(S1),[5,2],"c","S_2="+text(S2)]);

点BをドラッグするとS1=S2になるときのmの値がわかります。3次関数のグラフの対称性を用いれば、直線が点(2,2)を通るとき、すなわちm=1 のときになりますね。

なお、数値積分は、"s" をつけてシンプソン法で行いました。オプションなしの台形公式でやってもこのくらいであれば同じです。

最後に、2つの領域に色をつけましょう。

グラフを2つの領域に分けるので、そのために Partcrv() を使います。また,ACとCDの2つの線分を描いておきます。

Partcrv("1",A,C,"gr1");

Partcrv("2",C,D,"gr1");

Listplot([A,C]);

Listplot([C,D]);

これで、AからCは part1 CからDはpart2 という名前のプロットデータになります。

これを利用して、Cindyscriptのfillpoly() で色を塗ります。

Partcrv("1",A,C,"gr1");

Partcrv("2",C,D,"gr1");

Listplot([A,C]);

Listplot([C,D]);

Shade(["part1","sgAC"],["Color=[0.2,0,0,0]"]);

Shade(["part2","sgCD"],["Color=[0,0,0.2,0]"]);

画面上でS1とS2の文字が隠れるようなら,文字の表示を後に書きます。

あらためて全体のスクリプトを示しましょう。

Addax(1);

Setax(["a","","","","","","nw"]);

Plotdata("1","x^3-6*x^2+9*x","x",["Num=200"]);

Lineplot([A,B]);

f(x):=B.y/B.x*x;

tmp=Intersectcrvs("lnAB","gr1");

C.xy=tmp_2;

D.xy=tmp_3;

S1=Integrate("x^3-6*x^2+9*x","x",[0,C.x],["s"])-1/2*C.x*C.y;

S2=1/2*(D.x-C.x)*(C.y+D.y)-Integrate("x^3-6*x^2+9*x","x",[C.x,D.x],["s"]);

Expr([[5,2],"e","m="+text(B.y/B.x),[5,1.5],"e","S_1="+text(S1),[5,1],"e","S_2="+text(S2)]);

Partcrv("1",A,C,"gr1");

Partcrv("2",C,D,"gr1");

Listplot([A,C]);

Listplot([C,D]);

Shade(["part1","sgAC"],["Color=[0.2,0,0,0]"]);

Shade(["part2","sgCD"],["Color=[0,0,0.2,0]"]);

Expr([[0,5],"e2","y=x^3-6x^2+9x",B+[1,0.5],"s2","y=mx",[1,(f(1)+4)/2],"c","S_1",[3,f(3)/2],"c","S_2",[3,0],"s2","3"]);

< 戻る >