2016-05-01 3 views
1

私はnumpyを使ってPythonコードを書いています。私のコードでは、 "linalg.solve"を使用して、n個の変数のn個の方程式の線形システムを解きます。もちろん、ソリューションは正または負のいずれかになります。私は何をする必要があることはので、私は最初のxは配列ですNumpy:特定の条件の線形システム。否定的な答えはありません

x=np.linalg.solve(A,b) 

れるこの形での式の私の線形システムを解決するためのソフトウェアをしたい行うには、常にポジティブな溶液または0に少なくとも等しいを持つことです特定の順序(x1、x2、x3 ..... xn)のn個の変数、 Aは次元正方行列であり、bはn次元配列です。すべてのxがない-if

正であれば、すべての負のxは、私は(彼らは= 0になりたいでしょう方程式

-checkのシステム-solve

: は今、私はこれを行うには考えx2 = -2 ----> x2 = 0)

- 一般的なxn = 0で、n次元正方行列Aのn行とn列を取り除きたい別の正方行列A1)、bの中のn要素を除去してb1を得る。

最後ビルド-at A1とB1

-Re-反復は、それまでは、すべてのXが正またはゼロ

マトリックスと再びシステム-solve

私はあげるたn個の要素の最終的な配列最後の反復解とゼロに等しいすべての変数(私はそれが必要なので順序が必要なので繰り返しはx2 = 0 ----- xfinal = [x1、0、x3、 .....、xn]

これはうまくいくと思いますが、Pythonでそれを行う方法はわかりません。

私は明確だったと思っています。本当にそれを理解することはできません!

答えて

3

あなたは、私がx = [ 0.27272727, 0., 1.90909091]を取得するあなたの方法でscipyのダウンロード

import numpy as np 
from scipy.optimize import minimize 

A = np.array([[1., 2., 3.],[4., 5., 6.],[7., 8., 10.]], order='C') 
b = np.array([6., 12., 21.]) 
n = len(b) 

# Ax = b --> x = [1., -2., 3.] 

fun = lambda x: np.linalg.norm(np.dot(A,x)-b) 
# xo = np.linalg.solve(A,b) 
# sol = minimize(fun, xo, method='SLSQP', constraints={'type': 'ineq', 'fun': lambda x: x}) 
sol = minimize(fun, np.zeros(n), method='L-BFGS-B', bounds=[(0.,None) for x in xrange(n)]) 

x = sol['x'] # [2.79149722e-01, 1.02818379e-15, 1.88222298e+00] 

から最適化モジュールを使用することができ、すなわち

min ||Ax - b|| 
s.t. x_i >= 0 for all i in [0, n-1] 

を最小化問題を持っています。あなたはまだあなたのアルゴリズムを使用したい場合には

が、それは以下の

n = len(b) 
x = np.linalg.solve(A,b) 
pos = np.where(x>=0.)[0] 

while len(pos) < n: 
    Ap = A[pos][:,pos] 
    bp = b[pos] 
    xp = np.linalg.solve(Ap, bp) 
    x = np.zeros(len(b)) 
    x[pos] = xp 
    pos = np.where(x>=0.)[0] 

あるしかし、私は、あなたが最小化オプションを使用する必要があり、あなたがそれを使用することをお勧めしません。

+0

提案したように最小化オプションを無効にしてください。私の計算時間が大幅に増えたのは普通ですか? 100要素配列(変数の場合)は1秒前に40秒必要です。 1000要素の配列では想像できません! – nearchos

+0

あなたは何を比較していますか?最小化とあなたのアルゴリズム?しかし、それはあなたがあなたの行列とベクトルにある数にもよるが、40秒は100 x 100行列のためにたくさんあるようだ。私のコンピュータでは、あまり時間がかかりませんでした。それは1秒未満でした。最小化がコード内で常に行われていることは確かですか? – sebacastroh

+0

今はちょうど1秒かかりました。なぜそれが40秒前にかかったのか分からない。ちなみに、1000x1000であれば、もっと多くのことが必要だと思います。私の場合、SLSQPは最良の方法ですか?あなたは私に説明することができますか(簡単な方法、可能であれば、それらのものについて何も知らない)なぜですか? – nearchos

関連する問題