Python中的偏符号导数

2024-10-02 00:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要对方程进行部分求导,然后用导数形成一个矩阵。我的等式是: 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_aa_0,T_aa_1和T_a*a_2),因为通过使用diff()函数,你不能用乘积来派生函数,否则你会得到一个错误:

^{pr2}$

为了解决这个问题,我用系数取代了这个乘积,比如:

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模块来符号化地推导一个带有函数的方程?在


Tags: 模块函数importlendifflogs乘积subs
1条回答
网友
1楼 · 发布于 2024-10-02 00:35:58

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

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)

或者在我的例子中,代码看起来像:

^{pr2}$

再次感谢所有花时间阅读这篇文章的人。我希望这对任何人都有帮助,他们也会有同样的问题。在

相关问题 更多 >

    热门问题