2017-08-31 48 views
1

我正在尋找類似numpy.polyfit 我有一個固定點,看起來像一個度2多項式多項式擬合通過1點與力衍生要去= 0

我想要做的是一個曲線的東西:

  • 通過所述第一點去精確地(在下面的例子中(0.05 , 1.0)
  • 在第一點上有一個derivative =0

例如:

TabX

0,050 ; 0,055 ; 0,060 ; 0,065 ; 0,070 ; 0,075 ; 0,080 ; 0,085 ; 0,090 ; 0,095 ;  0,100 ; 0,110 ; 0,120 ; 0,130 ; 0,140 ; 0,150 ; 0,160 ; 0,170 ; 0,180 ; 0,190 ; 0,200 ; 0,210 ; 0,220 ; 0,230 ; 0,243 

TabY

1,000000000 ; 1,000446069 ; 1,000395689 ; 1,000359466 ; 1,000313867 ; 0,999937484 ; 0,999760969 ; 0,999811533 ; 0,999966352 ; 0,999767956 ; 1,000148567 ; 1,000634904 ; 1,000735849 ; 1,001199937 ; 1,001510678 ; 1,001722496 ; 1,001992602 ; 1,002487029 ; 1,003492247 ; 1,004006533 ; 1,004832845 ; 1,005730132 ; 1,006327527 ; 1,007109894 ; 1,008266254 

我已經找到了通過第一點去一個 「簡單而野蠻」 的解決方案:我補充了很多的重量到這一點,無論是重量功能,還是在TabX中增加大量的0.05以及TabY中的很多1.0和使用正常的np.polyfit函數。這是醜陋的,但它的工作。

但我真的不知道怎麼過的點(0.05;1.0)

derivative=0,在this thread據說拉格朗日乘數可以做的伎倆,但我不能夠使用由@編寫的功能海梅,我有凸起的錯誤LinAlgError, 'Singular matrix'

而且,我必須能夠在一個基本Abaqus啓動此腳本,該解決方案可以只使用基本的python 2.7numpy。在這個實現中沒有辦法使用scipymatplotlib

_____________________________________________________________________

編輯:使用DanielF答案,我可以做的東西halfworking(也感謝您DanielF的指正在我原來的職位,更易於閱讀)

使用新的原點是好主意 但是,我不能讓它高效與我的數據 這是工作:

def WorkingDeg4(): 
    x = np.arange(100) 
    y0 = 4.0*x**4+0.07 * x ** 3 + 0.3 * x ** 2 + 1.1 * x 
    y = y0 + 1000 * np.random.randn(x.shape[0]) 
    XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T 
    p_all = np.linalg.lstsq(XX, y)[0] 
    pp = np.polyfit(x, y, 3) 
    p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0] 
    y_fit = np.dot(p_no_offset, XX[:, :-1].T) 
    for i in range(0,len(x)): 
     print x[i],y0[i],y[i],y_fit[i] 

但是,如果我想使INT使用主我的數據 我把:

if __name__ == '__main__': 
    MyDataX=[0.050 , 0.055 , 0.060 , [...], 0.243] 
    MyDataY=[1.000000000 , 1.000446069 , 1.000395689 , [...] , 1.008266254] 
    TabX=[0.0]*len(MyDataX) 
    TabY=[0.0]*len(MyDataY) 
    for i in range(0,len(TabX)): 
     TabX[i]=MyDataX[i]-MyDataX[0] 
     TabY[i]=MyDataY[i]-MyDataY[0] 

所以,在這一點上,我做了「回到原點」的階段

,我想這樣做相同def Working但我的數據,所以我做了TGE WorkingDeg4的拷貝過去,只是去除掉創建x和y的,放入參數

def NOTWorkingDeg4 (x,y): 
    XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T 
    p_all = np.linalg.lstsq(XX, y)[0] 
    pp = np.polyfit(x, y, 3) 
    p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0] 
    y_fit = np.dot(p_no_offset, XX[:, :-1].T) 

和這個人是不工作... 。我有一個mystake在行

XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

所以對於我的理解,它不希望這樣做,因爲我當它x**4,x是不是整數。但我不知道燙去解決問題

_____________________________________________________________________ 編輯2:發現: 的問題是啓動TABX和泰比,而不是陣列,而是作爲np.array 錯誤:

TabX=[0.0]*len(MyDataX) 
TabY=[0.0]*len(MyDataY) 

右:

TabX=np.array([0.0]*len(LongueursFissureGlobale)) 
TabY=np.array([0.0]*len(CourbeInterpolationGlobale)) 
+0

Aaah'abaqus'。我知道那痛苦。 –

+0

你可能會想要移動你的數據,以便'(0.5,1.0)'是你的原點'(0,0)',以便讓你的計算更容易,然後做一個'numpy.linalg.lstsq'。請參閱[本答案](https://stackoverflow.com/questions/32260204/numpy-polyfit-passing-through-0)。然後,您可以將一階導數設置爲零,不僅可以從'a'矩陣中刪除常量,而且還可以從'x'值中刪除常量。 –

+0

如果你看看如何計算這種最小化,應該很容易推導出修改後的公式。幾小時後會寫點東西。 –

回答

0

你可能會想改變你的數據,以便(0.05, 1.0)是你的出身(0, 0),讓您計算變得更容易,然後做一個numpy.linalg.lstsq

x = TabX - 0.05 
y = TabY - 1.0 
X_poly = np.vstack((x ** 4, x ** 3, x ** 2)) 
poly_coeffs = np.linalg.lstsq(X_poly.T, y) 
y_fit = np.dot(poly_coeffs, X_poly) 

如果它需要的話,你就必須改變多項式回到舊的座標,但這種轉變使得安裝更加簡單。

查看This answer瞭解更多詳情。

+0

使用新來源是一個好主意 – texas

+0

是的,當處理多項式導數時,儘可能多地設置零點使計算變得更容易。如果這回答你的問題,記得標記檢查。 –

+0

這是一步,但我需要時間來編輯第一篇文章,因爲我還沒有解決它。但是謝謝你的幫助。 – texas