Python 多元函数的辛微分与点求值

Python 多元函数的辛微分与点求值,python,python-3.x,syntax-error,sympy,differentiation,Python,Python 3.x,Syntax Error,Sympy,Differentiation,我想用symphy求一个多变量函数的导数,然后a)要打印的符号结果,然后b)要打印的点的导数结果。我正在使用以下代码 import math as m import numpy import scipy #define constants lambdasq = 0.09 Ca = 3 qOsq = 2 def f1(a,b,NN,ktsq,x):

我想用symphy求一个多变量函数的导数,然后a)要打印的符号结果,然后b)要打印的点的导数结果。我正在使用以下代码

 import math as m
 import numpy
 import scipy

 #define constants                                                               
 lambdasq = 0.09
 Ca = 3
 qOsq = 2

 def  f1(a,b,NN,ktsq,x):
      return NN*x**(-a)*ktsq**b*m.exp(m.sqrt(16*Ca/9*m.log(1/x)*m.log((m.log(ktsq/lambdasq))/m.log(qOsq/lambdasq))))

from sympy import *
x = symbols('x')

def f2(NN,a,b,x,ktsq):
    return  -x*diff(m.log(f1),x)
这会运行,但我找不到一种方法来获得要打印的符号结果,当我尝试在某个点上求值时,例如添加
print(f2(0.3,0.1,-0.2,0.1,3))
我得到一个错误

  TypeError: must be real number, not function
当我用它的符号表示替换f1时,我得到的是错误

  ValueError: 
  Can't calculate 1st derivative wrt 0.100000000000000.
因此,我可以将我的问题总结如下

a) 如何在调用
diff(m.log(f1),x)
时打印符号导数及其值(即不必用实际表示替换
f1

b) 如果我必须在微分中使用符号表示(即使用
diff(m.log(NN*x**(-a)*ktsq**b*m.exp)(m.sqrt(16*Ca/9*m.log(1/x)*m.log((m.log)(ktsq\
/lambdasq))/m.log(qOsq/lambdasq(()(()())()())(x)
那么如何打印符号导数

Python的新功能,希望有一个相对简单的修复。
谢谢!

首先,
数学
函数是数值函数,它们不能与Symphy的符号一起使用。请使用Symphy(exp,log,sqrt)中相应的函数,您已经使用Symphy import*中的
导入了这些函数:

def f1(a, b, NN, ktsq, x):
    return NN*x**(-a)*ktsq**b*exp(sqrt(16*Ca/9*log(1/x)*log((log(ktsq/lambdasq))/log(qOsq/lambdasq))))
第二,在f2中,您试图区分
f1
。但是f1是一个可调用的Python函数,而不是一个symphy表达式。您需要传入一些参数以获得一个symphy表达式,然后可以区分它

def f2(NN, a, b, x0, ktsq):
    return (-x*diff(log(f1(a, b, NN, ktsq, x)), x)).subs(x, x0)
在这里,数值参数(值x0除外)被传递给f1,从而产生一个包含x的SymPy表达式。这是一个需要区分的东西。之后,数值x0被替换为x

打印(f2(0.3,0.1,-0.2,0.1,3))#0.366748952743614


一个要点是,SymPy区分表达式,而不是函数。SymPy中没有
f'
的概念,只有
f'(x)

我发布这个答案,因为在搜索“simpy Multivariable Differentication”时,这个线程在我的搜索引擎上是#1,可能会帮助某人

例1 输出

4*(u[0]**2 + u[1]**10 + u[2] - 4)*u[0]
这是f(u)wrt u[0]的导数


例2 如果我们想要整个雅可比矩阵,我们可以:

for i in range(3):
    print(sp.diff(f(u), u[i]))
哪个输出

4*(u[0]**2 + u[1]**10 + u[2] - 4)*u[0]
20*(u[0]**2 + u[1]**10 + u[2] - 4)*u[1]**9
2*u[0]**2 + 2*u[1]**10 + 2*u[2] - 8
我们可以定义一个临时函数并复制粘贴这些行

def temp(u):
    return np.array([
        4*(u[0]**2 + u[1]**10 + u[2] - 4)*u[0],
        20*(u[0]**2 + u[1]**10 + u[2] - 4)*u[1]**9,
        2*u[0]**2 + 2*u[1]**10 + 2*u[2] - 8,
    ])

temp([1., 1., 1.])
这将输出
数组([-4.,-20.,-2.])

并进行验证

from autograd import grad
gradient = grad(f)
gradient([1., 1., 1.])
这将输出:
[array(-4.)、array(-20.)、array(-2.)]

注:这只是一个简单的演示,你可以在Symphy中做多元导数。我希望我能在这方面帮助别人

from autograd import grad
gradient = grad(f)
gradient([1., 1., 1.])