簡體   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