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