乘法导数函数的集成

时间:2017-12-18 01:54:45

标签: python integration derivative

这是我的代码。它是一个函数,用于评估某个x值的另一个函数的导数。我希望它返回一个有效的输出,即使对于分数阶导数(a)。

from scipy.special import gamma
import scipy.integrate as integrate
import sympy as sp
import scipy as sc
import math

def f(z):
    return z**2

def fracdiff(f,x,a):
    if a==0:
        return f(x)
    else:
        if math.ceil(a)-a==0:
            q=sp.diff(f(z),z,a)
            h=q.subs(z,x)
            return h
        else:  
            n=math.ceil(a)   
            g1=(1/(gamma(n-a)))         
            q1=sp.diff(f(z),z,n)
            print(q1) # showing that q1 equals 2*z
            h1= lambda z:(x-z)**(n-a-1)*2*z # for z^2 the derivative is 2*z
            ans=sc.integrate.quad(h1,0,x)
            r=ans[0]*g1
            return r


ss=fracdiff(f,1,0.5)

我的问题是我要整合h1,这是(x-z)**(n-a-1)q1(the derivative of f(z))的乘法。如果我让f(z)=z^2并为2*z手动输入q1,那么它可以正常工作,但如果我尝试使用q1,则表示“无法将表达式转换为浮动”。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为你正在将SymPy与SciPy混为一谈。 SymPy只进行符号计算。 SciPy只进行数值计算。如果你想在SymPy中计算一些中间结果,然后使用if进行数值计算,你将不得不使用lambdifyread more here)函数,这就像SymPy的lambda函数一样,它给出了数值结果。在下面的代码中,我使用lambdify函数两次将SymPy派生计算转换为lambda函数,这些函数提供了SciPy期望的数值结果。

import sympy as sp
import scipy as sc
import math
from scipy.special import gamma

def f(z):
    return z**2

def fracdiff(f,x,a):
    if a==0:
        return f(x)
    else:
        if isinstance(a,int):
            z = sp.Symbol('z')
            q = sp.diff( f(z), z, a ) 
            qf = sp.lambdify( z, q ) #Lambdify used here 1
            h = qf(x) 
            return h
        else:
            n = math.ceil(a)
            g1 = (1/(gamma(n-a)))         
            z = sp.Symbol('z')
            q1 = sp.diff( f(z), z, n )
            q1f = sp.lambdify( z, q1 ) #Lambdify used here 2
            h1 = lambda p: q1f(p)*(x-p)**(n-a-1)
            ans = sc.integrate.quad(h1,0,x)
            r = ans[0]*g1
            return r

ss=fracdiff(f,1,0.5) # returns 1.5045055561272689