2017-06-06 84 views
0

我是新來的分析,我正在尋找一個解決方案找到一個模型來解決非線性方程的形式Y=a(X1^b) + c(X2^d) + e(其中X1,X2是自變量) 下面是一個完整的集合,不幸的是我們沒有太多的觀察,我們需要的只是任何簡單的擬合。但是這些數據沒有任何異常值,每個觀測值都必須考慮。尋找非線性方程python scipy

import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 
import numpy as np 
import sympy as sym 

x1=np.array([217,160,97,75]) 
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464]) 
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344]) 
y=np.array([14,7,7,1]) 

def func(X, a, b, c ,d , e): 
    x1,x2 = X 
    return a*x1**b + c*x2**d + e 

popt, pcov = curve_fit(func, (x1,x2), y) 

plt.plot(y, func((x1,x2), *popt), label="Fitted Curve") 
plt.legend(loc='upper left') 
plt.show() 

但運行curve_fit給我的錯誤,指出該

TypeError: Improper input: N=5 must not exceed M=4

然後我不得不添加一些更多的虛擬輸入,添加這導致錯誤小數點差幾乎相同值的觀察

x1=np.array([217,160,97,75,76,219]) 
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464,5.319751464,5.319751464]) 
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344,1.420635344,143.420635344]) 
y=np.array([14,7,7,1,1,14]) 

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1200.

然後我不得不刪除變量d並保留函數爲

def func(X, a, b, c ,e): 
    x1,x2 = X 
    return a*x1**b + c*x2 + e 

最後它沒有運行,但再次與下面的警告,但效果並不好

RuntimeWarning: overflow encountered in power

注意

x3 = max(x2 - {(x1^2)*2.6},0)

和解決

y=a*(x3^b) gives a=0.89 and b=0.58 with r2=0.98 and error=0.19 which is the best one i could get so far

但我會喜歡以廣義形式得到結果w沒有我試圖等同於一個關係。由於基於數據集,函數x3 = f(x1,x2)可以改變,對於所有情況它不是一個固定的方程。

回答

0

獲得可接受的擬合結果的一個非常好的方法是使用初始猜測的自由參數。 curve_fit需要一個p0的說法。如果你的數據在兩個數據集之間變化不大,這應該是一個正確的方法。根據我的經驗,採取一些負擔來猜測良好的起始值p0並通過參數bounds設置限制是一個好方法。否則,如果你不需要知道數學關係,你可以嘗試插入數據。