2016-10-01 9 views
1

Ax = bを解く方法を理解していますが、bがxに依存する場合はどうなりますか?画像E3 = function(E4)を参照してください。私はこれが繰り返し行われていると思います..このような問題は何ですか?それを解決するためにどのような方法を使用しますか?Ax = bで、xに依存x

私は、次のシステム解決しようとしています

set of equations

次の行列を導く:

matrix

以下の式のセットを与える

system sketch

更新: としては、いくつかのより多くの情報要請:

A = ([ 
[-1, 0, 0, 0, 0], 
[1, -1, -1, 0, 0], 
[0, 1, 0, -1, 0], 
[0, 0, 1, 1, -1], 
[0, 0, 1, 0, 0] 
]) 

b = [-10, 0, 1, 1, 3] 

print(np.linalg.solve(A, b)) 

-> [ 10. 7. 3. 6. 8.] 

この作品を、しかし、どのような場合:

b = [-10, 0, 1, 1, some_function(x[3])] 

だから、E3 = some_function(E4)、これE3は、によって定義され、E4に依存'some_function'(非線形)

+1

は(矢印は、フロー図に何を意味するのですか?* * Fで何を?)。いくつかの入力例を数値配列の形で与えることができますか?私には線形システム( 'Ax = b')のようには見えません。私は質問を更新 –

+0

@ali_mは、それはそれは私がそれを推測 – Gilbert

+0

明確な線形システムではないので、それは何と呼ばれます願っています。私は解決策を得ようとしていないのですが、問題の種類を理解しようとしています – Gilbert

答えて

3

ええ、これを非線形最適化で解くことができます。 scipy.optimizeはすべてのジューシーな詳細を持っていますが、ここでsome_function(x)を想定してシステムを解く例ですx ** 2さ:すべての最適化技術は、最小化を基本的に機能している

import numpy as np 
import scipy.optimize as opt 

A = np.array([ 
    [-1, 0, 0, 0, 0], 
    [1, -1, -1, 0, 0], 
    [0, 1, 0, -1, 0], 
    [0, 0, 1, 1, -1], 
    [0, 0, 1, 0, 0.0] 
    ]) 
b = np.array([-10, 0, 1, 1, 3.0]) # last value is fake 

def objectiveFunction(x): 
    bNew = b.copy() 
    bNew[-1] = x[3] ** 2 # "some_function = lambda x: x**2" 
    error = np.dot(A, x) - bNew 
    return np.dot(error, error) 

solution = opt.minimize(objectiveFunction, np.zeros((5))) 

print(solution) 

。入力ベクトルは、最小のスカラーを生成するように、あなたはにオプティマイザ

  1. (1つのベクトル入力引数を取り、スカラー数を返すと)を最小にする機能と
  2. 初期推定を与える

オプティマイザは、最小出力を生成する関数への入力をに返します。上記

objectiveFunction関数が最小化され、それはx候補溶液、どこbxに依存する形を有しているA . x - b間にエラーを返します。

ローカルミニマムで捕まえることができるので、最適化手法を使用することは少し黒い芸術です。しかし、この場合には、非常に簡単そうです:上記のコードは次のように出力します:

 fun: 1.3591186209050682e-11 
hess_inv: array([[ 0.49698215, 0.08279412, 0.40828859, 0.08067816, 0.47743665], 
     [ 0.08279412, 0.39205925, -0.22445874, -0.02791535, -0.26595691], 
     [ 0.40828859, -0.22445874, 1.01438679, 0.18492456, 1.19990433], 
     [ 0.08067816, -0.02791535, 0.18492456, 0.05283296, 0.23785942], 
     [ 0.47743665, -0.26595691, 1.19990433, 0.23785942, 1.94819504]]) 
     jac: array([ -5.37158676e-06, 4.82585577e-06, 7.97108114e-06, 
     -6.31780565e-06, 4.76041890e-07]) 
    message: 'Optimization terminated successfully.' 
    nfev: 105 
     nit: 13 
    njev: 15 
    status: 0 
    success: True 
     x: array([ 10.00000068, 3.54138098, 6.45862309, 2.54138196, 8.00000528]) 

情報がたくさんあるが、重要なビットはxfun値である:xがベクトルであるとfunがスカラーであるかに注意してください。これは、objectiveFunction(solution.x) == solution.funを意味します。これはつまり、答えがbであることを意味します(私の仮定したsome_function)はsolution.xであり、solution.fun(エラーはA . xbの間の誤差)はゼロに近いため、これが正しいと確信することができます。

私は説明の束をスキップしていますが、必要な場合、私は手の込んだことができます。

+0

Ahmed Fasihに感謝します。したがって、これは基本的に線形システムに対するイテレータですか? – Gilbert

+1

@Gilbert申し訳ありませんが、私は誤解しています:はい、ソフトウェア用語と数学用語の両方で「イテレータ」ですが、リニアライズされたシステムに向かって繰り返すとは考えにくいです。これは、平均二乗誤差関数の(ローカル)最小値を反復しています。それは理にかなっていますか? –

+0

ありがとう@Ahmed – Gilbert

2

b(x)が非線形関数の一部である場合、左辺にはA*xがありません。最も簡単な表現方法は、A*x - b(x)=0、つまりF(x) = 0の一般非線形方程式です。でも、これを解決しようとする前に、厄介な結果のいくつかの点に注意してください。一般的には

  • は、あなたがソリューションの分布については何も言うことはできません。 1つはありますか?より詳細な分析をしなくても、言うことはできません。おそらく、いくつか、または無限に多くのものがありますか?線形方程式系(A*x = b)では、すべての情報が行列に入っていますが、非線形方程式はありません。非線形ソルバーがソリューションランドスケープの構造についての仮定を作ることができないので

  • 、何のソルバーが収束することが保証されません。実際、すべての非難解ソルバは局所的なものに過ぎません。つまり、ソルバは解に「近い」最初の推測を提供し、ソルバはその推測に向かって収束します。コンバージェンスを保証するには、開始する前にソリューションの良いアイデアが必要です。実際には、多くの人がランダムな推測を行い、ローカルソルバーに指をかざして何度もやります。

  • は間違いなく、最も人気のある地元のソルバーはニュートン法です。二次収束を達成する唯一のソルバーです(既にソリューションに近い場合)。各ステップで、ヤコビ行列を使った線形方程式系を解く必要があります。すなわち、J*d = -F(x)です。あなたがそれを慎重にしなければ、それだけではかなり高価になる可能性があります。

これですべてを知っているので、scipy optimizeで遊ぶことができます。あなたの質問から欠落している多くの情報があります

+0

私のおかげでニコ!これは私を正しい方向に向ける – Gilbert

関連する問題