【问题标题】:SymPy with advanced rewrite and simplification具有高级重写和简化功能的 SymPy
【发布时间】:2021-03-17 21:14:04
【问题描述】:

例如,我想扩展以下关于 x、y 和 z1 的一阶差分的联立方程:

$$x^\alpha y^(1-\alpha) = z_1$$
$$x^\beta y^(1-\beta) = z_2$$

很明显

$$\alpha \hat{x} + (1-\alpha) \hat{y} = \hat{z_1}$$
$$\beta \hat{x} + (1-\beta) \hat{y} = 0$$

其中$\hat{variable}$表示变量的弹性,即$\frac{d varibale}{variable}$。 我们有:

$$\hat{x} = \frac{1-\beta}{\alpha - \beta} \hat{z_1}$$
$$\hat{y} = -\frac{\beta}{\alpha - \beta} \hat{z_1}$$

使用 SymPy 的 python 对应的代码是:

import sympy as sp
x,y,z1,z2,alpha,beta = sp.symbols('x,y,z_1,z_2,alpha,beta',positive=True)
eq1 = x**alpha*y**(1-alpha) - z1
eq2 = x**beta*y**(1-beta) - z2
hat_x,hat_y,hat_z1 = sp.symbols('\hat{x},\hat{y},\hat{z_1})
diff_eq1 = eq1.diff(x)*hat_x*x + eq1.diff(y)*hat_y*y + eq1.diff(z1)*hat_z1*z1
diff_eq2 = eq2.diff(x)*hat_x*x + eq2.diff(y)*hat_y*y + eq2.diff(z1)*hat_z1*z1
root = sp.solve([diff_eq1,diff_eq2],[hat_x,hat_y])

给出结果

如您所见,表达式是正确的,但没有进一步简化。原因是它没有利用 eq1 = 0 和 eq2 = 0。我的问题是,如何利用原始方程给出的信息进行进一步的简化?谢谢!!

顺便说一句,我怎样才能用范围声明变量?例如,我想声明 $\alpha \in (0,1)$ 并且 $1-\alpha$ 也将是正数并便于以下操作。

【问题讨论】:

    标签: python url-rewriting sympy simplification


    【解决方案1】:

    我的问题是,如何利用原方程给出的信息进一步简化?

    一般来说,联立方程的解在解中不会有方程的一侧。所以我只能在这个具体情况下回答你的问题。 root 是一个字典,我们将遍历所有值并将方程的 RHS 替换为 LHS。

    import sympy as sp
    x,y,z1,z2,alpha,beta = sp.symbols('x,y,z_1,z_2,alpha,beta',positive=True)
    eq1 = x**alpha*y**(1-alpha) - z1
    eq2 = x**beta*y**(1-beta) - z2
    hat_x,hat_y,hat_z1 = sp.symbols('\hat{x},\hat{y},\hat{z_1}')
    diff_eq1 = eq1.diff(x)*hat_x*x + eq1.diff(y)*hat_y*y + eq1.diff(z1)*hat_z1*z1
    diff_eq2 = eq2.diff(x)*hat_x*x + eq2.diff(y)*hat_y*y + eq2.diff(z1)*hat_z1*z1
    root = sp.solve([diff_eq1,diff_eq2],[hat_x,hat_y])
    
    for key, value in root.items():
        root[key] = value.subs({z1: x**alpha*y**(1-alpha), z2: x**beta*y**(1-beta)}).simplify()
    

    顺便说一句,我怎样才能用范围声明变量?例如,我想声明 $\alpha \in (0,1)$ 并且 $1-\alpha$ 也将是正数并便于以下操作。

    在 SymPy 中没有明确的方法可以做到这一点。有一些解决方法。请参阅此Stack Overflow 问题。

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      相关资源
      最近更新 更多