2016-02-17 10 views
5

Я создал функцию Matlab, и я хотел бы преобразовать ее в Python для использования с моим веб-приложением.От Matlab до Python - Решите функцию

Я преобразовал (.m файл в .py-файл) почти все, используя OMPC. Однако я не могу заставить функцию 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 строки, где x и y символы (с x = Symbol('x') и y = Symbol('y')):

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, я получив 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. Чтобы дать пример, взятый из here:

Если вы хотите, чтобы решить уравнения x+5y=2, -3x+6y=15 тогда вы могли бы сделать это следующим образом:

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

, который дает вам

{x: -3, y: 1} 

Обратите внимание, что эти уравнения пройдены таким образом, чтобы они оценивались до 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, судя по всему, что трудно решить), поэтому я просто проверял для более простой вариант, чтобы продемонстрировать принцип:

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

, который затем дает Вам ожидаемый результат:

[(-D12**2 + xa, -sqrt(D13) + yc), (-D12**2 + xa, sqrt(D13) + yc)] 

Надеемся, вам удастся на вашей машине решить эти сложные функции. Но этот пост объясняет, почему вы получаете False.

EDIT

С измененным кодом, вы можете получить решение, если вы уменьшаете точность ваших параметров D12 и D13. Вот решение, которое вы получаете затем:

[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?

Это модифицированный код; Обратите внимание, что я заставляю вывод, чтобы быть в форме словаря, а также распечатать уравнения (I округлить до двух знаков после запятой, но он также работает с 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

О, я вижу. Спасибо за это. Я только что увидел, что это было написано в первых строках части Solvers в документе Sympy doc :(Однако у меня все еще есть проблема, так как результатом является '[]', а не '{x: ..., y: ...} '. Любая идея? – Anthony

+0

Не могли бы вы отредактировать вопрос и добавить код, который дает вам' [] '?! Как написано, я не получил результата либо потому, что моя сессия Python убивается через пару минут, вы пытаетесь решать слишком сложные уравнения ...;) – Cleb

+0

Готово! :) Моя сессия не была убита, но для «решения» требуется 5 секунд. – Anthony

Смежные вопросы