Python 支持高级重写和简化

Python 支持高级重写和简化,python,url-rewriting,sympy,simplification,Python,Url Rewriting,Sympy,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 varible}{variable}$。 我们

例如,我想将以下联立方程展开为关于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 varible}{variable}$。 我们有:

使用Symphy的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。我的问题是,如何利用原始方程给出的信息进一步简化?谢谢

顺便说一句,如何声明具有范围的变量?例如,我想在(0,1)$中声明$\alpha\n,并且$1-\alpha$也将是正的,便于进行以下操作

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

通常,联立方程的解在解中不会有方程的一面。因此,我只能在这个具体案例中回答你的问题
root
是一个字典,我们将循环遍历所有值,并用LHS替换方程的RHS

将sympy作为sp导入
x、 y,z1,z2,alpha,beta=sp.symbols('x,y,z_1,z_2,alpha,beta',正=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}”)
微分方程eq1=eq1.diff(x)*hat_x*x+eq1.diff(y)*hat_y*y+eq1.diff(z1)*hat_z1*z1
微分方程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])
对于键,根.items()中的值:
root[key]=value.subs({z1:x**alpha*y**(1-alpha),z2:x**beta*y**(1-beta)})
顺便说一句,如何声明具有范围的变量?例如,我想在(0,1)$中声明$\alpha\n,并且$1-\alpha$也将是正的,便于进行以下操作

在Symphy中没有明确的方法可以做到这一点。有一些解决办法。看这个问题

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

通常,联立方程的解在解中不会有方程的一面。因此,我只能在这个具体案例中回答你的问题
root
是一个字典,我们将循环遍历所有值,并用LHS替换方程的RHS

将sympy作为sp导入
x、 y,z1,z2,alpha,beta=sp.symbols('x,y,z_1,z_2,alpha,beta',正=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}”)
微分方程eq1=eq1.diff(x)*hat_x*x+eq1.diff(y)*hat_y*y+eq1.diff(z1)*hat_z1*z1
微分方程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])
对于键,根.items()中的值:
root[key]=value.subs({z1:x**alpha*y**(1-alpha),z2:x**beta*y**(1-beta)})
顺便说一句,如何声明具有范围的变量?例如,我想在(0,1)$中声明$\alpha\n,并且$1-\alpha$也将是正的,便于进行以下操作

在Symphy中没有明确的方法可以做到这一点。有一些解决办法。看这个问题

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