Симпи упрощают неравенства с квадратными кратными - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть неравенство, которое пронизано факторами, которые априори положительны для вещественных переменных.Было бы неплохо, если бы я мог проявить сочувствие, просто «разобраться с ними».

Например:

import sympy
x,y = sympy.symbols('x y')
sympy.simplify((x**2 + 1)*y > 0)
# (x**2+1)*y > 0 (sympy does nothing)

Теперь, кажется, довольно ясно, что (x**2+1)*y > 0 тогда y>0, так как(x**2+1) всегда положительно для реального x.Другими словами, некоторая разумная функция упрощения таких вещей могла бы дать:

simplify_positive_terms((x**2+1)*y > 0)
# y > 0 

Существует ли функция sympy, которая позволит упростить подобные вещи?

Примечание что вышеизложенное является лишь простым примером, и я, в общем-то, просто не хочу решать для y.

1 Ответ

0 голосов
/ 08 декабря 2018

Вот что я придумал:

import sympy

def simplify_inequality(e):
    ''' 
    Assume e is an instance of either one of the following:
    sympy.core.relational.StrictGreaterThan
    sympy.core.relational.GreaterThan
    sympy.core.relational.StrictLessThan
    sympy.core.relational.LessThan

    Also, assume that the e is an inequality of the form Mul(f,g..,z) > 0

    '''
    lefthand_side = e.args[0]
    righthand_side= e.args[1]
    if not isinstance(lefthand_side,sympy.mul.Mul):
        return e

    multiplicands = lefthand_side.args
    needed_factors = []
    for factor in multiplicands:
        if len(factor.free_symbols) != 1: # if it has more than one variable, don't try to simplify
            needed_factors.append(factor)

        else:
            result_set = sympy.solveset(factor,factor.free_symbols.pop(),sympy.S.Reals) # see if there are any solutions over the reals   
            if not result_set.is_EmptySet: # there are solutions, this factor is can't be simplified
                needed_factors.append(factor)
            else:    
                free_sym = factor.free_symbols.pop()
                if factor.subs(free_sym,0) > 0: # ok, this factor is always positive, it can go away
                    pass
                else: # we still need it
                    needed_factors.append(factor)

    new_lefthand_side = sympy.mul.Mul(*needed_factors)
    return e.func(*(new_lefthand_side,righthand_side))

Это должно работать с неравенствами того типа, который вы указали.Эта функция не упрощает факторы, которые априори отрицательны или являются многомерными.Но я думаю, что это разумная отправная точка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...