3次元空間の曲面を描く

z= sin [x+ sin [y] ]で与えられるような曲面を描く。 このための命令は次のようになる。 あまり美しくないが、これを改良していこう。

Plot3D[Sin[x+Sin[y]], {x,0,4Pi},{y,0,4Pi} ];

Plot3Dは3次元空間内の曲面を描く。 曲面を与える関数Sin[x+Sin[y]]とその範囲{x,0,4Pi},{y,0,4Pi}を指定する。
格子点を増やしてグラフを滑らかにする。 そのためにはPlotPoints ->40を指定する。 40を大きくすれば滑らかな曲面になる。 ただし、あまり増やすと計算時間が長くなるので注意する。

Plot3D[Sin[x+Sin[y]],{x,0,4Pi},{y,0,4Pi}, PlotPoints ->40];

分割を増やしてメッシュも取り除く。メッシュを取り除かないと分割を増やした時にグラフが綺麗でなくなる。 ここでMesh -> False はメッシュを取り除く。

Plot3D[Sin[x+Sin[y]],{x,0,4Pi},{y,0,4Pi}, PlotPoints ->50, Mesh ->False];

視点をかえる

Plot3D[Sin[x+Sin[y]],{x,0,4Pi},{y,0,4Pi}, PlotPoints ->50, Mesh ->False,
ViewPoint ->{0.047,-3.076,-1.408}];


ここで ViewPoint ->{0.047,-3.076,-1.408} はグラフをみる視点を指定する。 この数値をかえると同じグラフでも異なってみえる。 これを実際試してみよ。視点は 空間の(x,y,z) 座標を勝手に与えることができる。ただし、 視点はグラフが描かれる立方体の外になければならない。
ここで視点を与える座標を簡単に入力するためにはまずカーソルを入力したい位置に移動する。 つぎにMathematicaのメニューの入力をクリックして3Dビューポイントの設定を選ぶ。 マウスで適当に回転させる。座標の数値が表示されるので 適当なところでペーストをクリックすれば上のViewPoint -> {-2.060, -1.250, 1.850}が 貼りこまれる。但しカンマは挿入されないので自分で入力する必要がある。

次の関数は統計学においてはよくあらわれる関数である。

Plot3D[E^(-x^2-y^2),{x,-3,3},{y,-3,3},PlotPoints ->70,
PlotRange -> {0,1} ];


ここで PlotRange -> {0,1} はグラフを描く範囲を指定する。
これを指定しない時はグラフがどのようになるか 比較せよ。次のように入力する。

Plot3D[E^(-x^2-y^2),{x,-3,3},{y,-3,3},PlotPoints ->70];

これ以外のいろいろな曲面をあげておく。
オプションの値をかえて、グラフの見栄えを確認しなさい。
また、描く範囲を変更してグラフを観察しなさい。
視点を変えていろいろな方向からグラフを観察しなさい。

Plot3D[Sin[x] Exp[y], {x, -5, 5}, {y, -2, 2},
PlotPoints->50,PlotRange->{-9,9}];

Plot3D[Sin[x] Cos[y], {x, 0, 2Pi}, {y, -3, 3}, PlotPoints->50];

Plot3D[Sin[x] Tan[2y], {x, 0, 2Pi}, {y, -0.76, 0.76}, PlotPoints->60,PlotRange->{-8,8}];

Plot3D[Sin[x] Sin[2y],{x, 0, 2Pi}, {y, -3, 3}, PlotPoints->50];

Plot3D[10 Sin[x + Sin[y^2]], {x, -10, 10}, {y, -3, 3}, PlotPoints-> 100,Mesh->False];

Plot3D[10 Sin[x^2 + y^2], {x, -4, 4}, {y, -4, 4}, PlotPoints-> 100,Mesh->False];


戻る


等高線を描く

等高線を描く には次のようにContourPlot命令を用いる。
よく知られた関数x2 + y2を用いて、等高線を描くと円ができる。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3,3} ];

等高線の形を正確に描く ためには次のAspectRatio -> Automaticのオプションをつける。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, AspectRatio -> Automatic ];

等高線に陰影をつけない ためには、ContourShading ->Falseのオプションをつける。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, ContourShading ->False, AspectRatio -> Automatic];

等高線に色をつける ためには、ColorFunction -> Hueのオプションをつける。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, ColorFunction -> Hue, AspectRatio -> Automatic];

線を滑らかにする。 このためにはPlotPoints -> 30 としてオプションを追加する。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, ColorFunction -> Hue,
PlotPoints -> 30, AspectRatio -> Automatic];

等高線の数を増やす にはContours ->15のオプションをつける。ここで初期設定では10であり これを増やすと等高線が増える。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, ColorFunction -> Hue, PlotPoints -> 30,
Contours ->15, AspectRatio -> Automatic];

等高線を描かないようにする にはContourLines -> Falseのオプションをつける。

ContourPlot[ x^2 + y^2, {x, -5, 5}, {y, -3, 3}, ColorFunction -> Hue, PlotPoints -> 30,
ContourLines -> False , Contours ->15, AspectRatio -> Automatic];

描く関数をかえる

ContourPlot[ Sin[x]Cos[y], {x, -5, 5}, {y, -5,5}, ColorFunction -> Hue, PlotPoints -> 50,
Contours ->30, ContourLines -> False, AspectRatio -> Automatic];

応用として陰関数x3 - x2 - y2 + y =0のグラフを 描く。このためには0に対応する等高線を描く。

ContourPlot[(x^3 -x^2) - (y^2 -y), {x,-2,2},{y,-2,2}, PlotPoints -> 30,
Contours -> {0}, ContourShading ->False, AspectRatio -> Automatic
];


もっとなめらかなグラフにする。

ContourPlot[(x^3 -x^2) - (y^2 -y), {x,-2,2},{y,-2,2},
Contours -> {0}, ContourShading ->False, ContourSmoothing ->4,
PlotPoints ->30];


3次元空間の中の等高面

3次元空間の中に等高線あるいは等高面を描くにはContourPlot3D命令を用いる。 その前にこの命令を用いるためにはマクロを読み込んでおく必要がある。 次の命令を実行する。

<< Graphics`ContourPlot3D`

次の例をとって考えよう。3次元空間の等高面はContourPlot3D 命令を用いる。等高面を描く関数と範囲を指定する。

ContourPlot3D[ Cos[Sqrt[ x^2 + y^2 + z^2 ]],
{x,-2,2}, {y,0,2}, {z,-2,2} ];

関数をかえて、Contours -> {.1}は等高面を描く高さをあたえる。

ContourPlot3D[ x^2 y^2 z^2, {x,-1,1}, {y,-1,1}, {z,-1,1}, Contours -> {.1}]

球面を描いてみる。

ContourPlot3D[x^2 + y^2 + z^2, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, Contours -> {.9}];

楕円体を描く。

ContourPlot3D[x^2 + 2 y^2 + 2 z^2, {x, -1, 1}, {y, -1,1}, {z, -1, 1}, Contours -> {.9}];

戻る


密度関数のグラフ

密度関数は次のように用いる。DensityPlotは密度を与える関数とグラフを描く範囲 をあたえる。

DensityPlot[ Sin[x y], {x,-3,3},{y,-3,3} ];

この命令は関数の値を0と1の間におきかえ、1の近い値は白く0に近い値は 黒く表す。0と1のあいだの値は灰色で表す。別の例を与える。

DensityPlot[ Sin[y - x^2], {x,-3,3},{y,-3,3} ];

もっとはっきりとしたグラフを描きたいときは次のようにする。

DensityPlot[Sin[x y],{x,-5,5},{y,-5,5},
PlotPoints->60, Mesh->False];


DensityPlot[Sin[y - x^2],{x,-5,5},{y,-5,5},
PlotPoints->60, Mesh->False];


ここでPlotPoints->60 の数値を増やすとグラフは解像度があがり、 鮮明になる。また、Mesh->False は格子を消す。
実際、Mesh->Trueとしてグラフを比較せよ。

次のグラフは仕上げだ。機種によっては10分ぐらいはかかる。 ここで500はもっと少ない数値でよい。たとえば、300ぐらいがいいとおもう。 もし、計算機に十分に多くのメモリがありかつ十分に速いのなら1000でも よいが。

DensityPlot[Sin[x y],{x,-8,8},{y,-8,8}, PlotPoints->500, Mesh->False];

DensityPlot[Sin[y] / x, {x, -12, 12}, {y, -12, 12}, PlotPoints->400, Mesh->False];

これ以外に、Exp[x^2 + y^2] や Sin [x^2 y^2], Sin[x y^2] などのグラフを作成せよ。

DensityPlot[ Exp[x^2 + y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->400, Mesh->False];

DensityPlot[Sin [x^2 y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->400, Mesh->False];

DensityPlot[Sin [x y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->400, Mesh->False];

DensityPlot[Sin [x^2 + y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->400, Mesh->False];

DensityPlot[Sin [x + y] , {x, -2, 2}, {y, -2, 2}, PlotPoints->200, Mesh->False];

DensityPlot[Sin [x^2 - y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->200, Mesh->False];

DensityPlot[Sin [x^3+x - y] , {x, -2, 2}, {y, -2, 2}, PlotPoints->200, Mesh->False];

DensityPlot[Sin [x - y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->200, Mesh->False];

DensityPlot[Sin [ x^2 + 2 y^2] , {x, -2, 2}, {y, -2, 2}, PlotPoints->200, Mesh->False];

不連続性を密度分布であらわす
関数x/yy=0で不連続性を持つ。 y の範囲をかえてグラフの様子を観察せよ。 フラクタル構造のようなものが観察できると思う。

DensityPlot[ Sin[x/ y], {x, -8, 8}, {y, -2, 2}, PlotPoints -> 300, Mesh -> False];

つぎの例はありふれた原点で特異性を持つ関数であるが、原点付近で不思議な様子が観察できる。 もっと拡大して、観察してみよう。

DensityPlot[Sin[1/(x^2 + y^2 )], {x, -2, 2}, {y, -2, 2}, PlotPoints -> 300, Mesh -> False];

そのためには、次のように範囲をせまく取ればよい。

DensityPlot[Sin[1/(x^2 + y^2 )], {x, -.5, .5}, {y, -.5, .5}, PlotPoints -> 300, Mesh -> False];

次の例も参照のこと。 不思議な構造が観察できるだろう。

DensityPlot[Sin[y/x^2], {x, -1, 1}, {y, -1, 1}, PlotPoints -> 300, Mesh -> False]

次の図はx=0では振動が発散に置き換わる。

DensityPlot[Sin[ Exp[y/x ]], {x, -.1, .1}, {y, -.1, .1}, PlotPoints -> 300, Mesh -> False]

ピカールの定理を視覚化

DensityPlot[Sin[Exp[x/(x^2 + y^2) ]], {x, -.4, .4}, {y, -.4, .4}, PlotPoints -> 300, Mesh -> False];

z=x+iyとしてz=0で特異点を持つ関数Exp[1/z]は平面を無限回折り込んでいる。 右側のトンネルは左側のトンネルに複素領域を通してつながっている。 平面の右側と左側ではその世界の様子はまったく異なっている。 実、虚 動径方向から見たこの世界をあげておく。これは平面の折込の様子がわかる。

DensityPlot[Sin[Exp[x/(x^2 + y^2) ]], {x, -.6, .6}, {y, -.6, .6}, PlotPoints -> 300, Mesh -> False]

DensityPlot[Sin[Exp[-y/(x^2 + y^2) ]], {x, -.6, .6}, {y, -.6, .6}, PlotPoints -> 300, Mesh -> False]

DensityPlot[Sin[Exp[2 (x - y)/(x^2 + y^2) ]], {x, -2, 2}, {y, -2, 2}, PlotPoints -> 300, Mesh -> False]

戻る


極座標を用いてグラフを描く
まず次のように入力して、Shift+Enterを押す。

<< Graphics`Graphics`

これは、mathematicaにマクロを読み込んで機能を拡張する働きをする。 この命令は各ノートブックごとにただ一度だけ実行する。
もし、2度行なってしまった時は多分そのノートはもうそのマクロは正常に 機能しないので一度mathematicaを終了しなければならないことがおおい。 だから、Shift+Enterを押すまえに、注意深く見直そう。
これが正常に働いた時は、みかけ上何もおきない。 もし、赤字で注意が出た時は多分どこかにまちがいがある。 そのとき、たとえそれを修正しても以下のことは実行できないので、 もう一度mathematicaを終了して、起動してすべてをやり直すことが多い。 うまく、いったら次の命令を実行してみよう。これは正葉曲線といわれる。

PolarPlot[Sin[4 theta], {theta, 0, 2Pi}];

この奇麗なグラフを楽しもう。周期4をかえると花びらの数がかわる。 たとえば次のようになる。

PolarPlot[Sin[6 theta], {theta, 0, 2Pi}];

命令に間違いがないのにこれがうまくいかない時は多分 このパラグラフの最初に述べた、マクロの読み込みがうまくいっていない。 たとえば、前回途中で仕事を中断して、ノートを保存し、それを読み込んで再び仕事を するようなときは、ノートを再評価するかあるいはマクロの読み込みをもう一度 実行しなければならない。
今度はもう少し変わったグラフを描いてみる。この命令は2つのグラフを重ねて描いている。 ここでr=θはアルキメデスの渦巻き線である。

PolarPlot[{Sin[4 theta], theta/4}, {theta, 0, 2Pi}];
PolarPlot[{Sin[6 theta], theta/4}, {theta, 0, 2Pi}];
PolarPlot[{Cos[4 theta], theta/3}, {theta, 0, 2Pi}];

次の曲線はカージオイドといわれる。 2の値を変えるとグラフが変化する。 どのような特徴があるか。値を変えたグラフを書いておこう。

PolarPlot[2 ( 1 + Cos[ theta]), {theta,0,2 Pi}];

PolarPlot[2(.6 + Cos[theta]), {theta, 0, 2 Pi}, AspectRatio -> Automatic];

今度はもっと変わったグラフである。

PolarPlot[2+Sin[4 theta]+ Sin[12 theta]/3, {theta, 0, 2Pi}];

PolarPlot[2+Sin[8 theta]+ Sin[48 theta]/4, {theta, 0, 2Pi}, PlotPoints ->200];

くり返しをつかってもっと芸術的なグラフを描くことができる。

Do[PolarPlot[
Cos[11/12 theta], {theta, 0 ,n Pi},
PlotPoints ->100, PlotRange -> {{-1,1},{-1,1}}], {n,1,24,1}];

戻る


多面体を描く

多面体を描くにはマクロパッケージを読み込む必要がある。 次の命令をまず実行しておく。これにたいする注意は前と同じである。

<< Graphics`Polyhedra`

まず4面体を描く。

Show[Polyhedron[Tetrahedron]];

つぎは正12面体である。
描くことのできる多面体の種類は次の通りである。 Tetrahedronをつぎにかえてどのような多面体があらわれるか試してみよう。
Tetrahedron , Cube, Octahedron, Dodecahedron, Icosahedron, Hexahedron, GreatDodecahedron, SmallStellatedDodecahedron, GreatStellatedDodecahedron, GreatIcosahedron

Show[Polyhedron[Dodecahedron]];

さらに12面体を5つ描く。ここで{k,2 k,k}],{k,0,4} はk=0,...,4まで (k,2k,k)を中心にして描くことを意味する。

Show[Graphics3D[
Table[Dodecahedron[0.7 {k,2 k,k}],{k,0,4}] ]];

もっと多面体の数を多くして、視点を変えてみると次のようになる。

Show[Graphics3D[
Table[Dodecahedron[1 {k,2 k^2/5,k}],{k,-5,5,0.5}]
],ViewPoint ->{1,-1,15} ];


Show[Graphics3D[
Table[Dodecahedron[1 {k,2 k^2/5,k}],{k,-5,5,0.5}] ]];


次の図は正20面体星型の正20面体である。 これらを応用していろいろな多面体を描いてみよう。 また視点を変えてその図形を確認してみよう。Stellateは多面体を星型にする。4.0を大きくすると より鋭い形になる。この数値をかえて試してみよう。

Show[Polyhedron[ Icosahedron ]];

Show[Stellate[Polyhedron[ Icosahedron ] ]];
Show[Stellate[Polyhedron[ Octahedron ], 4.0]]
多面体の角を切り落としたものである。 ここで0.4は40%を切り落とすことを示す。OpenTruncate命令は切り落とした角の内部の多面体を見ることができる。

Show[Truncate[ Polyhedron[Dodecahedron], .4]]
Show[OpenTruncate[Polyhedron[Dodecahedron], .4]]
戻る


方程式を解く

代数方程式を解く

数学の応用で重要なことのひとつとして方程式を解くことがある。 Mathematicaを用いると多くの種類の方程式を解くことができる。
以下でこれについて述べることにしよう。連立一次方程式の解法に関してはあとでふれる。 次の2つは2次方程式を解いている。 ここで方程式での等号は= ではなく、== を用いる点に 注意する。

x^2 - 3 x == 2
Roots[%,x]

ここで、Roots 命令はxについて解を求める命令である。 解は次のようになる。
答えの||は解の集合の和集合をあらわす。すなわち、「または」 に対応する。また、Sqrt[17]17を表わす。

x == (3 - Sqrt[17])/2 || x == (3 + Sqrt[17])/2

これは次のように入力しても同じ答えがえられる。

Roots[x^2 - 3 x == 2,x]

さらに3次方程式あるいは4次方程式でも解を求めることができる。

Roots[x^3 - 3 x == 2,x]

Roots[x^4 - 3 x == 2,x]

ここでIは純虚数を表わします。 この時 Roots のかわりに Solve を用いることもできる。

Roots[x^3 - 5 x == 2,x]
Roots[x^4 - 2 x == 2,x]
Solve[x^3 - 5 x == 2,x]
Solve[x^4 - 2 x == 2,x]
Solve[x^3 - 4 x^2 + x - 2 == 0,x]


あるいは文字を含んだ場合にも解くことができる。

Roots[x^2 - a x == 2,x]
Solve[x^2 - a x == 2,x]
Solve[x^2 + a x == 1,x]
Solve[a x + b == c,x]


ところが5次以上の方程式では一般には代数的に厳密に解くことができません。 例えば、次の方程式は解が求まりません。

Solve[x^6 - 4 x == 2,x]

但し、数学的に厳密な解でなく、 近似的な解は求めることができます。 近似解を求めるためには、N[]を用います。 ここでIは純虚数を表わします。

N[%]

ここで%は前の結果をあらわします。 厳密解が求まる時でも数値解を求めたほうが表示が簡単になる場合があります。 そのような例を以下にあげます。ここでChop[%]は 非常に零に近い数を切り捨てます。

Solve[x^3 - 4 x^2 + x - 2 == 0,x]
N[%]

Solve[x^4- 7 x^2 + x == 1,x]
N[%]

Chop[%]

いっぱんに高次方程式は代数的な厳密解は求まりませんが、 今度は別の表現から出発して解けるような高次方程式の例を与えます。

Expand[Product[x-j,{j,6}]]
Solve[%==0,x]

ここでProduct[x-j,{j,6}]はx-jをjについて、1から6まで積をとることを意味します。 今の場合、(x-1)(x-2)(x-3)(x-4)(x-5)(x-6)をあらわします。 Expand はこれを展開します。これは解けます。 これ以外にも解ける方程式があります。厳密に解くことはできなくても NSolveは数値的に方程式を解きます。

Solve[x^20 == 1,x]
NSolve[x^20 == 1,x]

その他の例としてはつぎの方程式があります。

Solve[ Sqrt[1-x] + Sqrt[1+x] == a, x ]

連立方程式を解く

つぎに連立方程式を解きます。この時解く変数は{x,y}のようにかきます。 この際、方程式はパラメータを含んでいてもかまいません。

Solve[{a x + b y == 1, x+y == 2},{x,y}]

この解は一般解ですが、特別なa=bの時、この表示は意味を持ちません。

連立方程式は高次の場合でも解を求めることができます。

Solve[{x^2 + y^2 == 1, x-y == a},{x,y}]
Solve[{x^2 + y^2 == 1, x-y == 2},{x,y}]
Solve[{x^4 + y^4 == 1, x-y == a},{x,y}]


連立方程式の数値解法

連立方程式を厳密にSolveで解き、さらにNSolveで解いて、 解を比較してみます。多くの場合、前者の表現はあまりに複雑すぎて、 ほとんど意味を持ちませんが、後者の場合には実用的な近似解を与えることが わかります。

Solve[{x^5 + y^5 == 1, x - y == 1},{x,y}]
NSolve[{x^5 + y^5 == 1, x - y == 1},{x,y}]
Solve[{x^6 + y^6 == 1, x - y == 4},{x,y}]
NSolve[{x^6 + y^6 == 1, x - y == 4},{x,y}]


さらに、ある関数について解くこともできます。 今の場合、Sin[x], Cos[x]について、方程式を解いています。

Solve[{Sin[x]+2 Cos[x] ==1, Sin[x]^2 +Cos[x]^2 == 1},{Sin[x],Cos[x]}]
Solve[{Sin[x]+2 Cos[x] ==0, Sin[x]^2 +Cos[x]^2 == 1},{Sin[x],Cos[x]}]


注意 方程式によってはSolveはすべての解を与えずその一部あるいは一般的な解を与えます。 例えば次のような例があります。この場合には注意が表示されます。

Solve[Sin[x] == 1,x]

これを実行すると、エラーが表示され解の一部が求まります。 これは数学的には解を求める時に逆関数を用いたので定義域の関係で 解の一部が失われたことを意味します。しかし、ある解は求まります。

つぎの場合でも同じ注意が表示されます。解が、求まらないかもしれないと 注意がでますが、これらの場合、いずれも解はその一部が求まります。

NSolve[Sin[x] == 1,x]
NSolve[Sin[x]^2 == 1,x]

方程式のすべての解を求めるためにはつぎのような Reduce 命令を 用いる。

Solve[a x ==0,x]
Reduce[ a x == 0 , x ]

Solveでは 一般的な解(a <0, a > 0の時)しか求まらないが、 次の命令ではすべての解が求まる。すなわち a == 0 || x == 0 が求まる。ここで 最初について説明すると、a==0の時は、解は不定であって、無限に多くの解が存在する。
Reduce命令を用いた他の例をあげておく。 ここで && は条件の交わりを表わし、「かつ」に対応する。 || は条件の 和集合をあらわし、「または」 に対応する。 !eqnsのように! をつけると、条件の否定をあらわす。

Reduce[a x^2 + b x + c == 0,x]

これは2次方程式の一般解をあたえる。これより、この方程式には3つの 場合が起こることがわかる。

次の例はReduce命令の特徴を表わしている。その解釈は各自にまかせる。

Reduce[a x^4 + x == 1,x]
Reduce[x == 1,x == -1,x]
Reduce[x == 1 && x == -1,x]
Reduce[x == 1 || x == -1,x]
Reduce[x == 1 && x == a,x]
Solve[x==x,x]
Reduce[x == x,x]

方程式を常に満たすパラメータの値を求める。 SolveAlways[eqns, vars]は方程式eqnsを変数varsについて常に満足する パラメータの値を求める。

SolveAlways[ Implies[x+y == 1, a x^2 + b x y + c y^2 == 1],
{x,y}]

不定形の連立方程式

つぎの例として、解が一意にはきまらない不定形の連立方程式を例にとってみる。 まず係数行列mをとり、その行列式が0であることを確認する。

m = Table[i +j,{i,3},{j,3}]
Det[m]


つぎに方程式を与える。 この方程式をSolveを用いて解く。この解は求まらない。

eqn = m.{x,y,z} == {a,b,c}
Solve[eqn,{x,y,z}]


しかし、Reduce を用いると解が求まる。

Reduce[eqn,{x,y,z,}]


別の例をあたえる。まず方程式をあたえる。これをx,y について解く。 つぎにx,a について解く。

eqn = {x == 2 - a, y == x^2 + a}
Solve[eqn,{x,y}]
Solve[eqn, {x,a}]


未知数の消去

方程式をとくことを一般化して、未知数を消去する。 このためにはEliminate を用いる。

Eliminate[eqn,a]
Eliminate[eqn,y]
Eliminate[eqn,x]


これの応用として、多項式を基本対称式で表わすことができる。

Eliminate[{f == x^5 + y^5, a == x + y, b == x y},{x,y}]
Eliminate[{f == x^4 + y^4, a == x + y, b == x y}, {x,y}]


戻る


微分を計算する
微分には偏微分全微分がある。これらはいずれも Mathematicaで計算可能であるが、まず 1変数の微分から計算してみよう。

常微分

D[x^2,x]

解答はいうまでもないだろう。ここでD[x^2,x]はx2をxで 微分することを意味する。

D[x^4-a x^2,x]


微分する式の中に微分する変数以外の文字たとえば a を含んでいてもかまわない。

D[x^4-a x^2+ x, x]


次の場合にも正しい公式が得られる。

D[x^n,x]


三角関数でも正しい応えが得られる。

D[Sin[x],x]
D[Cos[x],x]
D[Tan[x],x]


もっと複雑な場合でもできる。


D[(1+x^2)/(1+x^5),x]

D[x^n Log[x],x]


2回微分あるいはそれ以上の場合も計算できる。

D[(1+x^2)/(1+x^5),{x,2}]
D[E^x Sin[x],{x,2}]
Do[Print[D[Sin[x],{x,n}]],{n,8} ]

Do[Print[D[Log[x],{x,n}]],{n,5}]

Do[Print[D[(1+x^2)/(1+x^5),{x,n}]],{n,5}]

ここで{x,n} はxについてn回微分することを意味する。 一般の関数に対して計算させると微分の公式もわかる。

D[Log[f[x]],x]
D[f[x]g[x],x]
D[f[x]g[x]h[x],x]
D[f[x]/g[x],x]

最初の微分公式は対数微分の公式といわれる大切な公式である。

合成関数の微分公式も次のようにできる。ここで、{x,2}はxについて 2回微分することを意味する。それ以外も同様である。 何も回数に指定がないときは一度だけ微分する。

D[f[g[x]],x]
D[f[g[x]],{x,2}]
D[f[g[x]],{x,3}]
D[f[g[x]],{x,4}]
D[(1+x^2)^n,{x,3}]
D[(1+x^2)^n,{x,2}]
D[(1+x^2)^n,x]
D[Sin[x^2 +1],x]


偏微分の計算

偏微分も計算できる。たとえばこんなふうになる。括弧の中に微分する変数をしめす。

D[x^3+ y^2,x]
D[x^3+ y^2,y]
D[x^3+ y^2,x,y]
D[x^3 y^2,x]
D[x^3 y^2,y]
D[x^3 y^2,x,y]

ここで関数のあとに偏微分する変数を書く。いくつかの変数で続けて微分する時は 微分する順序に左から順に書く。 合成関数とあわせるともっと複雑な関数も偏微分できる。

D[E^(-x^2 -y^2),x,y,x]
D[E^(-x^2 -y^2),{x,2}]
D[E^(-x^2 -y^2),x,y]

もっと複雑な場合も計算できる。

Do[Print[D[Sin[x]Sin[y],{x,n},{y,n}]],{n,5}]


微分あるいは偏微分は ベクトルの形に関数がかけている時も実行できる。

D[{x^2, Sin[x]},x]
D[{x^2, Sin[x],Cos[x]},x]
D[{y x^2, y Sin[x],Cos[x y]},x,y]


全微分の計算

全微分Dtで計算する。次のようになる。

Dt[x^2 Sin[y]+y^2 E^x]
Dt[x^2 Sin[y]+y^2 Cos[x]]
Dt[{x^2 Sin[y]+y^2 E^x, x^3 y^4}]

戻る


積分を計算する

積分には不定積分と定積分がある。 一般には厳密にある関数を積分することは微分に比べて 理論的にも困難です。Mathematicaはいろいろな高等関数を用いて これを実行します。
しかしながら、定積分を近似的に求めることは比較的簡単にできます。
また、積分は1変数の積分以外に多変数の積分いわゆる重積分を 計算できる。これは体積あるいは曲面の面積の計算に有効である。 まず、1変数の積分を計算する。
積分する変数を指定するとその変数について積分する。 この時は、不定積分であるのでいくつかのパラメータを含んだ一般解が求まる。 次のようになる。

Integrate[x^n,x]
Integrate[x^n + x^5,x]
Integrate[y,x]
Integrate[Sin[x],x]
Integrate[Sin[x]Cos[x],x]
Integrate[Sin[x]E^x,x]
Integrate[Cos[x]E^x,x]
Integrate[ 1/(x^4 -1),x]
Integrate[ Sin[Sin[x]],x]
Integrate[ 1/x,x]
Integrate[ Log[x],x]
Integrate[x Log[x],x]
Integrate[x^3 E^(-x),x]
Integrate[Sin[x],y]
Integrate[Sin[x]Cos[y],y]
Integrate[Sin[y]E^x, y]
Integrate[Cos[x]E^y,x]
Integrate[ y/(x^4 -1),x]
Integrate[ 1/x,x]
Integrate[ y Log[x],x]
Integrate[x y Log[x], x]

解答は書かないが、入力をまちがえなければ答えは必ず正しいものがえられる。
定積分を計算するためにはxの範囲を指定すればよい。 次のようにする。ここで、定積分の端点は数値でなくてもよく、文字にしてもよい。 念のため次の定積分はそれぞれ ∫01 x3 e-x dx, ∫_a^b xn dxである。

Integrate[x^3 E^(-x), {x,0,1} ]
Integrate[x^n, {x,a,b} ]

ただし、つぎの積分は計算できない。

Integrate[ Sin[Sin[x]], {x,0,1}]


しかし、値は計算できる。

N[%]

同様にして、上の積分の例を数値的に実行してみよ。

戻る
より高度な積分の計算法

他の例を計算してみよう。文字を含む場合にも積分は計算できる。 これより我々はよく知られた幾つかの公式を得る。

Integrate[x^4,{x,a,b}]
Integrate[(x- a)(x-b),{x,a,b}]
Factor[%]
Integrate[(x- a)(x-b)(x-c),{x,a,c}]
Factor[%]


2変数の積分、すなわち重積分にたいしても積分を実行できる。 ここで最初の積分は矩形0 ≤ x ≤ a, 0 ≤ y ≤ b 上で積分を実行する。
2番目の積分は三角形

0 ≦ x ≦ a, 0 ≦ y ≦ x

において積分を実行する。
3番目の積分は円の右半分において積分を実行する。

Integrate[x^4 + y^2,{x,0,a},{y,0,b}]
Integrate[x^4 + y^2,{x,0,a},{y,0,x}]
Integrate[x^2+y^2,{x,0,1},{y,0,Sqrt[1-x^2]}]


問題
楕円 4 x2 + y2=1の囲む面積をもとめよ。(ヒント: 被積分間数は1とする。積分範囲は上の三番目の積分を参考にしてきめよ。)
同様ないくつかの例を与えておこう。 積分範囲を変えていろいろ試してみよ。 積分範囲が文字を含む場合も試してみよ。

Integrate[x y,{x,-Pi,Pi},{y,-1,1}]
Integrate[x^2+y^2,{y,0,3},{x,-y,y}]
Integrate[x,{x,0,2},{y,Sinh[x^2],Cosh[x^2]}]
Integrate[Sin[y]/y,{y,0,Pi/2},{x,0,y}]
Integrate[x+y^2,{x,0,1},{y,0,Exp[x]}]
Integrate[x^2 Sin[y],{y,0,Pi/2},{x,0,Cos[y]}]
Integrate[3Cos[x^2+y^2],{x,0,Sqrt[Pi/2]},
{y,-Sqrt[Pi /2 -x^2],Sqrt[Pi /2 -x^2]}]


積分は場合によっては端点で被積分関数が特異点を持ち、 値が無限大になる場合にも求めることができるときもある。 たとえば次の例では最初の場合がそれにあたる。これに反して 2番目の例では正確な値は求まらない。実際積分は存在しないことが 理論的に証明される。
第3番目の例では被積分関数の特異点はx=0であり、積分するときに この点を{x,-1,0,1}のようにはさんでおくと値が正確に求まる。 尚、上の第四番目の例も参照のこと。

Integrate[1/Sqrt[x],{x,0,1}]
NIntegrate[1/x,{x,0,1}]
NIntegrate[1/Sqrt[Abs[x]],{x,-1,0,1}]


被積分関数の積分が厳密に求まらないときにも、 その数値的な近似値は求まることが多い。
このような例をあげる。以下では統計において重要な正規分布を 例にとり、その積分を計算する。この分布の分散は1であり、 検定、予測などにおいてこの値は重要である。
また、この積分においては積分端点として∞を用いることができる。6番目を参照のこと。 さらに2次元正規分布にたいしても同様に積分を 計算できる。

Plot[Exp[-x^2],{x,-8,8},PlotRange->All]
NIntegrate[Exp[-x^2],{x,-8,8}]
NIntegrate[Exp[-x^2],{x,-2.5,2.5}]
NIntegrate[Exp[-x^2],{x,-3,3}]
%/1.77245
NIntegrate[Exp[-x^2],{x, -Infinity, Infinity}]
NIntegrate[Exp[-x^2] Exp[-y^2],{x, -2, 2},{y,-2,2}]


数値積分は例えば統計学においてある種の確率を求めるときには 有効である。
この時、我々は分布表を用いる必要はない。 詳しくは、別の項目を参照のこと。

戻る