2017-06-20 31 views
0

我想要沿着Y軸向上(或向下)移動主曲線以最佳擬合一系列數據點。我想通過主曲線的向上(或向下)移動來最小化主曲線數據點與測量數據點之間的誤差總和(sum_error),並獲得移動係數(比方說K)。優化曲線移動參數

master_curve = np.array([3.920443406036651, 2.7639821779105542, 
2.254338877722025, 1.9513837218071342, 1.7450166671832754, 
1.5928839897758424, 1.4747653105080576, 1.3796281282142924, 
1.3008753435392029, 1.234288351142671, 1.1770273049744642, 
1.1271011783216718, 1.0830672127478984, 1.0438509579431305, 
1.0086336030441687, 0.9767787536056324, 0.9477833091755259, 
0.9212435957417907, 0.8968314534272098, 0.8742769964680429]) 

data = np.array([12.82398603780653, 8.708265346706627, 
6.943916634340093, 5.913441041271008, 5.220678298445037, 
4.7153411130496306, 4.326441800656878, 4.015585602454473, 
3.7599836807770317, 3.5451576271700658, 3.3614170020938596, 
3.2020029881204284, 3.0620410438719667, 2.9379167363509975, 
2.8268866460269106, 2.72682649883558, 2.6360628206802112, 
2.5532572707864203, 2.477325238639876, 2.4073773335594093]) 

for i in range(len(data)):  
    error[i] = np.abs(master_curve[i]-data[i]) 
sum_error = error.sum() 

我想用scipy.optimize.minimize的,但我不知道sum_error最小化時如何獲得K參數值。 我還必須爲一條主曲線的多個數據集執行此操作,並且我有70條主曲線和270個數據集!我只能想到兩個「for」循環。

感謝您的幫助。

看到這樣的畫面,K是一種最小化功能方面的限制:

曲線移

+0

請顯示您的代碼 – eyllanesc

+0

我沒有寫這部分,這就是爲什麼我問。無論如何,我得到了答案,謝謝:) – Sina

回答

0

沒有必要使用SciPy的最小化。這比這要容易得多。您對k的實際答案僅爲:np.mean(master_curve-data)-2.9244855211176906。這是因爲你設置了平均值的計算方式。

k = np.linspace(-5, 5, 100) 
errors = np.array([np.mean((master_curve - data + m)) for m in k]) 
plt.plot(k, errors) 

您應該看到類似以下內容:

error as a function of <code>k</code>

現在在哪兒最小化這個錯誤?擬合多線並找到y-intercrpt:

>>> np.polyfit(k, errors, 2) 
array([ -5.67339604e-16, 1.00000000e+00, -2.92448552e+00]) 

正如你所看到的,y軸截距是-2.92448552e + 00。正是你想要的第一個地方通過採取意思的差異...

+0

太棒了!工作!謝謝。 – Sina