2015-04-28 43 views
2

我有一個相當複雜的功能H(x),我試圖解決的價值x,使H(x) = constant。我想用離散間隔生成的插值對象和H(間隔)的相應輸出來做到這一點,其中其他輸入保持不變。我表示插值對象f符號計算插值函數的輸入?

我的問題是插值對象的調用函數接受一個array_like,所以傳遞一個符號到f(x)來使用sage的求解器方法是不成問題的。任何想法如何解決這個問題?我有插補功能f。我想求解方程f(x) == sageconstant for X .

from scipy.interpolate import InterpolatedUnivariateSpline as IUspline 
    import numpy as np 

    #Generating my interpolation object 
    xint = srange(30,200,step=.1) 
    val = [H(i,1,.1,0,.2,.005,40) for i in srange(30,299,step=.1)] 
    f = IUspline(xint,val,k=4) 

    #This will yield a sage constant 
    eq_G(x) = freeB - x 

    #relation that I would like to solve 
    eq_m(x) = eq_G(39.9) == f(x) 
    m = solve(eq_m(x),x) 

上面的代碼(f(x)更具體)生成

"TypeError: Cannot cast array data from dtype('0') to dtype('float64') according to the rule 'safe'.

編輯:任何功能H(x)將導致同樣的錯誤,因此,它不不管什麼H(x)是。爲了簡單起見(當我說H很複雜時,我不是在開玩笑),請嘗試H(x) = x。然後該塊將顯示如下:

from scipy.interpolate import InterpolatedUnivariateSpline as IUspline 
    import numpy as np 

    #Generating my interpolation object 
    xint = srange(30,200,step=.1) 
    H(x) = x 
    val = [H(i) for i in srange(30,299,step=.1)] 
    f = IUspline(xint,val,k=4) 

    #This will yield a sage constant 
    eq_G(x) = freeB - x 

    #relation that I would like to solve 
    eq_m(x) = eq_G(39.9) == f(x) 
    m = solve(eq_m(x),x) 

回答

0

在使用numpy和scipy時,首選Python類型爲Sage類型。

而不是Sage Integers和Reals,使用Python ints和float。

也許你可以像這樣修復你的代碼。

from scipy.interpolate import InterpolatedUnivariateSpline as IUspline 
import numpy as np 

# Generate interpolation object 
xint = srange(30,200,step=.1) 
xint = [float(x) for x in xint] 
val = [float(H(i,1,.1,0,.2,.005,40)) for i in srange(30,299,step=.1)] 
f = IUspline(xint,val,k=4) 

# This will yield a Sage constant 
eq_G(x) = freeB - x 

# relation that I would like to solve 
eq_m(x) = eq_G(39.9) == f(x) 
m = solve(eq_m(x),x) 
+0

生成插值對象不是問題,因此將xint轉換爲python整數不會改變任何內容。真正的問題是插值對象只會接受類似array_like的對象,這使得不能將符號傳遞給'f'來用於求解關係中的'x' eq_m(x)= eq_G(39.9)== f (x)的' –