Wizardry mathematics 4
表計算ソフトで解く連立1次方程式

序 連立方程式とWizardryとクリス_NKの密接な?関係

 Wizでいきなり連立1次方程式とか何ぬかす?と思うかもしれませんが、私のサイトのWizコンテンツと連立1次方程式、ちょっとだけ関係があります。

 昔の話ですが、『Wizardryセンター試験』というコンテンツを他のサイトから引き継いだことがあり、第2回で私がオリジナルの問題を出題したときには連立1次方程式の問題を出題したことがあります。実際の出題はこれ。

<問>

 ボルタック商店が新しいアイテム問屋と契約が成立し、大創業祭を実施した。

 冒険者の一人、魔術師の女の子エルミーネは前々から欲しかった『大地の杖』と『トロルの指輪』を入手しようと店に走ったが、当日『大地の杖』は15%オフ、『トロルの指輪』は12%オフの価格で売られていた。

 2つを購入したエルミーネの支払った額は69,440GPで、平均すると定価の13.2%匹の値段で2つを購入できた計算になる。 『大地の杖』と『トロルの指輪』の定価はいくらかを求めよ。 

<解答例>

「大地の杖」の通常価格をx、「トロルの指輪」の通常価格をyと置くと、題意より以下の2式が成立する。

(1-0.15)x + (1-0.12)y = 69440
(1-0.132)×(xy) = 69440

これらを連立方程式として解くと、x=32000、y=48000を得る。

 加えて、もう1つの連立1次方程式ネタが、執筆中の『もう一つのLlylgamyn Saga』にも登場しており……こっちはさらに未知数が多い、難度の高い方程式となっています。

『ALS』における連立方程式 (以下「ALS式」とする)

3x+5y+2z+2u=10
xy+3z-2u=-4
2x-4yz+3u=-9
x-5y-3z-4u=-14

これを解くと、x=-1、y=3、z=-2、u=1 となりますが、この方程式、なかなかに解くのは難しいものです。その辺の話からまず見ていきましょう。

1 連立方程式の解き方のおさらい

 通常、中学2年の数学で習う連立1次方程式※1といえば、解く際にこんなことをします。

<例題>

次の連立方程式を解け。

2x+3y=5
 3x+4y=7

<解答>

 第1式を3倍したものから第2式を2倍したものを引くと、
   6x+9y=15
 -)6x+8y=14
 ―――――――
     y=1
 これを第1式(第2式でも良い)に代入し、x=1を得る。

 この際に、第1式と第2式に任意の数をかけてから、片方の式からもう片方を引いて……という操作をします。このような操作のことを加減法というわけですが、一方で通常連立方程式といえば代入法を使って解くことが多くなります。

<問>

次の連立方程式を解け。

x2y2=1
xy=1

<解答>

xy=1より、y=1-xであり、これを第1式に代入すると、
x2+(1-x)2=1
2x2-2x=0 ∴x=0、1
x=0のときy=1、x=1のときy=0

∴(x, y) =(0,1) (1,0)

 とまあ、1次以外の連立方程式はよほどのことがない限り代入法で解くことになります。とはいうものの、次数が2以上の方程式で未知数が3つも4つもとなると式変形やら代入やらで頭が混乱しかねません。

 一方で、次数が1であれば、そこまで……というほどのものではないものの、単純に係数と定数項を何倍かして足したり引いたり……というのを繰り返していけば、いつかは未知数を一つ一つ消去して、簡単な1次方程式にすることができる……と言うのは建前。これ、1つ変数を消去するのは何とかできても、2つ目を消すとなるとなーかなか言うことを聞いてくれないのでございます。

2 未知数3以上の連立方程式を加減法で解く無謀さ

 未知数が3以上の連立方程式を解くのは、特殊な形のものを覗いてかなり困難を極めます。代入しようとすると係数にまつわる体系が複雑になって面倒だし、加減法を用いたところでうまい具合に係数が0になり、最終的に「任意の1文字=k」という風に求まるまでに何段階もの変形を経なければなりません。

 実際に「ALS式」を解こうとしてみると……

  1. 3x+5y+2z+2u=10
  2. x+y+3z-2u=-4
  3. 2x-4y-z+3u=-9
  4. x-5y-3z-4u=-14

まず、第2式と第4式を足すと、一気にxzが消去されて楽になりそう、という検討はつきます。結果として、

-4y-6u=-18 ∴2y+3u=9

 ここまではいいんですが、問題はその先。とりあえず今回はxを集中的に消去していきましょう。4式をうまく使って、xの項を含まない式を作ります。

第1式を2倍して、
 6x+10y+4z+4u=20
第3式を3倍して、
 6x-12y-3z+9u=-27
上の式から下の式を引くことで、

22y+7z-5u=47

 同様にして、第3式から第4式の2倍を引くと(計算式は省略)、

6y+5z+11u=19

したがって、与えられた4元1次連立方程式は

  1. 2y+3u=9
  2. 22y+7z-5u=47
  3. 6y+5z+11u=19

という3元1次連立方程式へと変数を減らすことができます。ここからさらに操作を加えて、変数を減らします。第5式をそのまま使えるように今回はzを消去します。そのために、第6式を5倍したものから第7式を7倍したものを引きましょう。双方zの係数が35になるは、定数項がでっかくなっちゃったで大変だわですね。

第6式は 110y+35z-25u=235
第7式は 42y+35z+77u=133
上から下を引くと、 68y-102u=102 ∴2y-3u=3 (引いたものを34で割った結果。これを第8式とする)

ここまでくれば普通の連立方程式ですね。第5式と第8式を足すと、
 4y=12 ∴y=3

 順次、これを未知数が多い状態の方程式に代入してやると、

頭使ったなあ……疲れます、こんなのいちいち手計算でやってたんじゃ。

3 「行列」という概念を導入しよう

 そこで、行列という概念を用いて、計算を楽にしてみましょう。行列のことを英語ではマトリックス(matrix)という……誰だそこであの「弾丸を変な避け方する映画」って話したの。まあ、あれとも関係がなくはないというか……そのへんはハイレベルな線形代数学※2の話になりますから省略しますが、ここでは「行列」という概念を「次数が1だが多変数の式を一度に扱うための概念」とだけ考えて扱います。

 なお、行列を表す場合、アルファベットの大文字イタリックのABCで表したり、(aij1≦im
1≦jn
というややこしい表し方を使ったりもします。本稿では表記を簡潔にするため、大文字イタリック体1文字で行列を表します。

○ 係数を「行列」という概念にしてしまおう

では、行列で連立方程式を考えるときに使う手法として、「係数行列」と「拡大係数行列」というものを考えていきましょう。

係数行列とはそのものずばり、係数をそっくりそのまま抜き出したものを縦横に並べたものです。1つの式に並んでいる係数を横に、同じ文字についている係数同士を縦に並べていきます※3

したがって、ALS式を係数行列に直すとこうなります。

3522
-113-2
2-4-13
1-5-3-4

拡大係数行列というのは、この行列にさらに定数項を一番右の列に付け足す形のもので、この形にして初めて行列の概念を用いて連立1次方程式を解くことができるようになります。なお、定数項部分を明確にするために、最後の列の左に点線や実線を書く書き方もありますし,書かないやり方もあります。今回は点線を書くやり方で拡大係数行列にします。

352210
-113-2-4
2-4-13-9
1-5-3-4-14

○ 行基本変形

 では、この行列で並べた係数・定数項を、どうやって変換してくのかという話に移りましょう。

 変形をしていくにあたって、代入法による一方通行の操作ではなく、加減法を応用した形である「その操作を逆に辿っていくと元の式の塊に戻る」という形でやっていきましょう。そのために必要なのが「行基本変形」※4というテクニックです。

  1. ある行に0でない数をかける
  2. ある行に他の行をk倍したものを加える
  3. 2つの行を入れ替える

 これらを駆使して、拡大係数行列を変形していき、定数項部分に相当する列以外を簡単な形に変えていくことで、連立方程式を解くというのが主眼になります。

○ 「階段行列」を作るーー掃き出し法※5のススメ

 行列の行基本変形で得ようとする最終形は、定数項の列以外について、行の番号と列の番号が一致するもの(これを対角成分という)が1、それ以外全部0にした形になります。つまりこれ。

1000α
0100β
0010γ
0001δ

 ちなみに、対角成分が1,それ以外が全部0で構成された行列のことを単位行列と言います。一般には(特に明らかに行列の話をしていると分かる場合)大文字のEで表すことが多く、また、後述の行列の掛け算を行う際、この単位行列を掛け算すると、どちら側からかけても積がもとの行列と一致するという特徴があります。すなわち、数における1と同じ役割を行列に於いて果たしているとみなすことができます。

 この形で連立方程式を考えるとすると、例えば未知数が左からxyzuであったとすると、それぞれ上からx=α、y=β、z=γ、u=δを意味しています。したがって、最終的にこの形にすることができたときはじめて「連立方程式の解を求めることができた」ということができます。

 ちなみに、このように最終的に単位行列にする目的などで行列を変形するにあたって、上記の行基本変形を効率的に用いる方法があります。その方法が掃き出し法です。

 掃き出し法は、行基本変形を用いて、まず第1行の第1列に±1を作り、それをもとに第2行以降の第1列に0を作っていき(上記の行基本変形の一つである「ある行に他の行をk倍したものを加える」を用いる)、次に第2行第2列に……という形でどんどん0を作っていく方法です(説明参照は 石村 2000より)。

 たとえば、こんな行列があったとします。

0-24
10-1
-211

 この行列を単位行列に変形しましょう。

1, 第2行と第1行を入れ替える

10-1
0-24
-211

2, 第3行に、第1行の2倍を加える

10-1
0-24
01-1

3, 第3行と第2行を入れ替える

10-1
01-1
0-24

4, 第3行に第2行の2倍を加える

10-1
01-1
002

5, 第3行に1/2をかける

10-1
01-1
001

6, 第1・2行に第3行を加える

100
010
001

4 連立方程式を表計算ソフトで・1 逆行列法

 しかしながら、これらの計算はかなり面倒なものですし、また複数の変数・係数を同時に扱わなければならないため、かなり間違えやすい演算でもあります。ところがここで文明の利器、コンピューターの登場です。こいつのお陰で行列の計算もあっという間にできてしまいます。

 上記の行基本変形を用いずに、実際に連立方程式を簡単に解ける方法を考え直しましょう。

 この方法は、連立方程式の未知数の種類数と、式の本数が同じである場合にのみ用いることができます。それ以外の場合は使えませんので念のため……。

 そこで考えられるのが、実際に係数行列を一発で単位行列にしてしまう方法です。これがじつはあるんでございます。それが「逆行列」を用いる方法です。

 逆行列とは、任意の正方行列(行数と列数が同じ行列)Aについて、AXXA※6E を満たすような行列Xのことをいい、通例A-1※7と表します。

 行列の掛け算の定義は大変にややこしいので、ここでは詳細を書かずに説明しますが、任意の連立方程式は、係数行列をA、定数項を縦に並べた行列をB、未知数を順番に縦に並べた行列をXとおくと、AXBとおくことができます。

 ALS式の場合を例に取ると、次のとおりです。

A

3522
-113-2
2-4-13
1-5-3-4

X

x
y
z
u

B

10
-4
-9
-14

 さて、連立方程式(ここより、本稿では任意の連立1次方程式の係数行列をA、定数項を縦に並べた行列をB、未知数を順番に縦に並べた行列をXとおくものとします)AXBについて、左辺をXのみにしてしまうための演算、すなわち左辺右辺に同じ値なり行列なりをかけて単位行列を作る方法を考えていきます

 ちなみに、ここから行列の掛け算がでますが、確認すべき法則として、以下の2つを指定しておきます。

 連立方程式AXBは、左からA-1をかけることで左辺がEXXEXとなります。同様に右辺も左からをかけなければ等号が成り立ちませんので、同じように係数行列の逆行列をかけると……XA-1Bという公式が成り立ちます。

 では、実際に表計算を用いて逆行列を求めてみましょう。ここでは表計算ソフトの関数機能を用いますので、数字だけではなく文字入力なども必要になります。

まず、係数行列をこのまま(一つ一つの数は一つのセルにこの順番通りに収める)入力し、少し話した部分に定数項だけを入れます。

 ABCDEF
1 3 52210
2-113-2-4
32-4-13-9
41-5-3-4-14
5

 ここから逆行列を計算します。逆行列に使う関数はMINVERSEです。今回は6~9行目にA-1を書き出します。この場合に注意しなければならないのは、あらかじめ必要な分だけセルを選択しておき(この場合は4×4)、そこで初めて=minverseという風にし、さらにWindowsならCtrl+Shift+Enter、Mac OSならCommand+Shift+Enterと押さなければならないという……ちょっと面倒です。

 ABCDEF
13 52210
2-113-2-4
32-4-13-9
41-5-3-4-14
5
6    
7    
8    
9    
10
 ABCDEF
1 3 52210
2-113-2-4
32-4-13-9
41-5-3-4-14
5
6=MINVERSE(A1:D4)   
7    
8    
9    
10
 ABCDEF
1 3 52210
2-113-2-4
32-4-13-9
41-5-3-4-14
5
6 47/2041/24 19/204 67/408
75/68 -1/8 -11/68 -3/136
81/51 1/3 8/51 -2/51
9-5/102-1/12 11/102-31/204
10

さらに、行列の掛け算を演算します。これで使う関数がMMULT関数です。したがって、上の表組であれば、まず解を出したいセル4マス(求めるべき値が4つあるため)をあらかじめドラッグしておき、そこに =MMULT(A6:D9,F1:F4) とします。,の前が逆行列の範囲(左上のセル:右下のセル)、,の後ろが定数項の行列の指定になります。

 ABCDEF
1 3 52210
2-113-2-4
32-4-13-9
41-5-3-4-14
5
6 47/2041/24 19/204 67/408 =MMULT(A6:D9,F1:F4)
75/68 -1/8 -11/68 -3/136 
81/51 1/3 8/51 -2/51  
9-5/102-1/12 11/102-31/204 
10

すると、上から解である x=-1、y=3、z=-2、u=1を求めることができます。

5 連立方程式のを表計算ソフトで・2 クラメルの公式

 行列の話をするときに、「クラメルの公式」という概念があります。正式には行列式の概念において補助的に用いられる定理なんですが、この方式ですと、なんと「解がない」「解が無数にある」の区別もつくというメリットがあります。その代わり「行列式」という概念を考えなければならないので手計算の場合は非常に面倒ではあります。

 しかし、行列を表計算ソフトで扱うという場合に限っては話が別。むしろ逆行列法よりも数字がきれいになるので、解がきれいに出るというメリットのほうが大きく、表計算ソフトを用いて連立方程式を解く上では非常に役に立ちます(本来は3次でもかなり面倒な、まして4字以上となると手間がかかりすぎる行列式の計算が非常に楽になるので)。

 では、実際に解いてみましょう。その前に、クラメルの公式というものを説明しておきましょう。ここで、|A| という大文字を縦棒で囲ったものをAの行列式とします(他にも detA という表記法もある)。

クラメルの公式

 式の本数と未知数の数がn個の連立方程式 AXB (ただし、X=t(x1, x2, x3……xn))について、

x1=|A1| / |A|, x2=|A2| / |A|, ……xn=|An| / |A|

 ただし、Ak は、係数行列Aの第k行目を B で置き換えたものである。

具体的にALS式で検証してみましょう。

 ABCDEF
1352210
2-113-2-4
32-4-13-9
41-5-3-4-14
5

これについて、実際に行列式を計算していきます。行列式を計算するための関数はMDETERM関数で、=MDETERM(左上のセル:右下のセル)とします。したがって、この場合は=MDETERM(A1:D4)ですね。とりあえずE1セルにこの関数を入れて計算します。

 ABCDEF
13522=MDETERM(A1:D4)10
2-113-2-4
32-4-13-9
41-5-3-4-14
5

そうすると、E1に-408という値が出てくるはずです。この-408が |A| の値になります。

では、次に |A| の第1行を B で置き換えた行列の行列式を計算します。 をそのままにしたいので、その下の行に A をコピペして、定数項 B で置き換えたものを同様に作って行列式を計算します。

 ABCDEF
13522-40810
2-113-2-4
32-4-13-9
41-5-3-4-14
5
610 522=MDETERM(A6:D9)
7-413-2
8-9-4-13
9-14-5-3-4

計算すると、この値は408 となります。

以下同様に、第2行目・第3行目・第4行目を各々 B 置き換えたものを作って行列式を計算します。

 ABCDEF
13522-40810
2-113-2-4
32-4-13-9
41-5-3-4-14
5
610 522=MDETERM(A6:D9)
7-413-2
8-9-4-13
9-14-5-3-4
10
11310 22=MDETERM(A11:D14)
12-1-43-2
132-9-13
141-14-3-4
15
163510 2=MDETERM(A16:D19)
17-11-4-2
182-4-93
191-5-14-4
20
2135210 =MDETERM(A21:D24)
22-113-4
232-4-1-9
241-5-3-14
25

結果はそれぞれ、-1224、816、-408となります。

最後に、これらの入れ替え行列式を、もとの係数行列の行列式で割ったものが会になります。すなわち、 x=408 / -408=-1、y=-1224 / -408=3、z=816 / -408=2、u=-408 / -408=1

 ただ、この方法の場合、最初の |A| が0になった場合は計算不能になります(0で割る計算はいくらExcelでもできないため)。この場合は、任意の文字を使った形の解、すなわち解が無数にあるケースになったり、あるいは逆に絶対解が存在しないケースになります。

「解が一杯」「解なっしー」って?

 連立方程式を解いていくと、たま~に変な式になってしまうことがあります。

問題例1・次の連立方程式を解け。

xy-2z=-2
3x+5y-3z=5
xy+5z=5

 係数行列を A とおき、第n列を定数項で置き換えた行列を An とおく。このとき、
|A|=0、|A1|=-56、|A2|=24、|A3|=-16
よって解なし。

※実はA-1も存在しないため、この方程式は逆行列法でも解けない。さらに、掃き出し法や加減法を用いて計算すると、「0x+0y+0z=0以外の数」になってしまい、こんな数は存在しないので「解なし」となる。

 一般に、クラメルの公式において、係数行列の行列式が0、かつ任意の列を定数項で置き換えた行列の行列式の少なくとも1つが0ではない場合は、その連立方程式には解が存在しない。係数行列も全ての「置き換え行列」も0だった場合については、解が無数に存在する場合と解が存在しない場合がある。

問題例2・次の連立方程式を解け。

xy-2z=0
3x+5y-3z=5
xy+5z=5

 上記と同様に、|A|=0、|A1|=0、|A2|=0、|A3|=0

 拡大係数行列を掃き出し法を用いて変形すると、

20-7-5
0235
0000

 上記の行列を方程式に直すと、

2x+-7z=-5
2y+3z=5

となり、zkkは任意定数)とすると、x-5/2+7k/2、y=5/2-3k/2、zk となる。