Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sympy“;“全球”;替代_Python_Symbolic Math_Sympy - Fatal编程技术网

Python Sympy“;“全球”;替代

Python Sympy“;“全球”;替代,python,symbolic-math,sympy,Python,Symbolic Math,Sympy,我有很多符号表达式,我可能会意识到其中一个系数是零。也许因为我习惯了mathematica,我会认为以下几点是有意义的: from sympy import Symbol x = Symbol('x') y = Symbol('y') f = x + y x = 0 f 令人惊讶的是,返回的是x+y。除了在每个等式上显式调用“subs”外,f是否有任何方法可以只返回y 我认为subs是唯一的方法。它看起来像是一个同情的表达本身。它没有提到组成它的部分。也就是说,f只有表达式x+y,但不知道它有

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

from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
f = x + y
x = 0
f

令人惊讶的是,返回的是
x+y
。除了在每个等式上显式调用“subs”外,
f
是否有任何方法可以只返回
y

我认为
subs
是唯一的方法。它看起来像是一个同情的表达本身。它没有提到组成它的部分。也就是说,
f
只有表达式
x+y
,但不知道它有任何指向python对象
x
y
的链接。考虑下面的代码:

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)
这个函数的输出是

y
x + y + z

因此,即使
f1
发生了变化
f2
也没有变化。据我所知,
subs
是完成您想要的任务的唯一方法。

我认为没有自动完成的方法(或者至少没有修改SymPy的方法)

以下问题解释了原因:

为什么改变一个变量不改变另一个取决于它的变量? 简短的回答是“因为它不依赖于它。”:-)尽管如此 您正在使用方程式,您仍然在使用Python 物体。您正在键入的方程式使用当前的值 创建“填充”值的时间,就像普通python一样 定义。它们不会因随后所做的更改而改变。考虑 以下是:

>>> a = Symbol('a') # create an object with name 'a' for variable a to point to
>>> b = a + 1; b    # create another object that refers to what 'a' refers to
a + 1
>>> a = 4; a        # a now points to the literal integer 4, not Symbol('a')
4
>>> b               # but b is still pointing at Symbol('a')
a + 1
更改数量
a
不会更改
b
;您不是在使用一个集合 联立方程组。记住 当打印引用sympy的变量时打印的字符串 对象是创建时提供给它的字符串;那个 字符串不必与分配给它的变量相同 致:


也许这不是您想要的(正如其他人已经解释过的),但这是我的解决方案,可以同时替换多个值

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.
它甚至适用于矩阵

>>> 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]])
但是不要试图用这个来制作一个模块。这行不通。只有当表达式、变量和函数被定义到同一个文件中时,这才有效,因此函数的所有内容都是全局的,它可以访问它们

>>> 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]])