Решение линейной системы с ограничениями неравенства в 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])