2016-10-28 2 views
2

Я хочу определить произвольную функцию f. Я знаю, что f всегда возвращает положительное число. Я хочу, чтобы sympy мог использовать эти знания при выполнении упрощений (особенно три правила питания, упомянутые в упрощенной документации). Есть ли способ сделать это? Я ищу что-то вроде ниже:sympy произвольный диапазон функций

f = Function("f", positive = True) 
g = Function("g", positive = True) 
x = symbols("x") 
y = symbols("y") 
n = symbols("n", real = True) 

test = (f(x) * g(y)) ** n 
# This should work but doesn't 
expand_power_base(test) 
+0

Я не понимаю ваш вопрос. Вам просто нужна функция, которая возвращает случайное положительное число? – AbrahamB

+0

Вопрос не ясен. –

+0

Я добавил код, который поможет уточнить. Дайте мне знать, если все еще неясно – bramtayl

ответ

0

Функция, определенная как Function('f') не поддерживают предположения в это время. Вам нужно будет создать подкласс явно, например

class f(Function): 
    is_positive = True 
+0

Ничего себе, спасибо за ответ! Будет ли объект класса f таким образом использоваться каким-либо образом, чтобы регулярная функция была бы? Или есть что-нибудь еще, что мне нужно добавить? – bramtayl

+0

Он будет работать таким же образом. 'f = Функция ('f')' (примерно) эквивалентна 'class f (Function): pass'. – asmeurer

0

Вот не так отличный способ идти о вещах:

alphabet = list(string.ascii_lowercase) 

def assert_positive(value, args): 
    result = value 
    for i in range(len(args)): 
     a_symbol = symbols(alphabet[i], positive = True) 
     result = result.subs(args[i], a_symbol) 

    result = simplify(result) 

    for i in range(len(args)): 
     a_symbol = symbols(alphabet[i], positive = True) 
     result = result.subs(a_symbol, args[i]) 

    return(result) 
0

Один из способов заключается в вызове expand_power_base с опцией force=True. Это вынуждает sympy выполнять упрощения мощности, независимо от допущений.

import sympy as sp 

f = sp.Function("f") 
g = sp.Function("g") 
x, y, n = sp.symbols("x, y, n") 

test = (f(x) * g(y)) ** n 
sp.expand_power_base(test, force=True) 

f(x)**n*g(y)**n

+0

Это не сработает для меня. Мои фактические выражения являются итеративными и очень сложными, и мне нужно иметь возможность использовать сразу все три правила. – bramtayl