FC2ブログ

初心者によるMATLABメモ

3次元形状やってんのになぜかMATLABを使わされることになった人のメモ。

<<非線形方程式を解く2 (fsolve) | ホーム | 連立方程式(線形)の解法>>

 

検索エンジンから来た方は読みたい記事が表示されていない可能性があります。
その場合、左メニューのフォームでブログ内を検索すると見たい記事を見れると思います。
もしくは、カテゴリー名をクリックしていただくと各カテゴリーの記事のリストが見れます。

[Optimization Toolbox] 非線形方程式を解く(fsolve)

Optimization Toolboxのfsolveを用いて,非線形方程式を解く方法です。
ちなみに当然ながら、この方法は、Optimization Toolboxを購入している方のみしかできません。
(持ってない人はfsolveほど強力ではないですがこちらのニュートン・ラプソン法を参照してください。)

まずは使い方。Optimization Toolboxのだいたいの関数がこの使い方なので,Optimization Toolboxを使っているうちに自然に使えるようになると思います。
x = fsolve(@fun,x0) … 初期値x0を用いて関数fun()で定義された非線形方程式を解き、解xを得る。
x = fsolve(@fun,x0,options) … 初期値x0を用い、オプションを構造体optionsで指定して関数fun()で定義された非線形方程式を解を解き、解xを得る。
x = fsolve(@fun,x0,options,fun()に渡すほかの引数...)
[x,fval,exitflag,output,jacobian] = fsolve(...)

このfsolveは解に収束したかどうかはメッセージが出るし、よく出来ているので説明は省略させてもらって実際に例題を解いてみます。

ここでは、下記の非線形方程式を解いてみます。


右辺がすべてゼロになるように整理すると,左辺を下記のような列行列であるとみなせます。
これを関数funcs()として定義します。


function F = funcs(x) 
    F = zeros(numel(x),1);
    F(1) = x(1)^2+x(2)^2-4;
    F(2) = x(1)*x(2)-x(3);
    F(3) = x(1)*x(3)-1;
    F = F(:);

これを適当に初期値をすべて1として与えて,実行して見た例が下記です。
xが解。fvalは解xを与えたときのfuncs()の値でほぼ0に近くなっています。
exitflagについてはここに書いてある。表を参考にしてください。この場合はexitflag=1になっており,関数が解 xに収束したことがわかります。
続いてoutputは,解を求める際の反復処理に関する情報を持つ構造体です。これについてもexitflag同様ここを参照してください。
最後にjacobianには,解xのときのfuncs()のヤコビ行列です。
ここでは,5つの出力をすべて取得していますが,別にx=fsolve()として解xだけ取得しても構いません。
>> [x,fval,exitflag,output,jacobian] = fsolve(@funcs, ones(3,1)) 
Optimization terminated: first-order optimality is less than options.TolFun.
x =
    0.7331
    1.8608
    1.3641

fval =
  1.0e-009 *
    0.6531
   -0.1214
   -0.0406

exitflag =
     1

output = 
       iterations: 4
        funcCount: 20
        algorithm: 'trust-region dogleg'
    firstorderopt: 2.3414e-009
          message: 'Optimization terminated: first-order optimality is less than options.TolFun.'

jacobian =
    1.4662    3.7216         0
    1.8608    0.7331   -1.0000
    1.3641         0    0.7331

ちなみに、fsolve()のデフォルトのオプションは下記になっています。
これについてはすいませんが,あまりに長くなるのでここでは説明はしません。知りたい人は,こちらを参照してください。
>> optimset('fsolve')
ans = 
                   Display: 'final'
               MaxFunEvals: '100*numberofvariables'
                   MaxIter: 400
                    TolFun: 1.0000e-006
                      TolX: 1.0000e-006
               FunValCheck: 'off'
                 OutputFcn: []
                  PlotFcns: []
           ActiveConstrTol: []
            BranchStrategy: []
           DerivativeCheck: 'off'
               Diagnostics: 'off'
             DiffMaxChange: 0.1000
             DiffMinChange: 1.0000e-008
         GoalsExactAchieve: []
                GradConstr: []
                   GradObj: []
                   Hessian: []
                  HessMult: []
               HessPattern: []
                HessUpdate: []
           InitialHessType: []
         InitialHessMatrix: []
                  Jacobian: 'off'
                 JacobMult: []
              JacobPattern: 'sparse(ones(jrows,jcols))'
                LargeScale: 'off'
        LevenbergMarquardt: []
            LineSearchType: 'quadcubic'
                  MaxNodes: []
                MaxPCGIter: 'max(1,floor(numberofvariables/2))'
                MaxRLPIter: []
                MaxSQPIter: []
                   MaxTime: []
             MeritFunction: []
                 MinAbsMax: []
       NodeDisplayInterval: []
        NodeSearchStrategy: []
          NonlEqnAlgorithm: 'dogleg'
        NoStopIfFlatInfeas: []
      PhaseOneTotalScaling: []
            Preconditioner: []
          PrecondBandWidth: 0
            RelLineSrchBnd: []
    RelLineSrchBndDuration: []
          ShowStatusWindow: []
                   Simplex: []
                    TolCon: []
                    TolPCG: 0.1000
                 TolRLPFun: []
               TolXInteger: []
                  TypicalX: 'ones(numberofvariables,1)'

ちなみに,ちょっとまだまだ長くなりそうなので,オプションを変更して非線形方程式を解く方法は,次のエントリに続きたいと思います。
あと、オプションを弄るoptimsetとかの説明も機会があれば書きたいところです。

参考:Optimization Toolbox User's Guide - fsolve
参考:Optimization Toolbox User's Guide - 最適化オプション
参考:初心者によるMATLABメモ| 非線形方程式を解く2 (fsolve)
参考:初心者によるMATLABメモ| 非線形方程式を解く(ニュートン・ラプソン法)
スポンサーサイト



このエントリに付けられたタグ|MATLABOptimizationToolbox方程式非線形方程式fsolve

コメント

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2011/01/11(火) 17:59:57 |
  2. |
  3. #
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sach1o.blog80.fc2.com/tb.php/70-87e64be8
この記事にトラックバックする(FC2ブログユーザー)