Python中的部分符号派生词

时间:2016-05-10 11:04:57

标签: python python-2.7 python-3.x matrix sympy

我需要部分推导出我的方程并从衍生物中形成一个矩阵。我的等式是: enter image description here 虽然必须满足这些条件: enter image description here 为此,我使用了sympy模块及其diff()函数。到目前为止我的代码是:

from sympy import*
import numpy as np
init_printing() #delete if you dont have LaTeX installed

logt_r, logt_a, T, T_a, a_0, a_1, a_2, logS, Taa_0, Taa_1, Taa_2  = symbols('logt_r, logt_a, T, T_a, a_0, a_1, a_2, logS, Taa_0, Taa_1, Taa_2')

A = (logt_r - logt_a - (T - T_a) * (a_0 + a_1 * logS + a_2 * logS**2) )**2
parametri = [logt_a, a_0, Taa_0, a_1, Taa_1, a_2, Taa_2]

M = expand(A)
M = M.subs(T_a*a_0, Taa_0)
M = M.subs(T_a*a_1, Taa_1)
M = M.subs(T_a*a_2, Taa_2)

K = zeros(len(parametri), len(parametri))
O = []

def odv(par):
    for j in range(len(par)):
        for i in range(len(par)):
            P = diff(M, par[i])/2
            B = P.coeff(par[j])
            K[i,j] = B
    return K 

odv(parametri)

我的结果: enter image description here

我的问题

我遇到的问题是产品的偏导数(T_a a_0,T_a a_1和T_a * a_2),因为通过使用diff()函数,你无法推导出一个函数使用产品(显然),否则会出错:

ValueError: 
Can't calculate 1-th derivative wrt T_a*a_0.

为了解决这个问题,我用这些系数代替了这些产品,如:

M = M.subs(T_a*a_0, Taa_0)
M = M.subs(T_a*a_1, Taa_1)
M = M.subs(T_a*a_2, Taa_2)

但正如您在最终结果中所看到的,这只适用于某些情况。我想知道是否有更好的方法可以做到这一点,我不需要对产品进行替换,并且它可以在所有情况下使用。

其他信息

让我重新解释一下我的问题。是否有可能通过使用python象征性地推导出具有函数的方程式,或者就此而言,使用sympy模块?

1 个答案:

答案 0 :(得分:0)

所以我设法自己解决了我的问题。主要问题是如何用另一个函数象征性地推导出一个函数或方程。当我慢慢地再次通过交流文档时,我看到了一些我之前错过的细节。 为了使用函数派生函数,您需要更改函数的设置,这将用于派生。例如:

x, y, z = symbols('x, y, z')
A = x*y*z
B = x*y

# This is the detail:
type(B)._diff_wrt = True
diff(A, B)

或者就我而言,代码如下:

koef = [logt_a, a_0, T_a*a_0, a_1, T_a*a_1, a_2, T_a*a_2]
M = expand(A)
K = zeros(len(koef), len(koef))
def odvod_mat(par):
    for j in range(len(par)):
        for i in range(len(par)):
            type(par[i])._diff_wrt = True
            P = diff(M, par[i])/2
            B = P.coeff(par[j])
            K[i,j] = B

            #Removal of T_a
            K[i,j] = K[i,j].subs(T_a, 0)
    return K  
odvod_mat(koef)

再次感谢所有花时间阅读本文的人。我希望这对任何人都有帮助,他们会遇到和我一样的问题。