Решение системы неравенств с ограничением ортогональности в Python - PullRequest
2 голосов
/ 29 апреля 2019

Мне нужно решить систему неравенств для n переменных, где одно из неравенств имеет ограничение ортогональности.Неравенства заключаются в следующем.

В моей конкретной проблеме было доказано, что решение системы всегда приводит к одному точному решению.Из-за ортогональности я не думаю, что могу использовать линейное программирование.У кого-нибудь есть рекомендации по эффективным методам решения в Python?Wolfram alpha умеет это делать!(Вы можете увидеть пример здесь и здесь ) Я знаю, что sympy не может решить, потому что он может решить только для одномерного случая.Пожалуйста, включите время выполнения с любым ответом, который вы дадите!

Редактировать : Сразу после публикации я нашел z3.И он может делать что-то, что я хочу.Но я думаю, что это может быть излишним и не настолько эффективным, насколько это возможно (в расчете на линейное по n: = количество переменных для решения).

from z3 import Solver, Real
def solve_inequalities(z):
    n = len(z)
    s = Solver()
    ys = [Real(f'y{i}') for i in range(n)]
    s.add(sum(ys) == 0)
    for i in range(1, n):
        s.add(sum(ys[:i]) >= 0)
    s.add(sum([(z[i]-ys[i])*ys[i] for i in range(n)]) == 0)
    for i in range(n-1):
        s.add(z[i]-ys[i] <= z[i+1]-ys[i+1])
    s.check()
    return s.model()

...