我需要部分推导出我的方程并从衍生物中形成一个矩阵 . 我的等式是:
虽然必须满足这个条件:
为此,我使用了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)
我的结果:
My problem
我遇到的问题是产品的偏导数(T_aa_0,T_aa_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 回答
所以我已经设法自己解决了我的问题 . 主要问题是如何用另一个函数象征性地导出函数或方程 . 当我慢慢地再次通过交流文档时,我看到了一些细节,我以前错过了 . 为了使用函数派生函数,您需要更改函数的设置,这将用于派生 . 例如:
或者就我而言,代码如下:
再次感谢所有花时间阅读本文的人 . 我希望这对任何人都有帮助,他们会像我一样遇到同样的问题 .