2017-12-18 23 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を手放して2*zq1に手動で入力しても問題ありませんが、q1を使用しようとすると「式を浮動に変換できません」と表示されます。なぜどんなアイデア?

+0

あなたのコードにインポートステートメントを含めることもできますか?私は 'sp'はSymPy、' sc'はSciPy、 'gamma()'関数はどこからインポートしたのでしょうか? –

+0

申し訳ありませんがAmit、これは初めてstackoverflowを使用しています。私は事を明確にすることを望む。 –

答えて

0

私はあなたがSciPyとSymPyを混合していると思います。 SymPyはシンボリック計算のみを行います。 SciPyは数値計算のみを行います。 SymPyでいくつかの中間結果を計算し、数値計算のためにifを使用する場合は、数値結果を与えるSymPyのlambda関数のようなlambdifyread more here)関数を使用する必要があります。次のコードでは、関数を2回使用して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