乘法微分函数的积分
Integration of Multiplied Derivative functions
这是我的代码。它是一个函数,用于计算另一个函数在某个 x 值处的导数。我希望它 return 即使对于分数阶导数 (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
并为 q1
手动输入 2*z
它工作正常但如果我尝试使用 q1
它说 "can't convert expression to float"。有什么想法吗?
我认为您混淆了 SymPy 和 SciPy。 SymPy 只进行符号计算。 SciPy 只做数值计算。如果你想在 SymPy 中计算一些中间结果,然后使用 if 进行数值计算,你将不得不使用 lambdify
(read 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
这是我的代码。它是一个函数,用于计算另一个函数在某个 x 值处的导数。我希望它 return 即使对于分数阶导数 (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
并为 q1
手动输入 2*z
它工作正常但如果我尝试使用 q1
它说 "can't convert expression to float"。有什么想法吗?
我认为您混淆了 SymPy 和 SciPy。 SymPy 只进行符号计算。 SciPy 只做数值计算。如果你想在 SymPy 中计算一些中间结果,然后使用 if 进行数值计算,你将不得不使用 lambdify
(read 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