首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sympy "global“替换

Sympy "global“替换
EN

Stack Overflow用户
提问于 2012-03-05 08:45:36
回答 3查看 3.4K关注 0票数 5

我有一些符号表达式,我可能会意识到其中一个系数是零。我会认为,也许是因为我习惯了mathematica,下面的内容是有意义的:

代码语言:javascript
运行
复制
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f

令人惊讶的是,返回的是x + y。除了在每个等式上显式调用“y”之外,有没有办法让f只返回subs

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-05 09:45:02

我不认为有一种方法可以自动完成(或者至少不需要修改SymPy)。

以下来自SymPy's FAQ的问题解释了其中的原因:

为什么改变一个变量不改变依赖于它的另一个变量?

简短的答案是“因为它不依赖于它。”:-)即使你在处理方程式,你仍然在处理对象。您键入的公式使用创建时出现的值来“填充”值,就像常规的python定义一样。它们不会被之后所做的更改所改变。考虑following:

a = >>> ( 'a‘)#为变量a创建一个名为'a’的对象以指向符号b=a+ 1;b#创建另一个引用‘a’表示a+1 >>> a=4的对象;a#a现在指向文字整数4,而不是符号(‘a’)4 >>> b#但b仍然指向符号(‘a’)a+1

更改量a不会更改b;您使用的不是一组联立方程。请记住,当您打印引用渐近对象的变量时打印的字符串是创建该对象时提供给它的字符串;该字符串不必与您为其赋值的变量相同:

r,t,d= 160 (‘rate time short_life') >>> d=r*t;d rate*time >>> r=80;t=2;d#我们没有更改d,只有r和t rate*time >>> d=r*t;d#现在d使用r和t的当前值

票数 7
EN

Stack Overflow用户

发布于 2012-03-05 09:43:46

我认为subs是实现这一目标的唯一方法。看起来,渐近表达式本身就是某种东西。它没有引用组成它的部分。也就是说,f只有表达式x+y,但不知道它有任何指向python对象xy的链接。考虑下面的代码:

代码语言:javascript
运行
复制
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

f1 = x + y
f2 = z + f1
f1 = f1.subs(x,0)
print(f1)
print(f2)

其输出结果为

代码语言:javascript
运行
复制
y
x + y + z

所以,尽管f1已经改变了,但f2并没有改变。据我所知,subs是完成你想做的事情的唯一方法。

票数 8
EN

Stack Overflow用户

发布于 2014-11-09 07:26:13

也许这不是您想要的(因为其他人已经解释过了),但这是我一次替换多个值的解决方案。

代码语言:javascript
运行
复制
def GlobalSubs(exprNames, varNames, values=[]):

    if ( len(values) == 0 ):                # Get the values from the
        for varName in varNames:            # variables when not defined
            values.append( eval(varName) )  # as argument.
        # End for.
    # End if.

    for exprName in exprNames:                        # Create a temp copy
        expr = eval(exprName)                         # of each expression
        for i in range(len(varNames)):                # and substitute
            expr = expr.subs(varNames[i], values[i])  # each variable.
        # End for.
        yield expr     # Return each expression.
    # End for.

它甚至对矩阵也有效!

代码语言:javascript
运行
复制
>>> x, y, h, k = symbols('x, y, h, k')
>>> A = Matrix([[ x, -h],
...             [ h,  x]])
>>> B = Matrix([[ y,  k],
...             [-k,  y]])
>>> x = 2; y = 4; h = 1; k = 3
>>> A, B = GlobalSubs(['A', 'B'], ['x', 'h', 'y', 'k'])
>>> A
Matrix([
[2, -1],
[1,  2]])
>>> B
Matrix([
[ 4, 3],
[-3, 4]])

但是不要试图用这个来做一个模块。恐怕行不通。只有当表达式、变量和函数被定义到同一个文件中时,这才会起作用,因此函数的所有内容都是全局的,并且它可以访问它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9560362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档