Решение многомерного уравнения для подмножества переменных - PullRequest
0 голосов
/ 02 января 2019

Я использую sympy для решения некоторых уравнений и столкнулся с проблемой.У меня есть эта проблема со многими уравнениями, но я проиллюстрирую на примере.У меня есть уравнение с несколькими переменными, и я хочу решить это уравнение с точки зрения всех переменных, но одна исключена.Например, уравнение 0 = 2^n*(2-a) - b + 1.Здесь есть три переменные a, b и n.Я хочу получить значения для a и b не в терминах n, поэтому a и b могут не содержать n.

2^n*(2-a) - b + 1 = 0

# Since we don't want to solve in terms of n we know that (2 - a)
# has to be zero and -b + 1 has to be zero.

2 - a = 0
a = 2

-b + 1 = 0
b = 1

.сделай это.Может быть, я просто не смотрю на нужную документацию, но я не нашел способа сделать это.Когда я использую решить и проинструктировать его для поиска символов a и b sympy возвращает мне одно решение, где a определяется в терминах n и b.Я предполагаю, что это означает, что я могу свободно выбирать b и n, однако я не хочу фиксировать n в конкретном значении, которое я хочу, чтобы n оставалось переменной.

Код:

import sympy

n = sympy.var("n", integer = True)
a = sympy.var("a")
b = sympy.var("b")
f = 2**n*(2-a) - b + 1

solutions = sympy.solve(f, [a,b], dict = True)
# this will return: "[{a: 2**(-n)*(2**(n + 1) - b + 1)}]". 
# A single solution where b and n are free variables.
# However this means I have to choose an n I don't want
# to that I want it to hold for any n.

Я действительно надеюсь, что кто-то может мне помочь.Я искал в Google в течение нескольких часов ...

1 Ответ

0 голосов
/ 06 января 2019

Хорошо, вот что я придумала.Похоже, это решает тип уравнений, которые вы ищете.Я также предоставил несколько тестов.Конечно, этот код является грубым и может быть легко вызван сбоем, поэтому я бы взял его скорее как отправную точку, чем как полное решение

import sympy
n = sympy.Symbol('n')
a = sympy.Symbol('a')
b = sympy.Symbol('b')
c = sympy.Symbol('c')
d = sympy.Symbol('d')
e = sympy.Symbol('e')
f = sympy.sympify(2**n*(2-a) - b + 1)
g = sympy.sympify(2**n*(2-a) -2**(n-1)*(c+5) - b + 1)
h = sympy.sympify(2**n*(2-a) -2**(n-1)*(e-1) +(c-3)*9**n - b + 1)
i = sympy.sympify(2**n*(2-a) -2**(n-1)*(e+4) +(c-3)*9**n - b + 1 + (d+2)*9**(n+2))

def rewrite(expr):
        if expr.is_Add:
            return sympy.Add(*[rewrite(f) for f in expr.args])
        if expr.is_Mul:
            return sympy.Mul(*[rewrite(f) for f in expr.args])
        if expr.is_Pow:
            if expr.args[0].is_Number:
                if expr.args[1].is_Symbol:
                    return expr
                elif expr.args[1].is_Add: 
                    base = expr.args[0]
                    power = sympy.solve(expr.args[1])
                    sym = expr.args[1].free_symbols.pop()
                    return sympy.Mul(sympy.Pow(base,-power[0]), sympy.Pow(base,sym))
                else:
                    return expr

            else:
                return expr
        else:
            return expr




def my_solve(expr):

    if not expr.is_Add:
        return None

    consts_list = []
    equations_list = []
    for arg in expr.args:
        if not sympy.Symbol('n') in arg.free_symbols:
            consts_list.append(arg)
        elif arg.is_Mul:
            coeff_list = []
            for nested_arg in arg.args:
                if not sympy.Symbol('n') in nested_arg.free_symbols:
                    coeff_list.append(nested_arg)
            equations_list.append(sympy.Mul(*coeff_list))

    equations_list.append(sympy.Add(*consts_list))
    results = {}
    for eq in equations_list:
        var_name = eq.free_symbols.pop()
        val = sympy.solve(eq)[0]
        results[var_name] = val



    return results




print(my_solve(rewrite(f)))
print(my_solve(rewrite(g)))
print(my_solve(rewrite(h)))
print(my_solve(rewrite(i)))
...