使用 sympy 转换变量

Transforming variables with sympy

我有一个程序,我想在方程式中将一个变量转换为另一个变量。 这个想法是从用户那里获得输入,这是一个方程式,并将符号变量转换为另一个变量。 这里的例子:


from sympy import symbols, limit, diff
x_1, x_2, X_1, X_2 = symbols('x_1 x_2 X_1 X_2')
def afosm_nl_ls(x_1_mean, x_2_mean, x_1_std, x_2_std, g):
    x_1 = X_1*x_1_std + x_1_mean
    x_2 = X_2*x_2_std + x_2_mean

    g = g.subs((x_1, X_1), (x_2, X_2))
    print(g)


afosm_nl_ls(50, 30, 3, 2, x_1**2 + 1 - x_2)

给我这个输出:

x_1**2 - x_2 + 1

那么,我要让x_i转为X_i*x_i_std + x_i_mean。我没有这个功能就很容易做到,只用这个:

from sympy import limit, diff, symbols
x_1, x_2, X_1, X_2 = symbols('x_1 x_2 X_1 X_2')
x_1 = X_1*3 + 50
x_2 = X_2*2 + 30
g = x_1**2 + 1 - x_2
print(g)

结果是:

-2*X_2 + (3*X_1 + 50)**2 - 29

那么,我应该如何在函数中编写代码才能仍然从用户那里获得方程式并获得正确的变换?

您将 x_1x_2 重新定义为函数中的表达式,因此 subs 无法找到它们。而且您还输入了错误的输入 subs。输入应该是 subs(old, new)subs(list of (old, new)) —— 比较你所拥有的:

from sympy import symbols, limit, diff
x_1, x_2 = symbols('x_1 x_2')
def afosm_nl_ls(x_1_mean, x_2_mean, x_1_std, x_2_std, g):
    v1 = x_1*x_1_std + x_1_mean
    v2 = x_2*x_2_std + x_2_mean
    return g, g.subs([(x_1, v1), (x_2, v2)])

afosm_nl_ls(50, 30, 3, 2, x_1**2 + 1 - x_2)

这给出了

(x_1**2 - x_2 + 1, -2*x_2 + (3*x_1 + 50)**2 - 29)