5

sympy には多くの記号式があり、係数の 1 つがゼロであることに気付くかもしれません。おそらく私は mathematica に慣れているので、次のことは理にかなっていると思います。

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

驚くべきことに、返されるのは ですx + y。すべての方程式で明示的に "subs" を呼び出す以外に、f単に を返す方法はありyますか?

4

3 に答える 3

8

subsこれを行う唯一の方法だと思います。sympy 式はそれ自体が何かのようです。それを構成する部分を参照するものではありません。それはf式 のみを持っていますが、それが python オブジェクトとx+yへのリンクを持っていることを知りません。以下のコードを検討してください。xy

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限り、あなたがやりたいことを成し遂げる唯一の方法です。

于 2012-03-05T01:43:46.230 に答える
7

それを自動的に行う方法はないと思います(または、少なくともSymPyを変更せずに行う方法はありません)。

SymPy の FAQからの次の質問は、その理由を説明しています。

ある変数を変更しても、それに依存する別の変数が変更されないのはなぜですか?

簡単に言えば、「依存しないから」です。:-) 方程式を扱っていても、まだ 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 オブジェクトを参照する変数を出力するときに出力される文字列は、作成時に渡された文字列であることを覚えておくと役立ちます。その文字列は、割り当てる変数と同じである必要はありません。

>>> r, t, d = symbols('rate time short_life')
>>> d = r*t; d
rate*time
>>> r=80; t=2; d    # we haven't changed d, only r and t
rate*time
>>> d=r*t; d        # now d is using the current values of r and t
160
于 2012-03-05T01:45:01.500 に答える
2

たぶん、これはあなたが探しているものではないかもしれません (すでに他の人によって説明されているため) が、これは一度に複数の値を置き換える私の解決策です。

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

しかし、これでモジュールを作ろうとしないでください。うまくいきません。これは、式、変数、および関数が同じファイルに定義されている場合にのみ機能するため、すべてが関数に対してグローバルであり、それらにアクセスできます。

于 2014-11-08T23:26:12.640 に答える