数式処理ソフト DERIVE(デライブ) de ドライブ

40.ベクトル解析(1)

1.VISTAでのヘルプファイルの表示

「VISTAで、数式処理ソフト DERIVE(デライブ)のヘルプファイルが使えないのは、やっぱり、不便ね」

「そうじゃな。ベクトルAのrot Aの演算が見つからなくて、わしゃ、作ってしもうたがな。後で調べたら、CURL(A)だそうじゃな」

「でしょ。でしょ。なんとかしてよ!」

「マイクロソフトのサポートページにアクセスして、必要ファイルをダウンロードして、インストールせにゃならんが、ちと、面倒じゃな。
ともちゃん、やっておくれ」

「ハイハイ。「Windows ヘルプ (WinHlp32.exe) プログラムを必要とするヘルプ ファイルを開くことができない問題を解決する、Windows Vista 用および Windows Server 2008 用のダウンロードについて 」(マイクロソフト:http://support.microsoft.com/kb/917607)のことね。
それにしても、長いタイトル。インストール完了よ」

「今度は、どうじゃな」

「バッチリ。でも、いちいち、「このマクロの実行には問題があります」という「注意」が表示されるのも、うざったいわね」

「それも、そのページの後段に説明があるのじゃが、解消するには、レジストリを操作する必要があるようじゃな。当面、やむを得んじゃろうて。
それより、このあたりで、rot(A)などのベクトルの演算について、ともちゃん、ご苦労ついでに紹介しておくれ。
わしゃ、少し、夏ばて気味なので休んでおるからな」

2.方向余弦

「あーもう。ずるいわね。しょうがないか。でも、なんか参考書がないと難しいわね。おじさんの本棚にはないかな。
「ベクトル解析 倍風館」(安達忠次著:昭和45年 改訂版)か。ずいぶん、古い本だけど、ま、基礎的なことは関係ないか。まずは、方向余弦ね」

以下、私、「ともちゃん」が説明するので、「 」書き(「せりふ」よ!)は、省略します。では、スタート。
 このあたり、橋本治さんの「桃尻語訳 枕草子」(河出書房)を意識してんのが分かる? あたし、清少納言よ、(違うか)
 でも。変ね。「女ことば」で書かれると分かりやすいなんてね。そこで、わたくし考えるんだけど、女の話って無駄なおしゃべりが多いわね。でもそのムダが実は、文中で、適当な「間」をとる効果があるのじゃないかなーと。
 普通の数学や物理の教科書って、一寸のムダも無いように書かれているでしょ。ムダがないって事が必ずしも、効率的でないってことなの、分かる?。要は、女のおしゃべりは、ムダのように見えてムダでないのよ!?
 で、そのムダを省いてしまうと、「あっちの方の国」のように自爆テロなんて考えてしまうのだと思うのよね。「あっちの方の国」って? あっちって、あっちよ!
女や酒、タバコって、ムダな部分もあるかも知れないけど、全部省いてしまうと、世の中、ギスギスしてストレスが溜まっちゃうんじゃないかしら。

 さて、閑話休題(この言い方、古!)、ベクトルAの成分をAx、Ay、Azとするとき、すなわち、A=[Ax,Ay,Az]として、l=cosθ=Ax/A。ただし、x軸とAとのなす角をθとする。同様にm=Ay/A、n=Az/A 。これらのl、m、nをAの方向余弦というのよ。
 なお、Aは、Aの大きさを表します。DERIVEでは、A=ABS(A)と書くことは、すでに知っているでしょ。
方向余弦そのものを求める関数はないみたい。DERIVEのヘルプは、ぜんぶ英語だから、方向余弦の英訳(「drirection cosine」って、言うの)が分からないと引きようがないけどさ。
 ま、無いときは、自分で作ってもいいわけ。あんまり必要はないかも知れないけど。こんな風にすれば、いいと思うの。
 方向余弦を求める関数を、dc_user(vec):=[vec ↓1/ABS(vec),vec ↓2/ABS(vec),vec ↓3/ABS(vec)]と定義する。userを付けたのは、ユーザ定義という意味なの。
 でも、vecの大きさがゼロとなることも考えると、IF関数を使って、
dc_user(vec) := IF(ABS(vec) ≠ 0, [vec↓1/ABS(vec), vec↓2/ABS(vec), vec↓3/ABS(vec)], [0, 0, 0])) としてもいいけど、vecに変数が含まれていると、閉じた形にならないので、使いにくいわよ。
 ということで、dc_user(vec)で方向余弦が求められるという訳。以上、方向余弦、終わり。

3.内積と外積

これは、すでに出ているので、おさらいね。特に断らない限り、今までと同様に3次元のベクトルとします。
ABとの内積は、ABと書く。「内積」の演算子は、DERIVEの右下のパレットの「・」よ。AB=AxBx + AyBy + AzBz=ABcosθでもあるよのね。内積は、スカラー量(普通の数)であることが分かるわね。
次は、外積。A×B=([AyBz - AzBy, AzBx - AxBz, AxBy - AyBx])、大きさは、ABsinθ、方向は、AからBに右ねじを回転させたときにねじが進む方向であることも、すでに出てきたわ。外積演算子「×」は、右下のパレットにあるわ。
ここでは、内積、外積に関するいくつかの演算の復習ね。
ABBAA・(BC)=ABACというあたりは、常識よ。
A×B=-B×Aというのは、前回、こっそりと、登場しているの。おじさんは、はっきりと書いていないけどさ。これは、右ねじのことを考えると定義から明らかね。
これも定義から明らかだけど、A×A0、ここで0は、ゼロベクトルね。分かっているときは、ただの、0と書くこともあるわ。
スカラー3重積とは、A・(B×C)=Ax(ByCz - BzCy) + Ay(BzCx - BxCz) + Az(BxCy - ByCx)=B・(C×A)=C・(A×B)であることは、直接、計算しても分かるわね。
この本によれば、スカラー3重積は、ABCを3辺とする平行6面体の体積を表すそうよ。B×Cの大きさは、BC底面の面積で方向は、底面に垂直なので、その垂直ベクトルとAとの内積は、Acosθなので、平行6面体の体積となることが分かるかしら。
で、次。ベクトル3重積よ。
A×(B×C)=[Ay(BxCy - ByCx) + Az(BxCz - BzCx), Ax(ByCx - BxCy) + Az(ByCz - BzCy), Ax(BzCx - BxCz) + Ay(BzCy - ByCz)] 。
これを、A×B×Cと書いちゃダメ。(A×B)×CA×(B×C)なのよ。A×B×Cと書くと、どっちだか、わかんないでしょ。
で、上の式を眺めると、A×(B×C)=[Bx(AyCy + AzCz) - Cx(AyBy + AzBz), By(AzCz + AxCx) - Cy(AxBx + AzBz), Bz(AxCx + AyCy) - Cz(AxBx + AyBy)] と変形できるけど、(AC)Bx-(AB)Cx=(AxCx+AyCy+AzCz)Bx-(AxBx+AyBy+AyBy)Cx=Bx(AyCy + AzCz) - Cx(AyBy + AzBz)なので、斜体で書いた項は消えるから、結局、A×(B×C)=(ACB-(ABC と変形できるという訳。

4.微分

ベクトルAを[u,v,w]と書いて、各項は、x,y,zの関数とします。
dA/dxは、[du/dx,dv/dx,dw/dz]という意味を表すことにするの。
DERIVEでは、たとえば、uをx,y,zの関数であると定義するとき、u(x,y,z):= と書くだけで言いのよ。右辺は、書かなくていいの。知ってるでしょ。
すると、ベクトルAを定義した後では、Aをxで微分すると、dA/dx=([∂(u(x, y, z), x), ∂(v(x, y, z), x), ∂(w(x, y, z), x)]) となってくれるの。(DERIVEの画面では、普通の微分係数で表示されるのだけど、コピーするとこうなっちゃうのね)
ここで、∂は、∂(関数,微分する変数)という意味。それと、DERIVEでは、u,v,wをx,y,zの関数と定義した後では、ベクトル、A:=[u,v,w]とは、定義できなくて、
A:=[u(x,y,z),v(x,y,z),w(x,y,z)]と書かなくちゃ、Aを定義できないの。ちょっと、面倒だけど仕方ないわ。
この∂を使うと、rot(A)などを自分で作ることができます。rotは、DERIVEでは、CURL( )という名前の関数で定義済みなのだけどもね。
おじさんも作ったって、言ってたじゃない。ユーザ定義なので、userを付けます(userを付けるのは、必須じゃないけどね。分かりやすいでしょ)。こうするの。
rot_user(vec):= [∂(vec↓3, y) - ∂(vec↓2, z), ∂(vec↓1, z) - ∂(vec↓3, x), ∂(vec↓2, x) - ∂(vec↓1, y)]
試しに、上のAを引数とすると、rot_user(A)=[∂(w(x, y, z), y) - ∂(v(x, y, z), z), ∂(u(x, y, z), z) - ∂(w(x, y, z), x), ∂(v(x, y, z), x) - ∂(u(x, y, z), y)] となってくれるわ。CURL(A)としても、同じになるのよ。当たり前だけどね。

5.▽またはGRAD

安達先生の本だと、このあと、座標変換だとか、運動方程式とか、いっぱい章があるんだけど、ここは、ベクトルの演算ということなので、飛ばしてしまいます。
そこで、まずは、関数φ(x,y,z)からベクトルを作る演算ね。これは、知ってるでしょ。
直角座標では、▽φ=[∂(φ,x),∂(φ,y),∂(φ,z)]よ。
▽は、ナブラと読むのよ。でも、DERIVEでは、GRAD( )という関数なの。英語の「勾配」という意味の gradation から来ているんでしょう。
それっと、安達先生の本の注によると、ナブラというのは、nablaで、ヘブライの竪琴の名前である、と書かれているわ。形からそう言うんだと思うの。優雅な名前。知らなかったでしょ。ハミルトンの演算子とも言うそうよ。ホント、勉強になるわね。
物理的には、A=-▽φと書いて、φをAのポテンシャル(関数)と呼ぶのは、知ってると思うけどさ。
さて、前述のu(x,y,z)から、-▽uは、-GRAD(u(x,y,z))=-[∂(u(x, y, z), x), ∂(u(x, y, z), y), ∂(u(x, y, z), z)] と計算できるわ。
極座標などの別の座標系では、表現が違ってくるけど、別の回に、おじさんにやってもらうわ。

6.▽・またはDIV、及びラプラシアン

DIVって、発散よ。divergence このスペル、知ってた? 私、知りませんでした。ハイ。diverge とは、英語で、分かれる、分岐するなどの意味があるようよ。
で、▽・A=div(A)=du/dx+dv/dy+dw/dz 。
DERIVEでは、たとえば、DIV(A)とすれば、∂(u(x, y, z), x) + ∂(v(x, y, z), y) + ∂(w(x, y, z), z) と計算できるわけ。
次。ラプラスの演算子。ラプラシアン( Laplacian)。ナブラ2乗とも言うのね。
2φ=△φ=DIV(▽φ)とすれば、∂(φ(x, y, z), x, 2) + ∂(φ(x, y, z), y, 2) + ∂(φ(x, y, z), z, 2) などとなるのね。

ファイ! 皆さん。(違うわね) ハイ! 皆さん。ここで、DERIVEでの新らしい記法が出てきたわよ。
∂(関数,変数,微分回数)なの。微分回数が1のときは、省略できたのね。
ベクトルがポテンシャル関数から導かれる場合は、A=-▽φなので、div(A)=▽・(-▽φ)=-▽2φ=-(d2φ/dx2+d2φ/dy2+d2φ/dz2) と書けるのよ。
やさしい例だと、質量mの物体に作用する地上付近の重力は、上向きにz軸の正方向をとれば、f=-mgで、fは、ポテンシャル関数、φ=mgzから導かれるでしょ。このφは、d2φ/dz2=0という、通称、ラプラスの方程式を満たす関数になっているのよ。
 ラプラスの方程式、▽2φ(=△φ)=0を満たす関数を調和関数というそうよ。覚えておきましょ。

7.▽× または rot または curl

最後に、回転よ。ああ、疲れた。そろそろ、おじさんにローテーションしょっと。rotation よ。
 ▽×A=rot(A)=[∂(w(x, y, z), y) - ∂(v(x, y, z), z), ∂(u(x, y, z), z) - ∂(w(x, y, z), x), ∂(v(x, y, z), x) - ∂(u(x, y, z), y)] 。
 だけど、DERIVEでは、rot という表記ではなくて、curlなの。カールよ。お菓子のカールと同じ。頭の毛のカールも。
 curl(A)なの。さっき言ったように、rotという演算関数は、DERIVEでは、定義されていないの。気をつけてね。
 ついでに言っておくと、ベクトル Bが、B=curl(A)(=rot(A))のように、別のAから導かれるとき、ABのベクトルポテンシャルといいます。電磁気や流体で出てくるのね。

8.諸公式

「ともちゃん。お疲れさんじゃった。最後に▽などを含んだ公式を並べて欲しいのう」

「もう、人使いが荒いわね。了解っす。
では、以下の公式を証明せよ。ジャーン。ただし、DERIVEを使え」

1.f(x,y,z)、g(x,y,z,)を3次元空間上の関数とする。また、Aは、同様にベクトル関数とする。
 このとき、▽(f * g)=g▽f+f▽g 。
 DERIVEで扱うときは、左辺と右辺を別々に計算し、引き算して、ゼロ(この場合は、ゼロベクトル)になることを確かめる、ということね。
 この場合は、▽演算子が本質的に微分演算子なので、関数の積の微分を考えると、この結果は、納得ね。

2.div(f * A)(=▽・(f * A))=▽f・A+f▽・A(=▽f・A+f * div(A))
 最初に、関数 u、v、wを u(x,y,z):= などと定義しておき、それを使って、A:=[u(x,y,z),v(x,y,z),w(x,y,z)]とベクトル関数Aを定義するのよ。
 後は、左辺と右辺を計算して引き算を行います。内積のところで、CONJ( )という関数が出てくるので、びっくりするけど、「複素共役」という意味なの。ここは、すべて実数なので、CONJ( u(x,y,z))などを、DERIVEの代数メニューから「式の置換」を利用して、 u(x,y,z)に置換してしまいます。

3.rot(f * A)(=▽×(f * A)=CURL(f * A))=▽f×A+f * rot(A
 これは、そのまま、問題なく左辺-右辺=ゼロベクトルと計算できるわね。

4.div(A×B)(▽・(A×B))=B・(▽×A)-A・(▽×B)(=B rot(A)-A rot(B))
 この場合も、CONJ関数が現れるわ。DERIVEさんに、u などが実関数だと伝える方法がないのかしらね。

5.rot(A×B)(=▽×(A×B))=(B・▽)A-(A・▽)BA div(B)-B div(A
6.▽(AB)(=grad(AB))=(A・▽)B+(B・▽)AA× rot(B)+B×rot(A
7.▽×(▽f)=0
8.▽×(▽・A)=0
9.▽×(▽×A)=▽(▽・A)-▽2A

「あー。5番目以降は、時間が無くて、DERIVEで証明できましぇんでした。皆さん、Let's Try!」
※上記公式は、前述の安達先生の本及び「科学技術者のための数学ハンドブック」(鈴木増雄・香取眞理・羽田野直道・野々村禎彦 著:朝倉書店2002年9月)から抜粋しました。

最終更新日 2008/8/20