2016-02-17 15 views
5

私はMatlab関数を作成しました。私はPythonに変換してWebアプリケーションで使用したいと思います。MatlabからPythonへ - Solve関数

OMPCを使用して、ほとんどすべてを.mファイルから.pyファイルに変換しました。 しかし、私はsolve()関数を動作させることができません(私はsympyライブラリを使用しています)。

これは、Matlabのラインです:

SBC = solve(sqrt((xa-x)^(2)+(ya-y)^(2))-sqrt((xb-x)^(2)+(yb-y)^(2))-D12==0,sqrt((xa-x)^(2)+(ya-y)^(2))-sqrt((xc-x)^(2)+(yc-y)^(2))-D13==0,[x,y]); 

そして、これは、Pythonのxyはシンボルです(x = Symbol('x')ではとy = Symbol('y'))ラインである:私は、このPythonコードで

sbc = solve(
      sqrt((xa - x) ** (2) + (ya - y) ** (2)) 
      - sqrt((xb - x) ** (2) + (yb - y) ** (2)) 
      - D12 == 0, 
      sqrt((xa - x) ** (2) + (ya - y) ** (2)) 
      - sqrt((xc - x) ** (2) + (yc - y) ** (2)) 
      - D13 == 0, 
      [x, y] 
     ) 

結果の代わりにFalseを得る(Matlabコードでうまくいく)。

何か不足していますか?

EDIT

そして、これで、私は[]を取得しています:

# -*- coding: utf-8 -*- 

from sympy import * 

def alg(xa=None, ya=None, za=None, Ta=None, xb=None, yb=None, zb=None, Tb=None, xc=None, yc=None, zc=None, Tc=None, xd=None, yd=None, zd=None, Td=None, RSSIA=None, RSSIB=None, RSSIC=None, RSSID=None, txPower=None, n=None): 
    n = 2 
    c = 3 * 10 ** 8 
    TOA12 = Ta - Tb 
    TOA13 = Ta - Tc 
    TOA14 = Ta - Td 

    D12 = TOA12 * c 
    D13 = TOA13 * c 
    D14 = TOA14 * c 
    x, y = symbols('x y') 

    eqs = [sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xb - x) ** (2) + (yb - y) ** (2)) - D12, 
    sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xc - x) ** (2) + (yc - y) ** (2)) - D13] 

    print solve(eqs, [x, y]) 

alg(3,1,0,21.8898790015,4,6,0,21.8898790005,10,4,0,21.88987900009,9,0.5,0,21.889879000105,23.9,23.85,23.9,23.95,24,1) 

答えて

5

それを動作させるために必要な唯一の小さな変更があります。 Falseを受け取るのは、関数定義で== 0を使用するためです。 sympyでは、あなたの関数が0と評価されることが一般的に仮定されています。あなたの方程式があること

{x: -3, y: 1} 

注意を与える

from sympy import * 
x, y = symbols('x y') 
solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y]) 

を:あなたは次のようにx+5y=2, -3x+6y=15は、あなたがそれを行うだろう方程式を解決したい場合は

hereから取った例を与えるために、彼らは0と評価される方法で合格しました。

あなたがそれを実行する場合は、

solve([x + 5*y - 2 == 0, -3*x + 6*y - 15 == 0], [x, y]) 

を行ったように、その後もFalseが返されます。

だからあなたたとえば、次のように動作します:残念ながら

from sympy import * 

x, y, xa, xb, xc, ya, yb, yc, D12, D13 = symbols('x y xa xb xc ya yb yc D12 D13') 

eqs = [sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xb - x) ** (2) + (yb - y) ** (2)) - D12, 
     sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xc - x) ** (2) + (yc - y) ** (2)) - D13] 

solve(eqs, [x, y]) 

、私のプライベートのコンピュータ上を通して実行されません(私のPythonがkilledを取得し、明らかにそれは解決しにくい)ので、私はちょうどそれをテスト

[(-D12**2 + xa, -sqrt(D13) + yc), (-D12**2 + xa, sqrt(D13) + yc)] 
:その後、あなたに期待される出力を与える

eqs2 = [sqrt(xa - x) - D12, 
     (yc - y) ** (2) - D13] 
solve(eqs2, [x, y]) 

:簡単なバージョンは、原理を実証するために

これらの複雑な機能を解決するには、マシンにもっと幸運があることを願っています。しかし、この投稿はFalseを受け取った理由を説明しています。変更したコードで

EDIT

あなたのパラメータD12D13の精度を低下させた場合、あなたは解決策を得ることができます。

[sqrt((-x + 3)**2 + (-y + 1)**2) - sqrt((-x + 4)**2 + (-y + 6)**2) - 0.3, sqrt((-x + 3)**2 + (-y + 1)**2) - sqrt((-x + 10)**2 + (-y + 4)**2) - 0.42] 
[{x: 6.45543078993649, y: 3.14390310591109}, {x: 6.67962865117349, y: 2.61399193301427}] 

これはMatlabシミュレーションと同じですか?ここ

が変更されたコードです。私は辞書の形であっても式を印刷するには、出力を強制することを注意してください(私は2つの小数に丸めるが、それはまた4で動作します。あなたはそれで遊ぶことができます):

from sympy import * 

def alg(xa=None, ya=None, za=None, Ta=None, xb=None, yb=None, zb=None, Tb=None, xc=None, yc=None, zc=None, Tc=None, xd=None, yd=None, zd=None, Td=None, RSSIA=None, RSSIB=None, RSSIC=None, RSSID=None, txPower=None, n=None): 
    n = 2 
    c = 3 * 10 ** 8 
    TOA12 = Ta - Tb 
    TOA13 = Ta - Tc 
    TOA14 = Ta - Td 

    D12 = round(TOA12 * c, 2) 
    D13 = round(TOA13 * c, 2) 
    # D14 = TOA14 * c 
    # x, y, D12, D13 = symbols('x y D12 D13') 
    x, y = symbols('x y') 

    eqs = [sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xb - x) ** (2) + (yb - y) ** (2)) - D12, 
    sqrt((xa - x) ** (2) + (ya - y) ** (2)) - sqrt((xc - x) ** (2) + (yc - y) ** (2)) - D13] 

    print eqs 

    print solve(eqs, x, y, dict=True) 

alg(3,1,0,21.8898790015,4,6,0,21.8898790005,10,4,0,21.88987900009,9,0.5,0,21.889879000105,23.9,23.85,23.9,23.95,24,1) 
+0

ああ、私は参照してください。ありがとうございました。私はちょうど結果は '[]'、代わりに '{...、Y ... X}であるので、私はまだ問題がある:(これはSympyドキュメントにソルバー部分の最初の行に書いたことを見。? '任意のアイデア – Anthony

+0

あなたが質問を編集して、あなたに私のPythonのセッションが数分後に殺されているため、' [] '?!書かれたように、私はどちらかの結果を取得していない与えコード追加することができ、あなたがしようとしあまりにも困難な方程式を解く...;) – Cleb

+0

完了! :)私のセッションは殺されなかったが、解決するのに5秒かかる。 – Anthony