Решение линейной системы с ограничениями неравенства в Python или Matlab

Я хочу решить линейную систему, которая довольно сложна, я беру в качестве примера следующие уравнения:

(1) x + y = 0;
(2) x * y = -4;
(3) x > 0;

Если только (1) и (2), существует два набора решений. Поэтому я добавляю (3), чтобы убрать неоднозначность.

Решение на любом языке программирования хорошо, лучше на Python или Matlab. Большое спасибо

------ ********* ---------

Уравнение (2) в моем примере не является линейным, это моя ошибка. Я решил свою оригинальную сложную задачу, которую можно сформулировать как Ax=b, где R(A)=R(b), решение уникально, нет необходимости добавлять неравенства для устранения неоднозначности. Некоторые неожиданные артефакты заставили меня подумать, что в линейной системе есть неоднозначность, на самом деле она не существует. Наконец, я добавляю больше ограничений в мою линейную систему и решаю ее с помощью np.linalg.lstsq(), после чего неожиданные артефакты исчезают.

Спасибо всем, ребята, вы мне очень помогли. Нелегко описать исходную проблему, извините за это.

3 ответа

Есть симпатия

>>> from sympy import *
>>> var('x y')
(x, y)
>>> solve([x+y,x*y+4])
[{x: -2, y: 2}, {x: 2, y: -2}]
>>> [(s[x],s[y]) for s in solve([x+y,x*y+4]) if s[x]>0]
[(2, -2)]

В своем нынешнем состоянии развития он не решает системы, связанные с неравенствами и несколькими переменными. Однако найти желаемое решение в словаре результатов очень просто.

В Matlab это можно решить с помощью Symbolic Toolbox как это:

syms x y 

eq1= x+y==0
eq2= x*y==-4
eq3= x>0

s=solve([eq1 eq2 eq3],[x,y])

x_sol=s.x
y_sol=s.y

Результат:

x_sol =  2
y_sol = -2

Это можно сделать с помощью scipy (python), если вы хотите числовое, а не символическое решение. Вместо третьего условия вам нужно будет указать отправную точку для устранения неоднозначности:

    from scipy.optimize import fsolve

    def func(x):
        return np.array([x[0]+x[1],x[0]*x[1]+4]])

    x = fsolve(func, x0=[2,0])
Другие вопросы по тегам