連立方程式の解法

Similar documents
エクセルによる数値計算と化学への応用

Microsoft Word - VBA基礎(6).docx

Microsoft Word - VBA基礎(3).docx

PowerPoint プレゼンテーション

計算機シミュレーション

初めてのプログラミング

行列、ベクトル

Microsoft PowerPoint - VBA解説1.ppt [互換モード]

Excelを用いた行列演算

関数の定義域を制限する 関数のコマンドを入力バーに打つことにより 関数の定義域を制限することが出来ます Function[ < 関数 >, <x の開始値 >, <x の終了値 > ] 例えば f(x) = x 2 2x + 1 ( 1 < x < 4) のグラフを描くには Function[ x^

エクセルの基礎を学びながら、金額を入力すると自動的に計算され、1年分の集計も表示される「おこづかい帳」を作りしょう

ExcelVBA

Microsoft Word MSExcel2010

プレポスト【問題】

スライド 1

PowerPoint プレゼンテーション

図 2 Excel スプレッドシートの世界 のウィンドウ 図 3 Visual Basic の世界 のウィンドウ 図 3 の VBA ウィンドウは 図 2 の Excel ウィンドウのメニューの ツール をクリックし 開か れるプルダウンメニューで マクロ /Visual Basic Editor

Excel2013 シート・ブック間の編集と集計

「不動産リスト」を解く

Microsoft PowerPoint - 10.pptx

スライド 1

PowerPoint プレゼンテーション

cp-7. 配列

Microsoft Word - VB.doc

C#の基本2 ~プログラムの制御構造~

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft Word - ExcelTable.docx

第 1 節 関数とは 関数とは 与えられた文字や数値に対し 定められた処理を行って結果を返す命令のことです 例えば パンをホームベーカリーで作るには 最初に材料となる小麦粉などを入れ 次いでドライイースト 最後に水を入れるという順序があります そして スタートボタンを押すとパンが完成します ホームベ

プログラミング演習

PowerPoint プレゼンテーション

マクロの実行許可設定をする方法 Excel2010 で 2010 でマクロを有効にする方法について説明します 参考 URL:

6 シート見出しブックに入っている各シート名の名前が表示されます シートとは 表を作るための作業エリア 単にシートという場合はワークシートのことを指します シート上のセルにデータを入力しながら表を作っていきます シートには他にグラフシートもあります 7 数式バー現在操作の対象となっているセル内のデー

< 目次 > 1. 練習ファイルのダウンロード 表計算ソフト Excel の基本 Excel でできること Excel の画面 セル 行 列の選択 セルにデータを入力する ( 半角英数字の場合 )

第9回 配列(array)型の変数

Mapmakerfor の手順下絵を準備 作者の設定した大きさで作成する場合 下絵にする地図を挿入 トリミングと大きさの調整 大きさを調整した画像を保存 下絵を背景に設定 作成画面の大きさを調整 1 自分で用意した下絵を背景にする場合 下絵を背景に設定 作成画面の大きさを調整 画像が大きい場合シート

2 / 16 ページ 第 7 講データ処理 ブック ( ファイル ) を開く第 6 講で保存したブック internet.xlsx を開きましょう 1. [Office ボタン ] から [ 開く ] をクリックします 2. [ ファイルの場所 ] がデータを保存している場所になっている

C#の基本

sinfI2005_VBA.doc

引き算アフィリ ASP 登録用の日記サイトを 作成しよう Copyright 株式会社アリウープ, All Rights Reserved. 1

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Microsoft Word - VBA基礎(1).docx

1セル範囲 A13:E196 を選択し メニューの データ - 並べ替え をクリック 並べ替え ダイアログボックスで 最優先されるキー から 年代 を選択し OK をクリック ( セル範囲 A13:E196 のデータが 年代 で並び替えられたことを確認する ) 2セル範囲 A13:E196 を選択し

PowerPoint Presentation

フローチャートの書き方

Excelで血圧記録表を作成しょう!

やさしくPDFへ文字入力 v.2.0

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

住所録を整理しましょう

Microsoft Word - 205MSPowerpoint2010

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System 操作説明ビデオなどは 高校 情

産能大式フローチャート作成アドインマニュアル

< 住所録の作成 > 宛名印刷には 差し込む住所録ファイルが必要です Excel を使って住所録を作成しましょう Excel の起動 エクセルを起動しましょう ( スタートボタン ) をクリック すべてのプログラム をポイント Microsoft Office をクリック Microsoft Off

クイックスタートガイドデスクトップバージョン GeoGebra とは? ひとつの使いやすいパッケージになった, 動的数学ソフトウェアです すべての教育段階における学習や指導に使用できます 二次元および三次元の幾何 (geometry), 代数 (algebra), 表計算, グラフ, 解析, そして

20180308森の日県南支部 林

PowerPoint プレゼンテーション

スライド 1

MS-ExcelVBA 基礎 (Visual Basic for Application)

パソコンシミュレータの現状

目 次 1. Excel の起動 文字入力 書式設定 枠線の表示 スピンボタン作成 ( 年 ) スピンボタン作成 ( 月 ) 年 と 月 の表示 祝日予定の表示 関数の挿入

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

PowerPoint プレゼンテーション

では、実際に時間割を作成してみましょう

プログラミング入門1

Transcription:

連立方程式の解法連立方程式をエクセルを用いて解く方法は以下の 2 種類が考えられます 1) エクセルの行列関数を用いる 2) VBA でヤコビ法やガウスザイデル法を用いる ここでは両方について説明します 1) エクセルの行列関数を用いる方法エクセルは表計算ですから行と列に並んだ数値を扱うのは得意です 連立方程式は次のように行列を用いて表すことができます 連立方程式が行列形式で表されることを考慮して解法を考えてみます 直接連立方程式を解く前に行列の計算をどの様にエクセルで取り扱うか考えてみます ) 行列の加算行列の加算は行列の各成分同士を足しあわせることにより計算できます 3 33 32 31 2 23 22 21 1 13 12 11 b z y x b z y x b z y x 3 2 1 33 32 31 23 22 21 13 12 11 b b b z y x

加える 2 つの行列を A2:C4 と E2:G4 に入力します 加えた結果を I2:K4 に代入するとします I2 に =A2+E2 と入力し このセルを残りのセルにコピー & ペーストすると残りの成分も自動的に計算されます b) 減算行列の減算も加算と同様に行うことができます 減算を行う 2 つの行列を A12:C14 と E12:G14 に入力します 結果を I12:K14 に代入するとします I12 に =A12-E12 と入力し このセルを残りのセルにコピー & ペーストすると残りの成分も自動的に計算されます c) 乗算行列の乗算を加算や減算と同じように各セルに数式を入力することで計算することも可能です しかし エクセルには行列を扱う関数として MMULT が用意されていますのでこれを利用してみましょう まず 乗算を行う2つの行列を A24:C26 と E24:G26 に用意します そして 乗算の答えを入力する部分をドラッグして選択します ここをクリックする 選択した状態で関数貼り付けのアイコン (fx) を押すか メニューの

挿入 関数を選択します すると関数の貼り付けのウィンドウが現れます このウィンドウの数学 / 三角 ( 関数の分類 ) MMULT ( 関数名 ) を選択して OK を押してください すると乗算に用いる 2 つの行列を指定するウィンドウが現れます この画面で乗算に用いる2つの行列 ( 配列 ) の指定を行います 指定の方法には 2 この部分に直接入力する ックする つの方法があります 1つは直接行列の範囲を入力する方法です 行列の左 上のセルと右下のセルを使って指定します 例えば 今回の場合では A24:C26 と E24:G26 という2つの行列を用意しています このウィンドウの配列 1と配列 2のところに直接 A24:C26 と E24:G26 と入力します 行列の計算は 必ずしも A B B A なので注意しましょう 入力のもう一つの方法はマウスを使って行列を指定する方法です まず 配 この部分をクリ

指定の終了には ここをクリック する 列 1の入力ウィンドウの一番右端のアイコンをクリックしてください 画面が元の表に戻りますから1 番目の行列の範囲をマウスでドラッグしてください ( 上の図の点線で囲まれた部分 ) 指定し終えたらをクリックしてください 元の画面に戻ります これで一つめの行列 ( 配列 1) の入力が終了しました 2 つめの行列 ( 配列 2) も同様に指定します

2 つの行列の指定が終了したらただ OK を押すのではなく Ctrl キーと Shift キーを両方とも押した状態で OK をクリックします すると行列の乗算の結果が示されます d) 逆行列の計算逆行列の計算も関数機能を用います まず 逆行列を求める行列を入力します 乗算と同様に逆行列の結果を表示する部分をドラッグして選択します

この状態で関数の貼り付けのアイコンをクリックします 乗算と同様に関数の選択画面が現れます ここで数学 / 三角 ( 関数の分類 ) MINVERSE( 関数名 ) を選択して OK をクリックします すると次に MINVERSE の条件設定の画面が現れます 逆行列を計算した

い行列を指定して Ctrl キーと Shift キーを押した状態で OK をクリックします すると結果として表示されます

e) 行列式の計算行列式の計算も同じです まず 計算すべき行列を入力します 行列式の値を入力すべきセルを選択し ( 行列式の場合には値はスカラーになるので 1 つのセル ) 関数の貼り付けをクリックします そして数学 / 三角 ( 関数の分類 ) MDETERM ( 関数名 ) を選択します 後は乗算や逆行列と同様に行列をします そして この 場合は結果が数値なのでただ単に OK を押すことにより行列式が計算されます

ここまでで行列の取り扱いが可能になりましたのでこれらを用いて連立方程式を解いてみます まず 連立方程式を入力します ( これは必ずしも必要ではない ) この連立方程式を行列形式で書き表します この行列形式の方程式に対して 要するに両辺から係数行列 ( この場合は 4 4 行列 ) の逆行列をかければ解が得られます

この部分で逆行列の計算を行います ( 逆行列の計算参照 ) その結果が下の図です さらに 計算した逆行列と元の係数行列との計算を左辺と右辺で行います

係数行列が対角行列で成分が 1 になっていることを確認してください 得られた右辺が連立方程式の解です 2) VBA でヤコビ法やガウスザイデル法を用いる方法ここではヤコビ法による VBA プログラムについて説明します 既に VBA プログラムの作成については 2 回説明していますので細かいことについては省略します まず プログラムを起動するコマンドボタンを作りましょう

作成できたら このコマンドボタンに下記のプログラムを入力します Privte Sub CommndButton1_Click() 連立一次方程式.Show End Sub 次に VBA の入力用のフォームを作成します 連立方程式としては三元連立方程式を想定し その係数をすべて入力するフォームを作成します そして その係数を持つ方程式をヤコビ法を用いて解くこととします 下の図はその入力用のユーザーフォームです この例ではガウスザイデル法も計算できるように設計してあります テキストボックス ラベル コマンドボタンなどを用いて下図のようなユーザーフォームを作成してください ヤコビ法の計算は下記の式に基づいて行います x y z i1 i1 i1 ( b 1 ( b ( b 2 3 12 21 31 y i 13 x x i i 23 32 z ) / i 11 z ) / i y ) / i 22 33

このユーザーフォームのヤコビ法のコマンドボタンにプログラムを作り込んで行きます プログラムを作る前にプログラムの流れを考える必要があります 今回は計算に必要な係数の入力 出力をコマンドボタンのプログラムに実行させ ヤコビ法の部分はサブルーチン ( 別の部分にプログラムを書き それを呼び出す形にする ) で実行するようにします これにより サブルーチンはそれだけで開発することができ 別のプログラムを作るときに必要になればその部分だけ呼び出す形で利用することができます さらに そのようにサブルーチン化することにより プログラムの流れを簡単にすることができます コマンドボタンのプログラムの流れは次のようになります 変数定義 係数代入 ヤコビ法計算 解出力 終了

ヤコビ法の部分のプログラムの流れは次のようになります 初期値設定 変数の初期化 反復回数の増加 誤差の初期化 x i の設定 x i+1 の計算 誤差の計算 すべての x i+1 について計算 Yes 誤差 >eps No 終了 ヤコビ法の部分のプログラムはコマンドボタンの部分に記述するのではなく新たにサブルーチン ( プロシージャ ) を追加してそこに記述します プロシージャの追加はメニューの挿入 プロシージャを選択します するとプロシージャの追加のウィンドウが開きますのでここでは名前を YACOBIByRef として Sub プロシージャにチェックを入れて OK を押してください するとこの名前のプロシージャが作成されます このフローチャートに対応するプログラムを次に示します

Privte Sub CommndButton1_Click() Dim M(5, 5) As Double Dim Mb(10) As Double 1 Dim Mx(10) As Double Dim N As Integer Worksheets(" 連立一次方程式 ").Activte Set WS = Worksheets(" 連立一次方程式 ").Appliction N = 3 M(0, 0) = TextBox1.Text M(0, 1) = TextBox2.Text M(0, 2) = TextBox3.Text M(1, 0) = TextBox5.Text M(1, 1) = TextBox6.Text M(1, 2) = TextBox7.Text M(2, 0) = TextBox9.Text M(2, 1) = TextBox10.Text M(2, 2) = TextBox11.Text Mb(0) = TextBox4.Text Mb(1) = TextBox8.Text Mb(2) = TextBox12.Text WS.Rnge("A6") = " ヤコビ法 " WS.Rnge("B8") = " 配列 M の内容 " WS.Rnge("B9") = M(0, 0) WS.Rnge("D9") = M(0, 1) WS.Rnge("F9") = M(0, 2) WS.Rnge("B10") = M(1, 0) WS.Rnge("D10") = M(1, 1) WS.Rnge("F10") = M(1, 2) WS.Rnge("B11") = M(2, 0) WS.Rnge("D11") = M(2, 1) WS.Rnge("F11") = M(2, 2) WS.Rnge("H8") = " 配列 Mb の内容 " WS.Rnge("H9") = Mb(0) WS.Rnge("H10") = Mb(1) WS.Rnge("H11") = Mb(2) Cll YACOBIByRef(M(), Mb(), Mx()) WS.Rnge("D14") = " 繰り返し計算の回数 " WS.Rnge("A13") = " ヤコビ法による方程式の解 " WS.Cells(14, 5) = No WS.Cells(15, 4) = "Mx(0)=" WS.Cells(16, 4) = "Mx(1)=" WS.Cells(17, 4) = "Mx(2)=" WS.Cells(15, 5) = Mx(0) WS.Cells(16, 5) = Mx(1) WS.Cells(17, 5) = Mx(2) End Sub 2

上記のプログラムはこれまで学んだプログラムの文法を用いるとほとんど理解できます フローチャートに対応させて理解してみましょう ここでは注意点と新しい事柄のみ説明します 1 Public Sub YACOBIByRef(N() As Double, Nb() As Double, Nx() As Double) Dim AA As Double Dim eps As Double Dim error As Double Dim i As Integer Dim ii As Integer Dim j As Integer Dim k As Integer Dim Mx As Integer Dim N As Integer Dim No As Integer Dim xx(10) As Double No = 0 N = 3 Mx = 100 eps = 0.00001 For i = 0 To N - 1 Nx(i) = 0 Next For i = 0 To Mx - 1 No = No + 1 error = 0 For ii = 0 To N - 1 xx(ii) = Nx(ii) Next For j = 0 To N - 1 AA = Nb(j) For k = 0 To N - 1 ループ i ループ j ループ k If k <> j Then AA = AA - N(j, k) * xx(k) Next Nx(j) = AA / N(j, j) error = error + Abs(Nx(j) - xx(j)) Next If error < eps Then Exit For Next 配列変数このプログラムでは配列変 数を使用しています 配列変数の概念は一連のデータを保存しておく引き出しでその引き出しに番号がついているものと考えてください ( 右図 ) こ 3.14 0 1 2 3 X(0) X(1) X(2) X(3) の配列変数は同じ属性を持つデータを入れることを前提としています 今回用いる行列のデータはその趣旨に非常に合います たとえば行列の各成分を変数で表すときにこれまでのように一つ一つ宣言しているときりがありませんし 汎

用性のあるプログラムを作ることは不可能です というのも行列の大きさが 3 3 とは決まっていませんし どの様なサイズの行列を扱うか決まっていない場合も多々あります そのような場合にはプログラムが書けないことになります 2 で宣言されているのが配列です 例えば Dim X(10) s Double 配列の宣言はこれまで学んだ変数の宣言とほとんど同じです 異なる点は変数名に () が含まれていて その中に数字が書かれている点です この数字の意味は何個分のデータの箱を用意すればよいかということを意味します この場合ですと 10 個の箱つまり X(0)~X(9) まで用意されます 配列はどのプログラム言語でも利用される非常に重要な事柄です これなくしてプログラムは書けないことになります これの利点は同じ性質を持つデータをひとまとめにして扱うことができるだけでなく 配列のインデックス ( 括弧内の数字 ) を変数としてあつかうことができる点です 例えば下のような命令です For i = 0 To N - 1 Mx(i) = 0 Next このプログラムは繰り返しの命令ですが 繰り返し変数はi です この繰り返し変数は 0 から N-1 間で変化します この繰り返し変数が配列のインデックスとして指定されています 例えば N=3 とすると次のように実行されます i 実行 0 Mx(0)=0 1 Mx(1)=0 2 Mx(2)=0 3 回くらいの繰り返しなら 直接書いてもたいしたことはありませんが 100 回 1 000 回となると直接書くことは現実的ではありません 配列の有効性が発揮されます 配列は 1 次元だけでなく 多次元配列も用いることができます 多次元配列の定義は次の通りです Dim X(10,10) s Double これは 2 次元配列の例です 2 次元配列はこれこそ表のような表し方 X(0,0) X(0,1) X(0,2) X(0,3) X(0,4) X(0,5) X(1,0) X(1,1) X(1,2) X(1,3) X(1,4) X(1,5) X(2,0) X(2,1) X(2,2) X(2,3) X(2,4) X(2,5) X(3,0) X(3,1) X(3,2) X(3,3) X(3,4) X(3,5) です 配列のインデックスは 2 つあり 右図のようなイメージを持ってください これはまさに行列そのものです 行列の成分を示すときにインデックスでそのまま指

定することができます 2 次元配列だけでなく 3 次元 4 次元と次元を増やすことが可能です ただし 次元数 ( 最大 60 次元 ) が増えると急速に必要なメモリの量も増えます 2 サブプロシージャの呼び出しヤコビ法の部分は次のように呼び出されています Cll YACOBIByRef(M(),Mb(),Mx()) この命令で Cll というのがサブプロシージャの呼び出しを行っています YACOBIByRef はプロシージャの作成で指定した名前です 一方で呼び出されるプロシージャの先頭行は次のようになっています Public Sub YACOBIByRef(N() As Double, Nb() As Double, Nx() As Double) 括弧の中は数値の受け渡しを行っています それぞれの色に対応した部分がプロシージャ間で受け渡されます Cll YACOBIByRef(M(),Mb(),Mx()) サブプロシージャ内では与えられた係数を用いてヤコビ法の計算を行います ここでは前回勉強した繰り返しが多用されています 特に ループ i ループ j ループ k は多重ループになっています For i = 0 To Mx - 1 For j = 0 To N - 1 For k = 0 To N - 1 If k <> j Then AA = AA - N(j, k) * xx(k) Next Next Next