Search code examples
pythonfunctionexpressionsympysymbolic-math

Algorithm to invert strings of algebraic expressions in Python


Is there an easy way to make a function to inverse an algorithm for example like this:

>>> value = inverse("y = 2*x+3")
>>> print(value)
"x = (y-3)/2"

If you can't make actual code for the function, please recommend me tools that would make this task easier. The function would be only used to inverse algorithms with +, -, * and /


Solution

  • You should try SymPy for doing that:

    from sympy import solve
    from sympy.abc import x, y
    
    e = 2*x+3-y
    
    solve(e,x)
    #[y/2 - 3/2]
    solve(e,y)
    #[2*x + 3]
    

    Based on this, you can build your inverse() like (works for two variables):

    def inverse(string, left_string=None):
        from sympy import solve, Symbol, sympify
        string = '-' + string
        e = sympify(string.replace('=','+'))
        if left_string:
            ans = left_string + ' = ' + str(solve(e, sympify(left_string))[0])
        else:
            left = sympify(string.split('=')[0].strip().replace('-',''))
            symbols = e.free_symbols
            symbols.remove( left )
            right = list(symbols)[0]
            ans = str(right) + ' = ' + str(solve(e, right)[0])
        return ans
    

    Examples:

    inverse(' x = 4*y/2')
    #'y = x/2'
    
    inverse(' y = 100/x + x**2')
    #'x = -y/(3*(sqrt(-y**3/27 + 2500) + 50)**(1/3)) - (sqrt(-y**3/27 + 2500) + 50)**(1/3)'
    
    inverse("screeny = (isox+isoy)*29/2.0344827586206895", "isoy")
    #'isoy = -isox + 0.0701545778834721*screeny'