2016-10-28 59 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

功能不支持在這個時候假設。你需要明確地創建一個子類,如

class f(Function): 
    is_positive = True 
+0

哇,謝謝你的回答!那麼f類的一個對象是否能以任何方式用於常規函數呢?或者還有什麼我需要添加? – bramtayl

+0

它將以相同的方式工作。 'f = Function('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_baseforce=True選項。這迫使sympy執行功率簡化,而不考慮假設。像Function('f')定義

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