2017-03-16 21 views
0

私のデータをPythonコードにフィッティングさせるためのMATLABコードを変換しようとしていますが、似たような答えが得られません。データは次のとおりです。指数曲線がPythonでフィッティングする

x = array([ 0. , 12.5 , 24.5 , 37.75, 54. , 70.25, 87.5 , 
    108.5 , 129.5 , 150.5 , 171.5 , 193.75, 233.75, 273.75]) 
y = array([-8.79182857, -5.56347794, -5.45683824, -4.30737662, -1.4394612 , 
    -1.58047016, -0.93225927, -0.6719836 , -0.45977157, -0.37622436, 
    -0.56115757, -0.3038559 , -0.26594558, -0.26496367]) 

Matlabのコードは次のとおりです。

Pythonで
function [estimates, model] = curvefit(xdata, ydata) 
% fits data to the curve y(x)=A-B*e(-lambda*x) 

start_point = rand(1,3); 

model [email protected]; 
options = optimset('Display','off','TolFun',1e-16,'TolX',1e-16); 
estimates = fminsearch(model, start_point,options); 
% expfun accepts curve parameters as inputs, and outputs sse, 
% the sum of squares error for A -B* exp(-lambda * xdata) - ydata, 
% and the FittedCurve. 
    function [sse,FittedCurve] = efun(v) 
     A=v(1); 
     B=v(2); 
     lambda=v(3); 
     FittedCurve =A - B*exp(-lambda*xdata); 
     ErrorVector=FittedCurve-ydata; 
     sse = sum(ErrorVector .^2); 
    end 
end 
err = Inf; 
numattempts = 100; 
for k=1:numattempts 
[intermed,model]=curvefit(x, y)); 
[thiserr,thismodel]=model(intermed); 
if thiserr<err 
    err = thiserr; 
    coeffs = intermed; 
    ymodel = thismodel; 
end 

と、これまで私が持っている:

import numpy as np 
from pandas import Series, DataFrame 
import pandas as pd 
import matplotlib.pyplot as plt 
from scipy import stats 
from scipy.optimize import curve_fit 
import pickle 

def fitFunc(A, B, k, t): 
    return A - B*np.exp(-k*t) 
init_vals = np.random.rand(1,3) 
fitParams, fitCovariances = curve_fit(fitFunc, y, x], p0=init_vals) 

私は上の100回の試みを実行していると、何かをしなければならないと思いますp0ですが、曲線は約1/10にしか収束せず、Matlabの値から離れて直線に収束します。また、私が見たカーブフィッティングに関するほとんどの質問は、B np.exp(-k t)+ Aを使用していますが、上記の指数式がこのデータに使用する必要があります。何かご意見は?あなたの時間をありがとう!

答えて

1

curve_fit(fitFunc, y, x], p0=init_vals)は、curve_fit(fitFunc, x,y, p0=init_vals)である必要があります。つまり、xはyより前になります。 fitFunc(A, B, k, t)fitFunc(t,A, B, k)である必要があります。独立変数が最初に出ます。以下のコードを参照してください:

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

x = np.array([ 0. , 12.5 , 24.5 , 37.75, 54. , 70.25, 87.5 , 
    108.5 , 129.5 , 150.5 , 171.5 , 193.75, 233.75, 273.75]) 
y = np.array([-8.79182857, -5.56347794, -5.45683824, -4.30737662, -1.4394612 , 
    -1.58047016, -0.93225927, -0.6719836 , -0.45977157, -0.37622436, 
    -0.56115757, -0.3038559 , -0.26594558, -0.26496367]) 

def fitFunc(t, A, B, k): 
    return A - B*np.exp(-k*t) 
init_vals = np.random.rand(1,3) 

fitParams, fitCovariances = curve_fit(fitFunc, x, y, p0=init_vals) 
print fitParams 
plt.plot(x,y) 
plt.plot(x,fitFunc(x,*fitParams)) 
plt.show() 
+0

これは知っておいて、ありがとうございます! – adamluco

+0

pythonへようこそ!これらの関数と例のドキュメントをお読みください。彼らは非常に便利です。 – plasmon360

+0

回答の1つを選択して受け入れることができるので、人々は質問が完了したことを知ることができますか? – plasmon360

関連する問題