Maple  Conference  2003

         

  教育現場で役立つMaple 応用事例と基本的な取扱い

      講演者

 

                                        2003年8月22日金曜日                                              

                                        古庄 尚文

   Mapleの基本操作および「Maple は何ができるか」

     (この資料は、全てMaple の下で作成しています)

  

Maple使用上の基本的な取り扱い

 

特別な予備知識を必要とせず、誰でも容易にMapleを操作することができます。

 注意事項

    たしざん(+)は  +

   かけざん(×)は  *

   ひきざん(−)は  −

      わりざん(÷)は  / 

  

  ベキ乗は 記号 ^ を使用します。 例えば、   a^x   を表現するには a^x  と入力します。

 円周率π は Pi  と入力します。

 自然対数の底(ネイピアの数) は exp(1)  または 大文字  E と入力します。

  対数   log[a](x)    を表現するには、 log[a](x) と入力します。

      特に、自然対数は ln(真数) と入力します。 表現も ln(真数) となります。

 虚数単位  sqrt(-1)    は I を使用します.

  命令の最後には必ず、セミコロン  ;   をつけます。

  最後に、Enter キーを押すと、実行します。ただし、Mapleが 解答できないものは何も返しません。

電卓レベル

次の 計算をしなさい

1) 3+5    2) 6×7   3) 6÷4  4) 4÷7

 

 取り扱える整数は約2億7千万桁です( 2^28  桁)

       小数も同じです。

>    2^28;

268435456

 

 計算例

>    3+5;

8

>    6*7;

42

>    6/4;

3/2

>    10!;

3628800

 Maple は特別なプログラムなしで2億7千万桁程度の数値計算ができます

>    100!;

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 100! の桁数は

>    length(%);

>   

158

>    ifactor(100!);

``(2)^97*``(3)^48*``(5)^24*``(7)^16*``(11)^9*``(13)^7*``(17)^5*``(19)^5*``(23)^4*``(29)^3*``(31)^3*``(37)^2*``(41)^2*``(43)^2*``(47)^2*``(53)*``(59)*``(61)*``(67)*``(71)*``(73)*``(79)*``(83)*``(89)*``(...
``(2)^97*``(3)^48*``(5)^24*``(7)^16*``(11)^9*``(13)^7*``(17)^5*``(19)^5*``(23)^4*``(29)^3*``(31)^3*``(37)^2*``(41)^2*``(43)^2*``(47)^2*``(53)*``(59)*``(61)*``(67)*``(71)*``(73)*``(79)*``(83)*``(89)*``(...

数の計算

  sqrt(a)      は sqrt(a)  または  a^(1/2)   と入力する

>    sqrt(8)-sqrt(2);

2^(1/2)

>    27^(1/2)+3^(1/2);

27^(1/2)+3^(1/2)

>    simplify(%);

4*3^(1/2)

>    sqrt(2)=evalf(2^(1/2),80);

2^(1/2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070
2^(1/2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070

>    8^(1/3)=simplify(8^(1/3));

8^(1/3) = 2

文字式の扱い

文字式の計算・和差

>    2*a+3*a;

5*a

>    2*x^2-x*(x-1);

2*x^2-x*(x-1)

>    simplify(%);

x^2+x

展開

>    (x-1)^3=expand((x-1)^3);

(x-1)^3 = x^3-3*x^2+3*x-1

>    expand((x+y)^10);

x^10+10*x^9*y+45*x^8*y^2+120*x^7*y^3+210*x^6*y^4+252*x^5*y^5+210*x^4*y^6+120*x^3*y^7+45*x^2*y^8+10*x*y^9+y^10
x^10+10*x^9*y+45*x^8*y^2+120*x^7*y^3+210*x^6*y^4+252*x^5*y^5+210*x^4*y^6+120*x^3*y^7+45*x^2*y^8+10*x*y^9+y^10

>    sin(x+y)=expand(sin(x+y));

sin(x+y) = sin(x)*cos(y)+cos(x)*sin(y)

因数分解

>    x^3+y^3=factor(x^3+y^3);

x^3+y^3 = (x+y)*(x^2-x*y+y^2)

 

>    factor(x^2+y^2);

x^2+y^2

>    x^2+y^2=factor(x^2+y^2,I);

x^2+y^2 = (x+y*I)*(x-I*y)

>    (x-y*I)*(x+y*I)=expand((x-y*I)*(x+y*I),I);

(x-I*y)*(x+y*I) = x^2+y^2

式の整理

>    ppp:=a*x^3+b*x^2+y*x^2+a*x-5*y*x+a^2+b+x+y;

ppp := a*x^3+b*x^2+y*x^2+a*x-5*y*x+a^2+b+x+y

>    collect(ppp,x);

a*x^3+(b+y)*x^2+(a-5*y+1)*x+y+a^2+b

>    collect(ppp,a);

a^2+(x+x^3)*a-5*y*x+b*x^2+y*x^2+x+y+b

関数や式の定義

 

命令は次のようになります。

          関数名:=変数名ー>具体的名数式;

  

例えば   kansu(x) = x^2+3*x+5   と定義し  kansu(1)     kansu(a+1)   の値を求める

>    kansu:=x->x^2+3*x+5;

kansu := proc (x) options operator, arrow; x^2+3*x+5 end proc

>    'kansu(x)'=kansu(x);

kansu(x) = x^2+3*x+5

>    kansu(1);

9

>    kansu(a+1);

(a+1)^2+3*a+8

変数が2個以上ある場合

>    f:=(x,y)->x^2+y^2+x*y+x;

f := proc (x, y) options operator, arrow; x^2+y^2+x*y+x end proc

>    'f(2,3)'=f(2,3);

f(2,3) = 21

(変数に日本語を使用することもできます)

>    電圧:=(電流,抵抗)->電流*抵抗;

`電圧` := proc (`電流`, `抵抗`) options operator, arrow; `電流`*`抵抗` end proc

>    電圧=電圧(電流,抵抗);

`電圧` = `電流`*`抵抗`

>    電圧=電圧(3,5);

`電圧` = 15

 

   式名:=具体的な式   左辺の呼び出しは  lhs(式名)  右辺の呼び出しは rhs(式名)

 

 

>    shiki:=2*a-6=x+3;

shiki := 2*a-6 = x+3

>    lhs(shiki);

2*a-6

>    rhs(shiki);

x+3

>    オームの法則:=電圧=電流*抵抗;

`オームの法則` := `電圧` = `電流`*`抵抗`

>    solve(オームの法則,{電流});

{`電流` = `電圧`/`抵抗`}

>    subs(電流=3,抵抗=5,evalf(rhs(オームの法則)));

15

 

方程式を解く

  命令は  solve(方程式 、 未知数名);  

 

  方程式   2*x-5 = 5*x+1    を解きなさい   ]

>    solve(2*x-5=5*x+1,{x});

{x = -2}

  

 方程式   a*x^2+b*x+c = 0    を x について解きなさい

>    solve(a*x^2+b*x+c,{x});

{x = 1/2/a*(-b+(b^2-4*a*c)^(1/2))}, {x = 1/2/a*(-b-(b^2-4*a*c)^(1/2))}

方程式    a*x^2+b*x+c = 0       を a について解きなさい

>    solve(a*x^2+b*x+c,{a});

{a = -(b*x+c)/x^2}

 途中の計算が必要な方へ

  例題  方程式   3*x-2 = 2-x    を解きなさい

  

   

 まず、方程式を入力します

    

>    rei1:=3*x-2=2-x;

rei1 := 3*x-2 = 2-x

  左辺および右辺に xを加えます

>    lhs(%)+x=rhs(%)+x;

4*x-2 = 2

  両辺に 2 を加えます

>    lhs(%)+2=rhs(%)+2;

4*x = 4

  両辺を 4 で割ります

>    lhs(%)/4=rhs(%)/4;

x = 1

 

 

 solve 命令で 方程式は何でも解けます(不等式も解けます)

 

 

連立方程式

         2*x-y = 3    

                  x+5*y = 1  

を解きなさい           

 

 

>    solve({2*x-y=3,x+5*y=1},{x,y});

{x = 16/11, y = -1/11}

二次方程式

 

>    二次方程式:=x^2+2*x-3=0;

`二次方程式` := x^2+2*x-3 = 0

>    solve(二次方程式,{x});

{x = 1}, {x = -3}

 

三角方程式

>    solve(sin(x)=1/2,{x});

{x = 1/6*Pi}

一般解も出せます   記号チルダ ~  は その文字に条件がついていることを示します。

下記の Z1 は整数という条件が付いています。

>    _EnvAllSolutions := true:
solve(cos(x)=1,{x});

{x = 2*Pi*_Z1}

 

不等式も解けます(表現が気になりますが)  

>    solve(x^2-x-4<0,{x});

{1/2-1/2*17^(1/2) < x, x < 1/2+1/2*17^(1/2)}

 

>    solve(2^x-8>0,x);

RealRange(Open(ln(8)/ln(2)),infinity)

>    simplify(%);

RealRange(Open(3),infinity)

こんなことも、できます。

      例題   方程式   x^4-5*x^2+6*x = 2       の解のうち一番小さい値をmとする。

            このとき、 m^2-m-3   の値を求めなさい。

 

 

>    eq := x^4-5*x^2+6*x=2;

eq := x^4-5*x^2+6*x = 2

>    solve(eq,x);

1, 1, 3^(1/2)-1, -1-3^(1/2)

>    sols := [solve(eq,x)];

sols := [1, 1, 3^(1/2)-1, -1-3^(1/2)]

>    sols[4];

-1-3^(1/2)

>    subs(m=sols[4],m^2-m-3);

(-1-3^(1/2))^2-2+3^(1/2)

>    simplify(%);

2+3*3^(1/2)

 漸化式は解けるか?

 命令は rsolve( 漸化式、 数列名)   recurrence equation solver

 ハノイの塔の一般項を求めなさい

 即ち、次の漸化式を解きなさい

         a[n+1] = 2*a[n]+1    ,   a[1] = 1      

 

>    rsolve({a(n+1)=2*a(n)+1,a(1)=1},{a});

{a(n) = 2^n-1}

 

フィボナッチの数列

   f[n+2] = f[n+1]+f[n]    ,     f[1] = 1    ,    f[2] = 1      の一般項を求めなさい

 

>    rsolve({f(n+2)=f(n+1)+f(n),f(1..2)=1},{f});

{f(n) = 1/5*5^(1/2)*(1/2+1/2*5^(1/2))^n-1/5*5^(1/2)*(1/2-1/2*5^(1/2))^n}

>   

連立の漸化式から、それぞれの一般項を求めなさい

     a[n+1]+b[n] = 2^(n+1)+n     

          b[n+1]+a[n] = n-2^n+3

         a[1] = 1       b[1] = 6

 

>    rsolve({a(n+1) + b(n) = 2*2^n + n,b(n+1)+a(n) = n - 2^n + 3,
   a(1)=1, b(1)=6}, {a, b});

{b(n) = -13/6*(-1)^n-4/3*2^n+2*n+9/2, a(n) = -13/6*(-1)^n+5/3*2^n-n-7/2}

 微分方程式は解けるか?

>   

命令は dsolve( 微分方程式)  ordinary differential equations

 

  例題    次の、微分方程式を解きなさい。

        diff(y(t),t) = g*t     

     

  

>    dsolve(diff(y(t),t)=g*t);

y(t) = 1/2*g*t^2+_C1

  例題    次の、微分方程式を解きなさい。

        diff(y(t),t) = g*t      ,     y(0) = 8    

          

>    dsolve({diff(y(t),t)=g*t,y(0)=8});

y(t) = 1/2*g*t^2+8

狽ノついて

 命令は  sum( 数列の第k項、k=1..n);

             

                コマンドの最初の文字を大文字にすると、数学記号が表示されます。   

 

   

>    Sum(k^2,k=1..10);

Sum(k^2,k = 1 .. 10)

>    sum(k^2,k=1..n);

1/3*(n+1)^3-1/2*(n+1)^2+1/6*n+1/6

>   

>    Sum(k^2,k=1..n)=factor(sum(k^2,k=1..n));

Sum(k^2,k = 1 .. n) = 1/6*n*(n+1)*(2*n+1)

>    Sum(1/n^2,n=1..infinity)=sum(1/n^2,n=1..infinity);

Sum(1/(n^2),n = 1 .. infinity) = 1/6*Pi^2

>    Sum(r^k,k=1..n)=sum(r^k,k=1..n);

Sum(r^k,k = 1 .. n) = r^(n+1)/(r-1)-r/(r-1)

 極限・微分・積分

極限

 

命令は  limit(f(x)、x=a);    は、   limit(f(x),x = a)    を意味します。  

コマンドの最初の文字を大文字で入力すると、数学記号を表示します。               

>    Limit(x/(2*x+3),x=4);

Limit(x/(2*x+3),x = 4)

>    Limit(x/(2*x+3),x=4)=limit(x/(2*x+3),x=4);

Limit(x/(2*x+3),x = 4) = 4/11

 

 右極限、左極限も計算できます。 right、left で指定します

 

>    Limit(abs(x)/x,x=0,right);

Limit(abs(x)/x,x = 0,right)

>    Limit(abs(x)/x,x=0,right)=limit(abs(x)/x,x=0,right);

Limit(abs(x)/x,x = 0,right) = 1

 

無限も取り扱えます

>    Limit((x^2+1)/(1-x-3*x^2),x=infinity);

Limit((x^2+1)/(1-x-3*x^2),x = infinity)

>    Limit((x^2+1)/(1-x-3*x^2),x=-infinity)=limit((x^2+1)/(1-x-3*x^2),x=-infinity);

Limit((x^2+1)/(1-x-3*x^2),x = -infinity) = -1/3

 

  Limit(1/x^2,x=0)=limit(1/x^2,x=0);   

Limit(1/(x^2),x = 0) = infinity

三角関数の極限も取り扱えます  

>    Limit(x*sin(x)/(1-cos(x)),x=0);

Limit(x*sin(x)/(1-cos(x)),x = 0)

>    Limit(x*sin(x)/(1-cos(x)),x=0)=limit(x*sin(x)/(1-cos(x)),x=0);

Limit(x*sin(x)/(1-cos(x)),x = 0) = 2

微分

命令は  diff(関数、変数);        Differentiation or Partial Differentiation

  a*x^5   の微分をさせます。(当然、xについての微分です)

 

>    diff(a*x^5,x);

5*a*x^4

 今度は、a について微分します。 

 

>    diff(a*x^5,a);

x^5

 次は、x についての4次導関数を求めます・

>    diff(a*x^5,x,x,x,x);

120*a*x

>    diff(a*x^5,x$4);

120*a*x

 y を定数とみなします

>    diff(x^2+y^2=1,x);

2*x = 0

 y も変数とみなします

>    diff(x^2+y(x)^2=1,x);

2*x+2*y(x)*diff(y(x),x) = 0

a*x^5   の微分をさせます。(a も変数とみなします)

    

>    diff(a(x)*x^5,x);

diff(a(x),x)*x^5+5*a(x)*x^4

積分

命令は  int(関数、変数名);      Definite and Indefinite Integration

 

 

>    Int(a*x^2,x)=int(a*x^2,x);

Int(a*x^2,x) = 1/3*a*x^3

>    Int(a*x^2,a)=int(a*x^2,a);

Int(a*x^2,a) = 1/2*a^2*x^2

>    Int(Int(a*x^2,a),x)=int(int(a*x^2,a),x);

Int(Int(a*x^2,a),x) = 1/6*a^2*x^3

>    Int(sin(x),x=0..Pi)=int(sin(x),x=0..Pi);

Int(sin(x),x = 0 .. Pi) = 2

グラフ表示について

    y = x^2   のグラフ  

命令は  plot(式、変数名=範囲..範囲); 

 

>    plot(x^2,x=-2..2,title="二次関数のグラフ",labels=["x軸","y軸"]);

[Maple Plot]

      x^2+y^2 = 1   のような陰関数 (九州大学2003年入試問題を含む)

 Mapleはコンピュータの資源を有効に利用するため、全てのコマンドを主記憶に常駐させていません。

 常駐しているコマンドは約10%程度です。残り90%のコマンドは呼び出す必要があります。

 陰関数のグラフ表示は、plots というパッケージの中にあります。そこで、

 コマンド with により plots パッケージを呼び出します。

 命令は  with(plots):

 その後で、 implicitplot(関数、変数名=範囲..範囲);    と命じます。

>    with(plots):

Warning, the name changecoords has been redefined

>    implicitplot(x^2+y^2=4,x=-2..2,y=-2..2,scaling=constrained);

[Maple Plot]

>    implicitplot3d(x^2+y^2+z^2=1,x=-1..1,y=-1..1,z=-1..1,scaling=constrained);

[Maple Plot]

>    implicitplot3d( x^3 + y^3 + z^3 + 1 = (x + y + z + 1)^3,x=-2..2,y=-2..2,
z=-2..2,grid=[13,13,13]);

[Maple Plot]

九州大学2003年度   次のグラフをかきなさい  

2*abs(abs(x)-4)+abs(abs(y)-5) = 3  

 

>    implicitplot(2*abs(abs(x)-4)+abs(abs(y)-5)=3,x=-6..6,y=-8..8,numpoints=5000);

[Maple Plot]

   局座標

 

まず、plots パッケージを with コマンドで呼び出します。

そして、 polarplot(式、角=範囲..範囲)

 

>    polarplot(1,t=0..Pi,scaling=constrained);

[Maple Plot]

>    polarplot([cos(t),sin(t),t=0..2*Pi],color=gold);

[Maple Plot]

>    polarplot(t,t=0..2*Pi);

[Maple Plot]

   アニメーション   y = a*x^2     において a をパラメーターとして

with 命令でplotsパッケージを呼び出します。

そして、amimate(パラメータを含んだ式、変数=範囲..範囲、パラメータ=範囲..範囲);

 

 

>    with(plots):

>    animate(a*x^2,x=-2..2,a=0..2);

[Maple Plot]

>    animate3d(cos(t*x)*sin(t*y),x=-Pi..Pi, y=-Pi..Pi,t=1..2);

[Maple Plot]

  アニメート・カーブ    y = x^3    をかく

>    animatecurve(x^3,x=-2..2);

[Maple Plot]

  不等式と領域

>    inequal( { x+y<1, x-y<=1,y=2}, x=-3..3, y=-3..3,
    optionsfeasible=(color=blue),
    optionsopen=(color=blue,thickness=2),
    optionsclosed=(color=green, thickness=3),
    optionsexcluded=(color=yellow) );

[Maple Plot]

   複素数平面

  with(plots):

Warning, the name changecoords has been redefined

>    complexplot(sin(x+I),x=-Pi..Pi,scaling=constrained);

[Maple Plot]

>    f1 := (x,y)->x^2-y^2; f2 := (x,y)->2*x*y;
complexplot3d( [ f1, f2] , -2..2, -2..2);

f1 := proc (x, y) options operator, arrow; x^2-y^2 end proc

f2 := proc (x, y) options operator, arrow; 2*y*x end proc

[Maple Plot]

  メビウスの帯

>    mebius:=plot3d([4+x*cos(1/2*y),y,x*sin(1/2*y)],

>    x=-Pi..Pi,y=-0..2*Pi,coords=cylindrical,style=patchnogrid,

>    shading=zhue,scaling=constrained):

>    plots[display](mebius);

[Maple Plot]

プログラム作成について

 

  プログラム作成については、少し勉強をする必要があります。

  しかし、他の言語より簡単です。

  次に、プログラムの例を挙げます。

 

   例題  

     「関数  y = f(x)    を 与えることにより

      f(x)  と  f(x) の導関数、二つのグラフを同時に表示する」

     プログラムを作りなさい。

     なお、このプログラムの名前は zogen とします。

     考え方: 与える具体的な関数名を f 

           変数名を x

           グラフを表示する変数 x の範囲を、hajime,owari とします。

           

     コンピュータの動き: コンピュータは、zogen(f、x、hajime,owari) と命じられると  

                  f の場所にあるものが、指定された関数であると認識します。

                  x の場所にあるものが、指定された関数の変数であると認識します

                  hajime の場所にあるものが、グラフ表示上の変数の最小値、

                  owari の場所にあるものが、グラフ表示上の変数の最大値と認識します。

                  local df とは df はこのプログラムの内部のみ有効であるという意味です。

               

>    zogen:=proc(f,x,hajime,owari)

>     local df;

>     df:=diff(f,x);

>     plot([f,df],x=hajime..owari);

>    end:

>    zogen(x^2,x,-3,3);

[Maple Plot]

>    zogen(t^4-t^2,t,-1,1);

[Maple Plot]

  授業解説の道具としてのMaple 

  例 1  グラフの移動

 

(数学T 二次関数)

このブロックを注意してください。Mapleのコマンドが全く見当たりません。教科書などとして使えます

   例題 1          y = (x-3)^2+2        のグラフをかいてみよう.

 この グラフは、 y = x^2   を  x  の方向へ3、さらに、 y  方向へ2だけ 平行移動したものである。 

(このことがわからない人は、上記の 2) と 3) を復習すること。)

 

 

[Maple Plot]

  

    一般に、 y = (x-p)^2+q     のグラフは、 y = x^2  のグラフをx方向へp、y方向へqだけへ平行移動したものである。

  上の、アニメーションを参考に、p、qにいろいろな数値を当てはめて、グラフの移動を想像してみよう。

 

 例 2  最大値・最小値について

 

例題2 

          二次関数  y = x^2-2*a*x-2*a+3    の最大値を求めなさい。

    ただし、 0≦x≦2 とします。

 

     グラフを参考にして、最大値を求めてみよう。

  問題は、a の取り扱い方です。

  そこで、a の値を −2 から 5  まで変化させるアニメーションを表示すます。

  この、アニメーションをしばらく観察すれば、どのように解答すればよいかに気がつきます

   (他のことにも、気づきます)  

    

    注  view コマンドは グラフを見やすいサイズに設定するためのものです。

       これにより、係数をあまり気にすることなく、その関数の特徴を表示できます。

 

>    with(plots):

>    niji:=animate(x^2-2*a*x-2*a+3,x=-3..3.5,a=-2..3):

>    hani:=inequal({y-9999*x<0,0<y-9999*(x-2)},x=-4..4,y=-10..25,optionsexcluded=(color=white,thickness=2)):

>    display(niji,hani,view=[-2.5..3.5,-10..20]);

[Maple Plot]

  大学入学試験問題をMapleを利用して解く (思考の道具として) 

   問題 1

     πは3.05より大きいことを示せ

                           (2003年 東京大学理系第6問)

 Mapleを利用した解

>   

 πとは、どんな数のこと? 

 

πの 定義は  「 円の周と直径の比」    であるが

半径が1の円の面積と考えてもよい

 

  解1     円の面積を手がかりに

円の面積を求めることにより πが 3.05 より大きいことを示そう。

π の値を計算するイメージを下記に示す。

 (円の内部に多くの長方形を作り、それらの長方形の面積を全て加えることにより、

  円の面積を算出するものである。) 

 

>    with(plots):

Warning, the name changecoords has been redefined

>    with(student):

>    kubun:=proc(f,x,h,e)

>     local k,i,s,n;

>     k:=[seq(i^2,i=2..13)];

>     s:=seq(rightbox(f,x=h..e,n),n=k):

>     display([s],insequence=true,scaling=constrained);

>    end;

kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc
kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc
kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc
kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc
kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc
kubun := proc (f, x, h, e) local k, i, s, n; k := [seq(i^2,i = 2 .. 13)]; s := seq(rightbox(f,x = h .. e,n),n = k); display([s],insequence = true,scaling = constrained) end proc

このプログラム使用法は

kubun(f、x、h、e) において、

   f の場所に 使用する関数を記入する。ここでは、円であるら 

   h 変数の変動する値の最小値   h≦x≦e  のh

   e 変数の変動する値の最大値   h≦x≦e  のe  y = sqrt(1-x^2)    の右辺を。

   x 変数を表す文字。  普通は 文字 x  である。

上記4項目を指定すれば、そのイメージを表現する

 

 

>    kubun(sqrt(1-x^2),x,0,1);

[Maple Plot]

 

具体的に値を算出するプログラムは、下記の通りである。

ただし、計算する面積は円の  1/4  を対象としている。

   (一つ一つの長方形の面積を計算し、その総和を求めるものである)

 

>    PI:=proc(n)

>       local i,total;

>            total:=0;

>       for i from 1 to n do

>            total:=total+1/n*sqrt(1-(i/n)^2);

>       od;

>       total;

>    end:

 

PI(5)  と命じると 五個の長方形の面積を計算する。

PI(N) と命じると N個の長方形の面積を計算する。

 

>    PI(25);

4/625*39^(1/2)+3/625*69^(1/2)+2/625*154^(1/2)+1/625*609^(1/2)+14/625*6^(1/2)+1/625*589^(1/2)+66/625+1/625*561^(1/2)+4/625*34^(1/2)+9/625*21^(1/2)+6/625*14^(1/2)+1/625*481^(1/2)+2/625*114^(1/2)+1/625*42...
4/625*39^(1/2)+3/625*69^(1/2)+2/625*154^(1/2)+1/625*609^(1/2)+14/625*6^(1/2)+1/625*589^(1/2)+66/625+1/625*561^(1/2)+4/625*34^(1/2)+9/625*21^(1/2)+6/625*14^(1/2)+1/625*481^(1/2)+2/625*114^(1/2)+1/625*42...

>    4*evalf(%);

3.052196310

 より正確な π の値は次の通りです。

>    evalf(Pi,111);

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651

   解2     扇 形に円を24等分する。このときの中心角15°の三角形の面積を求める

>    with(plots):

Warning, the name changecoords has been redefined

>    a21:=plot(sqrt(1-x^2),x=-1..1):

>    a22:=plot(sqrt(3)*x,x=0..1/2):

>    a23:=plot(x/sqrt(3),x=0..sqrt(3)/2):

>    display([a21,a22,a23],scaling=constrained);

[Maple Plot]

 上の図のように扇形を作り中心角をθとすると、その面積は、 r*r*sin(theta)/2   で与えられる。

 無理なく、正弦の値を算出できる θ=15° 場合を考える。

 即ち、24個の扇形の面積の総和を考えると

 

>    evalf(24*sin(2*Pi/24)/2);

 

3.105828541

        定義に従って、円周の長さを求めることにより証明する

 

  曲線の長さ(任意の関数に応用できるように、変数xに関して等分しているアニメーション)

      曲線の長さ

>    with(plots):

>    pl:=proc(f,a,b,n)

>    localu,v,k;

>    k:=1+floor(n*(x-a)/(b-a));

>    u:=a+(k-1)*(b-a)/n;

>    v:=a+k*(b-a)/n;

>    unapply(f(u)+(f(v)-f(u))/(v-u)*(x-u),x);

>    end:

>    f:=x->sqrt(1-x^2);

f := proc (x) options operator, arrow; sqrt(1-x^2) end proc

>   

>   

>    display([seq(plot([f,pl(f,-1,1,i)],-1..1,thickness=2,color=[red,blue]),i=1..20)],

>    insequence=true,view=[-1..1,-1..1]);

[Maple Plot]

 

  円の中心を基準に 円を n 等分してできる二等辺三角形を考える。(上の図参照)

  この二等辺三角形の頂角を  theta   とする、 θ=360°÷ n  である。

  さて、この二等辺三角形の底辺の長さを求めると、

        L^2 = r^2+r^2-2*r*r*cos(theta)     (余弦定理より)

           これより

        L^2 = 2*r^2-2*r^2*cos(theta)

                L^2 = 2*r^2*(1-cos(theta))

        L = sqrt(2)*r*sqrt(1-cos(theta))

           を得る

 

     ここで、2倍角の公式を利用して

              1-cos(theta) = 1-{1-2*{sin(theta/2)}^2} = 2*sin(theta/2)^2

          である。また、考えている  theta/2   の値から   0 < sin(theta/2)

          よって、

         L = 2*r*sin(theta/2)

          ゆえに、円周の長さは   n*L = 2*n*r*sin(theta/2)         である。

          直径に対する円周の長さの比である円周率πは

    上の式 nL に r=1、n=12 の場合を代入して、(このとき、θ=30°である)

    

    円周率 = 2×12×sin(15°)÷2

    

>    円周率 = evalf(2*12*sin(Pi/12)/2);

`円周率` = 3.105828541

    なお、正確な円周は、 `円周の長さ` = limit(n*L,n = infinity)    = limit(2*n*r*sin(theta/2),n = infinity)    である。

  これを、計算して

>    Limit(n*L,n=infinity)=limit(2*n*r*sin(Pi/n),n=infinity);

Limit(n*L,n = infinity) = 2*Pi*r

>   

 

    問題 2

区間 −2≦x≦2 において、連続な曲線  y=f(x)  が次の条件をみたしているとする。

    f(−2)=f(2)=0

  また、f(x) の導関数は

    −2<x<−1   のとき  a

    −1<x<1    のとき   2*x

           1<x<2    のとき   -a

  

    このとき、 int(abs(f(x)),x = -2 .. 2)     を最小にする a の値とその最小値を求めよ。

                                                                 (熊本大学 理系)

 

 

   Mapleを利用した解 

与えられた 導関数を g(x) として 定義する。

 

 

 f(x) の導関数を g(x) とおくと、g(x) は Mapleを利用すると次のようになる。

 

>    g:=x->piecewise(-2<x and x<-1,a,

>                   -1<x and x<1, 2*x,

>                    1<x and x<2, -a);

g := proc (x) options operator, arrow; piecewise(-2 < x and x < -1,a,-1 < x and x < 1,2*x,1 < x and x < 2,-a) end proc

 思い通り定義できているか、確認してみましょう。

>    g(x);

PIECEWISE([a, -x < 2 and x < -1],[2*x, -x < 1 and x < 1],[-a, -x < -1 and x < 2])

試しに、g(x) において x=−1.5  、  0.7  、   3(定義されていない)  を代入してみましょう。

>    g(-1.5);

a

>    g(0.7);

1.4

>    g(3);

PIECEWISE()

   このように、定義されていない範囲の値を要求すると、その旨を知らせます。

 

f(x)の導関数g(x)が確定しましたので、g(x)を積分してf(x)を求めてみましょう

 

Maple に積分の計算をさせます。即ち、 f(x) = int(g(x),x)     を計算します

>    f(x):=int(g(x),x);

f(x) := PIECEWISE([0, x <= -2],[a*x+2*a, x <= -1],[x^2+a-1, x <= 1],[-a*x+2*a, x <= 2],[0, 2 < x])

これで、f(x)が求まりました。 

問題を確認すると、 int(abs(f(x)),x = -2 .. 2)    の最小値 が問題です。

f(x) のグラフをかいて、どのようにの積分の計算をすればよいか考えましょう。

f(x) をみると a というパラメーターありますので、a の値により f(x)のグラフは変わります。

そこで、Maple のアニメーションを利用し、グラフをかいてみましょう。

>    with(plots):

>    animate(f(x),x=-2..2,a=-1..2,color=red);

[Maple Plot]

このアニメーションを良く観察してみよう。

     int(abs(f(x)),x = -2 .. 2)    は x軸と 赤い線のグラフで囲まれた面積を意味しているので、

 この面積の最小値を求めればよい

 

>   

  この面積は、a の値により、場合分けしないと求めることができない。

 アニメーション観察の結果、次の三つの場合に分ければよいことがわかる

(1) グラフ全体が、x軸より下にある場合  即ち、a≦0 の場合

   グラフより、求める面積は 

   -2≦x≦ー1 の部分   −1≦x≦1  の部分  1≦x≦2  の部分に分割して求めればよい

   これを、Mapleに計算させる。 

>    Int(abs('f(x)'),x=-2..-1)+Int(abs('f(x)'),x=-1..1)+Int(abs('f(x)'),x=1..2);

Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. 1)+Int(abs(f(x)),x = 1 .. 2)

>    Int(abs('f(x)'),x=-2..-1)+Int(abs('f(x)'),x=-1..1)+Int(abs('f(x)'),x=1..2)=int(-(a*x+2*a),x=-2..-1)+int(-(x^2+a-1),x=-1..1)+int(-(-a*x+2*a),x=1..2);

Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. 1)+Int(abs(f(x)),x = 1 .. 2) = -3*a+4/3

よって、a≦0  の場合の最小値は、a=0  のとき  4/3    である。

(2) グラフがx軸と交わる場合    即ち  0<a≦1 の場合

     グラフより、求める面積は 

   -2≦x≦ー1 の部分   −1≦x≦(2次関数とx軸の解) の部分   解≦x≦解 の二次関数の部分

   解≦x≦1  の部分       1≦x≦2 の部分 の5個に分割して求めればよい

面積を求めるには、二次関数とx軸との交点のx座標を求めなければならない。

即ち、 x^2+a-1 = 0    の解を求めなければならない。Maple に解かせて

>    kai:=[solve(x^2+a-1,x)];

kai := [(-a+1)^(1/2), -(-a+1)^(1/2)]

>    kai := [(-a+1)^(1/2), -(-a+1)^(1/2)];

kai := [(-a+1)^(1/2), -(-a+1)^(1/2)]

>    kai[1];

(-a+1)^(1/2)

よって、求める面積は

>    Int(abs('f(x)'),x=-2..-1)+Int(abs('f(x)'),x=-1..kai[2])+Int(abs('f(x)'),x=kai[2]..kai[1])+Int(abs('f(x)'),x=kai[1]..1)+Int(abs('f(x)'),x=1..2);

>   

Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. -(-a+1)^(1/2))+Int(abs(f(x)),x = -(-a+1)^(1/2) .. (-a+1)^(1/2))+Int(abs(f(x)),x = (-a+1)^(1/2) .. 1)+Int(abs(f(x)),x = 1 .. 2)
Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. -(-a+1)^(1/2))+Int(abs(f(x)),x = -(-a+1)^(1/2) .. (-a+1)^(1/2))+Int(abs(f(x)),x = (-a+1)^(1/2) .. 1)+Int(abs(f(x)),x = 1 .. 2)

  を計算すればよい

>    Int(abs('f(x)'),x=-2..-1)+Int(abs('f(x)'),x=-1..kai[2])+Int(abs('f(x)'),x=kai[2]..kai[1])+Int(abs('f(x)'),x=kai[1]..1)+Int(abs('f(x)'),x=1..2)=2*(int(-(x^2+a-1),x=0..kai[1])+int(x^2+a-1,x=kai[1]..1)+int(-a*x+2*a,x=1..2));

Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. -(-a+1)^(1/2))+Int(abs(f(x)),x = -(-a+1)^(1/2) .. (-a+1)^(1/2))+Int(abs(f(x)),x = (-a+1)^(1/2) .. 1)+Int(abs(f(x)),x = 1 .. 2) = -4/3*(-a+1)^(3/2)-2*...
Int(abs(f(x)),x = -2 .. -1)+Int(abs(f(x)),x = -1 .. -(-a+1)^(1/2))+Int(abs(f(x)),x = -(-a+1)^(1/2) .. (-a+1)^(1/2))+Int(abs(f(x)),x = (-a+1)^(1/2) .. 1)+Int(abs(f(x)),x = 1 .. 2) = -4/3*(-a+1)^(3/2)-2*...

>    menseki:=rhs(%);

menseki := -4/3*(-a+1)^(3/2)-2*a*(-a+1)^(1/2)+4*(-a+1)^(1/2)-4/3+2*a*(1-(-a+1)^(1/2))+a

>    sort(menseki,a);

2*(1-(-a+1)^(1/2))*a-2*(-a+1)^(1/2)*a+a+4*(-a+1)^(1/2)-4/3-4/3*(-a+1)^(3/2)

>    plot(menseki,a=0..1.5);

[Maple Plot]

グラフより、最小値をとる a の値は、menseki の導関数の値が0になるところである。

よって、 d(menseki)/da   を求めると、

>    'd(menseki)/da'=diff(menseki,a);

d(menseki)/da = 2/(-a+1)^(1/2)*a+3-2*(-a+1)^(1/2)-2/(-a+1)^(1/2)

>    simplify(%);

d(3*a-8/3*(-a+1)^(1/2)*a+8/3*(-a+1)^(1/2)-4/3)/da = (4*a+3*(-a+1)^(1/2)-4)/(-a+1)^(1/2)

>    solve(diff(menseki,a)=0,{a});

{a = 7/16}

 よって、0≦a≦1 のとき、面積の最小値は、  a = 7/16    をmenseki に代入して

>    subs(a=7/16,menseki);

-1/48+3/32*9^(1/2)*16^(1/2)

  この値を簡単にして、最小値は  a = 7/16   のとき  次の値を得る。

>    simplify(%);

53/48

(3) グラフがx軸より上にある場  即ち  1<a  の場合

 

求める面積は  int(abs(f(x)),x = -2 .. 2) = 2*(int(x^2+a-1,x = 0 .. 1)+int(-a*x+2*a,x = 1 .. 2))   であるから

>    Int(abs('f(x)'),x=-2..2)=2*(int(x^2+a-1,x=0..1)+int(-a*x+2*a,x=1..2));

Int(abs(f(x)),x = -2 .. 2) = -4/3+3*a

アニメーションおよび、上の結果よりより、1≦a の最小値は、a=1 のときである

よって、最小値は  5/3   である。

>   

>   

>   

>   

 答えは (1)の 4/3     (2)の 53/48     (3)の 5/3  の値を比べて 

  (2) の場合  即ち 、 a = 7/16    のとき最小値  53/48   をとる。     

    接線の意味 

>    with(plots):

Warning, the name changecoords has been redefined

>    animateSecant:=proc(f,a,h)

>    local n,Background,Mover,Secants;

>    n:=30;

>    Background:=plots[display](plots[pointplot]({[a,f(a)],[a,0]},symbol=circle),

>    plot(f(x),x=(a-(h+signum(h)*1))..(a+(h+signum(h)*1)))):

>    Mover:=plots[display](seq(plots[pointplot]({[a+(n-i)/(n/h),f(a+(n-i)/(n/h))],

>    [a+(n-i)/(n/h),0]},symbol=circle,color=blue),i=0..n-1),insequence=true):

>    Secants:=plots[display](seq(plot((f(a+(n-i)/(n/h))-f(a))/(n-i)*(n/h)*(x-a)+f(a),

>    x=(a-(h+signum(h)*1))..(a+(h+signum(h)*1)),color=blue),i=0..n-1),insequence=true):

>    plots[display](Secants,Background,Mover);

>    end proc:

 関数の指定

>    f:=x->x^3-3*x^2;

f := proc (x) options operator, arrow; x^3-3*x^2 end proc

接点の指定と相手の点の位置指定

>    animateSecant(f,1.5,1.5);

[Maple Plot]

       曲線の長さ

>    with(plots):

>    関数:=x->x^2;

`関数` := proc (x) options operator, arrow; x^2 end proc

>    折れ線:=proc(関数,左端,右端,個数)

>    local u,v,k;

>    k:=1+floor(個数*(x-左端)/(右端-左端));

>    u:=左端+(k-1)*(右端-左端)/個数;

>    v:=左端+k*(右端-左端)/個数;

>    unapply(関数(u)+(関数(v)-関数(u))/(v-u)*(x-u),x);

>    end:

>   

>    plot([関数,折れ線(関数,-1,1,8)],-1..1,thickness=2,color=[red,blue],scaling=constrained);

>   

>   

[Maple Plot]

>   

>    display([seq(plot([関数,折れ線(関数,-1,1,i)],-1..1,thickness=2,color=[red,blue]),i=1..20)],

>    insequence=true,view=[-1..1,-1..1]);

[Maple Plot]

       インターネット上における授業(e−Learning)について

携帯電話が教科書・ノート・辞書・教師・参考書代わり

いつでも・どこでも、思い立ったら、即・学習

具体的な例は URL:http://furu.biz/ にあります。

 

Web上へアップロードするには、どうしたらよいか。

(ホームページを持っている場合)

    1)  教材をMapleシート上に作成する

    2)  作成した教材を  インターネットを経由して見れるようにHTML または XML に変換する。

        このとき、いろいろなタグの意味を知らなくてもよい

    3)  HTMLやXMLに変換されたものをサーバーへアップロードする。

などについてコメントする

  

実験をします。

ホームページfuruweb を開き、実験。

メッセンジャー・Odigoについてコメントする。

Babylonや翻訳ソフトについてコメントする。

       参考文献

  Maple8 programming guide  Waterloo Maple Inc. Springer

  Darren Redfern                  The  Maple Handbook     Springer 1996年
  K.M.Heal,M.L.Hansen, K.M.Rickard     Maple V  Leaning Guide   Springer 1996年
  K.M.Heal,M.L.Hansen, K.M.Rickard       Introduction to Maple      Springer 1996年
  M.B.Monagan,K.O.Geddes,K.M.Heal,G.Labahn,S.M.Vorkoetter    
  Maple V  Programming Guide   Springer 1966年
  矢野健太郎編   数学小辞典  共立出版  昭和54年
 文部省    学術用語集 大日本図書 昭和48年
 日本規格協会編  JIS ハンドブック  財団法人日本規格協会  1981年
 日本数学会編  数学辞典  岩波書店  1974年
 Zecharia Sitchin    Genesis Revisited     1994年
 Zecharia Sitchin  The War Of Gods And Men   1995年 
 バビロン社   Babylon Translator  www.babylon.com 1997年
 Robert M Schock    Voice Of Rocks   日経印刷  1999年
 結城 浩  Perl で作るCGI入門  ソフトバンクパブリッシングKK 2000年
 ノマド・ワークス 詳細HTML基本活用辞典  新星出版社  2000年
 池田実・小野寺尚希  最新XMLがわかる   技術評論社  2000年
 Steven Holzner   Perl&CGI言語リファレンス   2000年  
 Waterloo Maple Inc.   Maple7Learning Guide  2001年 
 Waterloo Maple Inc.   Maple7Programming Guide  2001年
  


参考プログラム  
  サイバネットシステム株式会社  Maple X Release 5 1999年 より
       下記のプログラムなどを参孝
        > interface(verboseproc=2);
          eval(solve):
          と命じれば、solve 命令のプログラムが表示されます。
   
Maple Application Center (http://www.mapleapps.com/Japanese_apps.htm)

>    interface(verboseproc=2);

>    eval(solve);

proc (eqs, vars) local a, Answer, Args, Slist, Blist, X, Xvars, i, inds, Solutions_are_sets, eqns, ineqs, tvars, neqns, notzero, maxsols, s, sol, SUBSVAR, t, t1, RO, r, Floater, x, qq; global `solve/sp...