2017-12-18 21 views
1

다음은 제 코드입니다. 이 함수는 일부 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) 

내 문제는 내가 (x-z)**(n-a-1)q1(the derivative of f(z))의 곱셈이다 h1을 통합하려는 것입니다. 내가 f(z)=z^2을 허용하고 q1에 대해 2*z을 수동으로 입력하면 올바르게 작동하지만 q1을 사용하려고하면 "표현식을 부동 상태로 변환 할 수 없습니다"라는 메시지가 나타납니다. 어떤 아이디어?

+0

코드에 가져 오기 문을 포함시킬 수 있습니까? 나는'sp'가 SymPy이고'sc'가 SciPy이고'gamma()'함수를 어디에서 가져 왔는가? –

+0

죄송합니다 Amit,이 처음 stackoverflow 사용하고 있습니다. 나는 물건을 분명히하기를 바란다. –

답변

0

나는 SymPy를 SciPy와 혼합하고 있다고 생각합니다. SymPy는 기호식 계산 만 수행합니다. SciPy는 수치 계산 만 수행합니다. SymPy에서 중간 결과를 계산하고 숫자 계산을 위해 lambdify (read more here) 함수를 사용해야하는 경우 숫자 결과를 제공하는 SymPy의 lambda 함수와 같습니다. 다음 코드에서는함수를 두 번 사용하여 SymPy 미분 계산을 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