プログラミング設計演習 II - 講義ノート (第 01 回) MATLAB とは 1 MATLAB とは高度な数値計算, 視覚化, プログラミングを扱うことが可能な科学技術計算用の言語の一 つで名前は “matrix laboratory” に由来している. 以下のような特徴を持つ: • インタプリタ言語 (コンパイルは不要でプログラムソースを 1 行ずつ実行していく. 一般的にイン タプリタ言語は低速と言われているが, MATLAB の数値演算に関してはその限りでない. ただし, 制御文 (for, while 文等) の多用は著しい計算速度の低下を招く.) • 行列演算を利用する問題 (線形代数, 多変量解析, 信号処理など) に有効である. • グラフィックス機能が豊富でさまざまなグラフを容易に描画可能である. GUI 構築の機能も充実し ている. MATLAB の起動と終了 2 現在, CSE には MATLAB-R14-SP3 がインストールされている. 端末から > matlab とすると, MATLAB のウィンドウが現れる. MATLAB の作業に慣れてくると, MATLAB ウィンドウ を開かずに, 端末上で直接作業するのが便利となる. その場合は > matlab -nodesktop とすればよい. MATLAB を終了するには >> quit もしくは >> exit とする. 基本操作 3 3.1 スクリプトの基本的な書き方 MATLAB におけるスクリプトの実行法は以下の 2 通りがある: • コマンドウィンドウもしくは端末に直接キーインして実行する. • スクリプト M ファイル (スクリプトを格納したファイルの呼び名) にスクリプトを書き込み実行 する. 簡単な操作は前者の方法を, サイズの大きなスクリプトや再利用する可能性のあるスクリプトは後者の 方法を用いるとよい. スクリプト M ファイルは Emacs などの通常のエディタで作成可能であるが, 拡張 子を「.m」とする必要がある. MATLAB 付属のエディタを使う場合は, メニューから “New Script” というボタンを押す.プログラミング課題で作成するスクリプト M ファイルは, 指定されたディレクト リに指定されたファイル名で保存するように注意すること. スクリプトの基本は C 言語と類似したスタイルで, 構文規則は C 言語よりもシンプルである. 以下 の例に従って実際にスクリプトを作成し MATLAB の基本構成について確認せよ. • 1 つのコマンドは改行, コンマ「,」, セミコロン「;」で終了とみなされる. コンマやセミコロンを 使って複数のコマンドを 1 行に書くことも可能である. 問題 1: 「x = 5」, 「y = 3」, 「z = x + y」の 3 つのコマンドを, 改行, コンマ, セミコロン で区切って実行しその結果を比較せよ. • 上の例のように, MATLAB では変数の宣言は不要である. また, 一般的な数式の通りにスクリプ トを書けば解が得られるため, 直感的にも理解しやすい. 変数名には, アルファベット, 数字, 下線 「 」を使うことができ, 大文字, 小文字は区別される. さらに, 組み込み関数 (後述) や定数 (後述) と同じ名前を変数名として使用できない. 問題 2: 以下の 2 次方程式: 2x2 + 7x − 12 = 0 を解の公式を利用して解き, 解を表示するスクリプトを作成せよ. 作成したスクリプトは第 1 回演 習ディレクトリ以下に p02.m という名前で保存せよ. (ヒント)MATLAB で利用可能な基本的な演算子には以下のようなものがある: 加算 減算 乗算 除算 べき乗 円周率 無限大 非数 コメント + * / ^ pi Inf NaN % また, 以下のような算術関数も使うことができる: 平方根 対数 指数 正弦 余弦 正接 sqrt log exp sin cos tan • MATLAB でも C 言語同様, 条件式を用いた繰り返しや分岐が可能である. ◦ for 文 for 数値列 実行文 (複数でも可) end; 数値列の例としては以下のようなものがある: – i i – i i = = = = 1, 2, 3, ..., 100 とする場合: 1:100 0, 2, 4, ..., 200 とする場合: 0:2:200 ◦ while 文 while 繰り返し継続条件式 実行文 (複数でも可) end; 条件式のための関係演算子には以下のようなものがある: – x と y が等しい x == y – x と y が等しくない x ~= y – x は y 未満 x < y – x は y 以上 x >= y また, 条件式を組み合わせるための論理演算子には以下のようなものがある: – 条件式 p の否定 ~p – 条件式 p と q の論理積 p & q – 条件式 p と q の論理和 p | q – 条件式 p と q の排他的論理和 p xor q ◦ if 文 if 条件式 実行文 (複数でも可) end; ◦ switch 文 switch 数値もしくは文字列を返す数式または関数 case 数値もしくは文字列その 1 % 複数の値の場合は {1, 2, 3}などとする % 実行文その 1(複数でも可) case 数値もしくは文字列その 2 実行文その 2(複数でも可) ... otherwise % どの case 文にも一致しないときに実行 実行文その n(複数でも可) end; 以上の繰り返し, 分岐処理は C 言語と同様にネスト (入れ子構造化) することも可能である. また, ループの途中で処理から抜けたい場合には break を加えることで繰り返しを打ち切ることができ る (ネストされている場合は break によって当該ループのすぐ外に処理が移る). 問題 3: 下に示すような数列をいくつかの繰り返しや分岐の処理を用いて表示するスクリプトを作 成せよ. 1 1 2 3 5 8 13 ... 表示形式は上と異なっても良い. ただし, この数列の最後の要素は 1000 を超える最初の素数とす る. ある値 (変数) が素数であるかどうかを判定する関数は既に用意されている (isprime). 作成 したスクリプトは第 1 回演習ディレクトリ以下に p03.m という名前で保存せよ. これらの分岐や繰り返し処理は, 乱用すると計算速度の低下を招くため, 後述するベクトル, 行列 を利用した方が効率的なことが多いので留意せよ. なお, 本講義ノートではすべての MATLAB コマンドを網羅的に説明することはしない. 利用した い関数を探すには, Web で検索したり, 以下のコマンドを活用するとよい: >> help 関数名 % 関数の説明文を表示 >> lookfor キーワード % キーワードから関数名を検索 4 ベクトルと行列 MATLAB の基本的なデータ構造として, ベクトルと行列がある. うまく活用することによって, 非常に 効率的, 高速に計算を実行することが可能となる. 以下の例に従い, 実際にスクリプトを実行せよ. • ベクトルの生成 ベクトルも行列も, 変数と同様に宣言なしで利用できる. [ ] (例) 行 (横) ベクトル x = 1 2 3 4 5 を生成する方法は以下の通りである: >> x = [1 2 3 4 5]; >> x = [1, 2, 3, 4, 5]; >> x = 1:5; 同じ成分を持つ縦ベクトルを生成する方法は以下の通りである: >> x = [1; 2; 3; 4; 5] >> x = [1 2 3 4 5]’; >> x = [1:5]’; ここで「’」は行列やベクトルの転置を行う演算子である. • ベクトル要素のアクセス ベクトルの各要素へのアクセスは () を用いる. (例) 上のベクトルの第 2 要素の値を変数 b に代入するコマンドは以下の通りである: >> b = x(2); (例) 上のベクトルの第 4 要素の値に 10 を代入するコマンドは以下の通りである: >> x(4) = 10; [ ] 問題 4: 初項 1, 項差 0.35 の数列を要素とするベクトル a = a1 a2 · · · an を生成せよ. ただし, an = 4.5 とする. 作成したスクリプトは第 1 回演習ディレクトリ以下に p04.m という名 前で保存せよ. • 行列の生成 行列はベクトルの生成と同様に生成できる. 1 2 3 (例) 行列 A = 4 5 6 を生成する方法は以下の通りである: 7 8 9 >> A = [1 2 3; 4 5 6; 7 8 9]; >> A = [1 2 3 4 5 6 7 8 9]; また, 事前に任意の数のベクトルを用意し, それらを組み合わせて行列やベクトルを生成すること もできる. • 行列の各行, 各列, 各要素へのアクセス 行列の各行や各列は以下の例のようにコロン「:」を使うことでアクセスできる. (例) 上の行列の 2 列目をベクトル c へ代入する: >> c = A(:, 2); (例) 上の行列の 3 行目をベクトル d へ代入する: >> d = A(3, :); 行列の各要素へのアクセスもベクトルと同様に () を用いて行う: (例) 上の行列の (1, 3) 要素を変数 e へ代入する: >> e = A(1, 3); 問題 5: 以下のコマンドによりどのような行列が生成されるかを確認し, 各コマンドがどのような 操作をしているかを説明せよ. >> >> >> >> >> 5 x = 5:10; y = 50:10:100; Z = [x; y]; Z(2, 3) = 75; Z(3, 4) = 70; 組み込み関数 MATLAB で利用可能な関数 (組み込み関数) は多岐にわたる. 5.1 ベクトルや行列を生成するための組み込み関数 ここでは, スクリプト生成に有用ないくつかのベクトルや行列を生成する関数を紹介する. 何通りかの引 数で実際に実行して結果を確認すること. 一つの関数に対して引数の設定法が複数存在することも多い. 設定法が分からないような場合は help を利用して調べること. zeros ones eye 成分がすべて 0 の行列を生成する 成分がすべて 1 の行列を生成する 単位行列を生成する その他, 良く利用されるベクトルや行列を生成する関数としては以下のようなものがある: rand randn diag linspace logspace 一様乱数を要素とする行列生成 正規乱数を要素とする行列生成 対角行列の生成 線形等間隔なベクトル作成 対数的に等間隔なベクトル作成 これらは, 引数の指定により別の出力を返すこともある. 詳細は help を参照のこと. 5.2 ベクトルや行列の要素に対して計算処理を行う関数 ごく基本的な関数を以下に示す: sum length mean det prod dot size inv ベクトル成分の和を求める ベクトルの長さを求める ベクトル成分の平均値を求める 行列式の値を求める ベクトル成分の積を求める ベクトルの内積を求める 行列のサイズ (行, 列の数) を求める 逆行列を求める 問題 6: sum, prod, length, dot, mean, size といった関数は行列に対しても適用できる. 適当な行列 に対してこれら 6 つの関数を適用した結果を確認し, どのような処理が行われているかを確認せよ. また, 以下の関数は, スカラー, ベクトル, 行列のいずれにも適用できる. それぞれの機能をそれぞれ の形式のデータに対して関数を実行してみること. abs, sqrt, round, rem, exp, log 5.3 行列・ベクトル演算 行列・ベクトル同士の加算, 減算, 乗算は, これまでと同様に + - * の演算子を利用することができる. また, 行列のべき乗は (^) 演算子を用い, 行列のスカラー倍も演算子 (*) を使って計算できる . 9 10 12 5 6 3 問題 7: 行列 A = 11 3 10 , B = 1 4 4 の加算, 乗算, および A の 3 乗を計算せよ. 8 6 7 10 5 2 また, 乗算の結果が正しいかどうか、手計算の結果と比較せよ. 5.4 行列やベクトルの成分ごとの演算 一般的な線形代数ではあまり用いられないが, プログラム上の利便性のため, MATLAB では行列の成分 同士の乗算と除算およびべき乗が演算子 「.*」 「./」 「.^ 」で定義されている. 問題 8: 問題 7 の行列 A と B を用いて, 「A.*B」および「A.^3」を計算し, 「A*B」および「A^3」の 結果と比較せよ. 前節で導入した論理演算子や関係演算子は, スカラーのみでなく, ベクトルや行列の成分ごとに演算 することも可能である . 3 0 2 1 1 0 問題 9: 行列 A = 0 1 4 B = 0 0 3 に対して, 0 8 1 4 0 5 A & B を実行し, 結果を確認せよ. ∼B A >= B 5.5 行列, ベクトル成分の取り出しおよび加工 ベクトルや行列の任意の成分を取り出す時はその番号を指定する. C 言語とは異なりインデックスが (0 からではなく)1 から始まることに注意せよ. (例) 次のコマンドを実行すると X がどのような値になるかを確認せよ. >> A = [2 4 6 8 10]; >> X = A(1); >> B = [1 2 3; 4 5 6; 7 8 9; 10 11 12]; >> X = B(3,2); 行列から指定した行や列を取り出すにはコロン「:」を用いて次のように指定する. (例) 上の行列 B において >> b2 = B(:, 2); とコマンドを実行したとき, ベクトル b2 がどのようになるかを確認せよ. さらに, 不連続な複数の行や列を取り出す場合, 行や列の番号を成分とするベクトルを用いることがで きる. (例) 上の行列 B から 2 行目と 4 行目を取り出したい場合は >> x = [2 4]; >> b24 = B(x, :); とコマンドを実行したとき, ベクトル b24 がどのようになるかを確認せよ. これらを組み合わせて応用することで, 行列やベクトルのさまざまな加工を行うことができる. (例) 以下のコマンドは行や列の追加や削除を行うものである: >> >> >> >> A = [4 5 6; 7 8 9; 1 2 3]; b = [10 11 12]; C = [A;b] C([2 4], :) = []; 行列からベクトルへの変換やその逆も容易に行うことができる. (例) 以下のコマンドは行列の列をつないでベクトルを作る例である: >> A = [4 5 6; 7 8 9; 1 2 3]; >> y = A(:); なお, 同じ処理が以下のコマンドでも可能である: >> y = reshape(A, 9, 1); (例) 以下のコマンドはベクトルから行列を作る例である: >> x = 2:2:18; >> Z = reshape(x, 3, 3); (例) 以下のコマンドは列を逆順にする例である: >> A = [1 2 3; 4 5 6; 7 8 9]; >> D = A(:, 3:-1:1); 5.6 高度な行列の加工, 生成法 小さな行列を組み合わせたり, 行列のインデックスとして行列を指定したりすることで, より大きな行列 を容易に作ることができる. (例 1) 以下は小さな行列を組み合わせて大きな行列を作成する例である: >> >> >> >> A B C X = = = = zeros(2); round(rand(2).*10); zeros(2, 4); [A B eye(2); C eye(2)]; (例 2) 以下は行列のインデックスとして行列を指定することにより大きな行列を作成する例である: >> >> >> >> A X Y B = = = = [1 2 3; 4 5 6]; [1 1 1; 2 2 2] [1 1; 2 2; 3 3]; A(X, Y); 行列を加工する組込み関数も複数存在する. 以下に, 行列加工を行う一般的な関数を示す. 一つの関数に 対して引数の設定法が複数存在することも多い. 設定法が分からないような場合は help を利用して調べ ること. rot90 diag fliplr flipud tril triu 行列を 90 度回転 行列の対角要素からなるベクトルを生成 行列を列方向に逆転 行列を行方向に逆転 下三角行列を生成 上三角行列を生成 2 4 8 を行方向, 列方向に各 50 個並べた行列を表示させるまでの操作 問題 10(選択): 行列 A = 6 10 12 について, (1) 繰り返し文を用いた方法, (2) 行列のインデックスとして行列を指定する方法, の 2 種類 で生成し, 生成にかかる時間を比較せよ. 時間の計測は主要な処理部分を tic と toc で挟むことによ り計測できる. 経過時間は自動的に出力される. 作成した 2 つのスクリプトは第 1 回演習ディレクトリ 以下に, それぞれ, p10 1.m p10 2.m という名前で保存せよ. 問題 10 はやや難解であるのでヒントを与える. 問題 10 は大きな行列を作成する際に行列あるいはベ クトルをインデックスとして指定する方法に関するものであった. 行列をインデックスとして指定する のは理解しにくいので, 以下では, ベクトルをインデックスとして指定する場合を考察しよう. まず, 基本となる行列を 1 2 A= 3 4 5 6 の 3 行 2 列の行列としよう. MATLAB コマンドでは, >> A = [1 2; 3 4; 5 6]; として作成される. 続いて, 行列 A の要素が繰り返して現れるような大きな行列 B をつくることを考え よう. このようなことを実現する際に, v1, v2 を縦ベクトルとすると, B = A(v1, v2) という書式を使うことができる. 例えば, v1 = [ 1 2 3 1 1 2 2 ]⊤ とすると, これは A の各行を以下の順番で縦方向に並べることを意味する: A の 1 行目 A の 2 行目 A の 3 行目 A の 1 行目 A の 1 行目 A の 2 行目 A の 2 行目. 続いて, v2 = [ 1 2 1 1 2 ]⊤ であったとしよう. これは, A の各列を以下の順番で横方向に並べることを意味する: A の 1 列目 A の 2 列目 A の 1 列目 A の 1 列目 A の 2 列目 MATLAB コマンドで >> A = [1 2; 3 4; 5 6]; >> B = A([1 2 3 1 1 2 2]’, [1 2 1 1 2]’); とした場合, B= 1 3 5 1 1 3 3 2 4 6 2 2 4 4 1 3 5 1 1 3 3 1 3 5 1 1 3 3 2 4 6 2 2 4 4 となる. 以上の考え方を用いると, 行列 A が縦方向, 横方向それぞれに 5 個並んだ行列は >> A = [1 2; 3 4; 5 6]; >> B = A([1 2 3 1 2 3 1 2 3 1 2 3 1 2 3]’, [1 2 1 2 1 2 1 2 1 2]’); として作成することができるのが理解できるだろう. なお, このように規則性がある場合には, インデッ クスにベクトルを与えるよりも行列を与えた方が理解しやすいこともある. 以下のコマンドは上記のも のと同等である: >> A = [1 2; 3 4; 5 6]; >> B = A([1 2 3; 1 2 3; 1 2 3; 1 2 3; 1 2 3]’, [1 2; 1 2; 1 2; 1 2; 1 2]’); このコマンドでは, 第 1 インデックスに 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 1 2 1 2 1 2 を与え, 第 2 インデックスに [ 1 2 ] を与えていることになる. すなわち, 行列作成時のインデックスとして行列を指定することは, その行列 を 1 列目, 2 列目, 3 列目, ... の順に要素を並べたベクトルを指定することと同じである. 以上のヒントを踏まえれば, 行列 2 A= 6 10 4 8 12 を縦方向, 横方向に 50 個ずつ並べた行列を表示させるには, [ 1 1 1 ··· 1 1 1 2 2 2 ··· , 2 2 2 3 3 3 ··· ··· ··· ] , という行列を作成してインデックスとして与えればよいことがわかるだろう. MATLAB における計算時間の高速化には, 既に述べた通り, 数値を行列やベクトルで表現する, 行列 やベクトルに関する組み込み関数を活用する, インデックスとして行列を使うなど行列の生成法を工夫 する方法がある. これらに加え, データ等を格納するための行列やベクトルのサイズが予め決まっている 場合には, そのサイズの行列 (ベクトル) を (zeros や ones を用いて) 予め生成してから格納した方が, 格 納データが増えるたびに行列のサイズを大きくしてから格納する方法よりも一般的に処理スピードが速 くなる. 文字列の取り扱い 6 文字列も, ベクトルまたは行列として扱われる. 以下の例に従い, 実際にスクリプトを実行せよ. 6.1 文字列の生成 一連の文字列は, 以下のようにシングルクォーテーション「’」で囲むことで生成でき, 行ベクトルとし て取り扱われる. >> C = ’Hello World!’; 問題 11: 上の行列 C の行数, 列数を確認せよ. 複数の文字列は, 行列の形で格納できる. >> C = [’Hello World!’;’Hello NiTech’]; 実は上の方法では, 文字列長が違う場合には行列に格納できないという問題がある (エラーが表示さ れる). 長さの違う文字列を行列に格納する場合, 以下の組み込み関数を用いることで自動的に長さを揃 えることができる. >> D = char(’C java Latex Word Excel’, ’MATLAB’); % char は関数なので、文字列の区切り はコンマであることに注意 以下のように複数の文字列を格納した行列を組み合わせることも可能である: >> C = char(’Hello World!’, ’Hello NiTech’); >> E = char(C, D); 6.2 文字列の取り出しと比較, 加工 文字列は, 行列の要素を取り出す要領で取り出せる. ただし, 文字列によっては長さを揃えるためのス ペースが追加されているため, これを取り除く関数 deblank が用意されている. 問題 12: 上の行列 E から 4 行目の文字列を取り出し, スペースを取り除く前後でその長さを比較せよ. 文字列の比較には, 以下の比較演算子および組み込み関数が利用できる. 文字列 X = ’Spam mail’ と Y=’Space age’ について, 下の例にあるような操作を行い, 結果を確認しておくこと. == 関係演算子 (例) Z = (X == Y) strcmp 文字列全体が等しいかを判定 (例) strcmp(X, Y) strncmp 文字列の最初の n 文字までが等しいかどうかを判定 (例) strncom(X, Y, 2) 上の二つの関数の最後に’i’ を追加すると, 大, 小文字を区別せずに判定する関数となる. 文字列の比較は, その文字を指定する ASCII コードを比べることによって行われている. 文字列を ASCII コードに変換するには, 関数 double(文字列を格納しているベクトル or 行列) を用いる. また, ASCII コード表現を文字列に戻すため, 関数 char(ASCII コードを格納しているベクトル or 行列) が利 用できる. 6.3 その他の文字列処理 その他, プログラミングにおいて有用となりそうないくつかの関数について紹介する. 関数の詳細は help を参照のこと. • isletter 文字列中にある要素がアルファベットであるかどうか判定 • isspace 文字列中にある要素がスペースかどうか判定 • strrep 文字列中の, 指定した全文字列を置き換える (行ベクトルのみに適用可) (例) >> strrep(X, ’a’, ’A’) % ベクトル X 中の a をすべて A に置換 • int2str, num2str 行列中の数値を文字列に変換 問題 13(選択): m 行 n 列の任意の行列を文字列に変換し, 変換前後で関数 size を適用し, 行数, 列数を比較せよ. ただし, m > 1, n > 1 とする • str2num 文字列を数値に変換する. • findstr 文字列中から特定の文字 (列) を見つける (行ベクトルのみに適用可). (例) >> findstr(X, ’Ex’); % ベクトル X 中から’Ex’ の含まれるインデックスのセントを返す • eval MATLAB のコマンドを表現する文字列を引数とすると, 当該コマンドを実行できる. (例) >> X = char(’A = [1 2 3; 4 5 6]’); >> eval(X); 通常の方法で指定した行列を eval で実行可能な文字列に変換するため, mat2str という組込み関 数が用意されている. 7 関数の生成 MATLAB でも, C 言語同様に, 自分自身で関数 (Java ではメソッドと呼ぶ) を作成して利用することが できる. 関数の内容を格納したファイルのことを, スクリプト M ファイルに対して関数 (ファンクショ ン)M ファイルと呼ぶ. • 関数名は変数名と同様, アルファベット, 数字, 下線「 」より構成され, 変数名の最初は文字でな ければいけない. 特に組み込み関数として存在する関数名との重複を避けるため, 必ず大文字から 始まる関数名にすることを推奨する. また, ファイル名は関数名と同一のものとすべきである. • 関数 M ファイルの形式は以下のようになる. function 出力引数 = 関数名 (入力引数) % 入力引数, 出力引数の数はそれぞれ 0 個以上 H1 行 % 関数の簡単な説明 ヘルプテキスト行 % ヘルプの説明 関数の内容 H1 行 (2 行目) の部分に関数の簡単な説明を書いておくと, lookfor 関数で指定したキーワード検索 に引っかかるようになる. ヘルプテキスト行は, 文字通り help 関数によって表示される部分とな る. これらの部分は敢えて記述しなくても良い (記述したほうが後々便利であることも多々ある). 記述する場合はコメントとして記述すること. 問題 14(選択): 入力 n(n は任意の自然数) に対して, 以下のような出力を返す関数 MakeMatrix(n) を作成せよ. 入力: n = 1 ⇒ 出力: ans = 1 入力: n = 4 ⇒ 出力: ans = [1 2 3 4; 5 6 7 0; 8 9 0 0; 10 0 0 0] この関数において n = 9 の場合の結果を確認せよ. 作成した関数は第 1 回演習ディレクトリ以 下に MakeMatrix.m という名前で保存せよ. また, この関数を利用して問題を解くスクリプトを p14.m という名前で保存せよ. • エラーの処理 特定の条件下でエラーと見なして関数を終了するには, 組み込み関数 error, もしくは return が 利用できる. error は引数にメッセージを指定でき, メッセージ出力後に関数終了, return は単純 に関数を終了する. 問題 15: 数値列が格納された二組の変数 (例えば, X = [1 2 3 4], Y=[20 40 60 80] ) を入力として, これらの分散共分散行列を出力する関数 VarCovar(X, Y) を作成せよ. また, X と Y の要素数が異なる 場合には, 適当なエラーメッセージを出して関数を終了させるようにすること. 以下にソースの 1 行目 と最終行を示す. 残りの部分をコーディングせよ. (分散共分散行列を出す関数は, MATLAB 中に cov として既に用意されているが, これを使用してはならない.) 作成した関数は第 1 回演習ディレクトリ以 下に VarCovar.m という名前で保存せよ. また, この関数を利用して問題を解くスクリプトを p15.m と いう名前で保存せよ. function [VAR_COVAR] = VarCovar(X, Y) ... VAR_COVAR = [VAR_X COVAR; COVAR VAR_Y]; 問題 16(選択): 非線形方程式の解法の一つに Newton 法がある. Newton 法では関数の曲線をその接 線によって近似して解を求める. 以下の 1 次元非線形方程式: f (x) = x3 + 2x − 2 = 0 の解を求める関数: NewtonMethod(coeff, init) を作成せよ. 引数 coeff は方程式における各項の係 数を格納するベクトル, init を方程式の解の初期近似値とする. また, 計算の終了条件は |f (x(n) ) − f (x(n−1) )| < 0.0001 とする. ここで, x(n) は n 回目の繰り返しで得られた回の近似値とする. 関数の戻り値を解 x(n) とし, n が 100 を超えても終了条件を満たさなかった場合は何らかのエラーメッセージを出して関数を終了す るよう設定すること. 作成した関数は第 1 回演習ディレクトリ以下に NewtonMethod.m という名前で保 存せよ. また, この関数を利用して問題を解くスクリプトを p16.m という名前で保存せよ. (ヒント) ニュートン法の解説: ニュートン法を用いて非線形方程式 f (x) = 0 を解く問題を考えよう. ま た, 解の初期値を x0 とする. ニュートン法では f (x) とその導関数 f ′ (x) を用いて, 解を x0 → x1 → x2 → · · · と更新していく. ステップ t の解 xt から次のステップ t + 1 の解 xt+1 を求める規則は, xt+1 = xt − f (xt ) f ′ (xt ) と与えられる. なお, このような更新規則が導かれる理由は数値解析で学んだことなので復習しておくと よい.
© Copyright 2024 Paperzz