繁体   English   中英

具有高级重写和简化功能的 SymPy

[英]SymPy with advanced rewrite and simplification

例如,我想展开以下关于 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$ 也将是正数并促进以下操作。

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

一般来说,联立方程的解不会有方程的一侧在解中。 所以我只能在这个具体情况下回答你的问题。 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问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM