用python拟合指数曲线 [英] exponential curve fitting with python

查看:694
本文介绍了用python拟合指数曲线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将一些用于将数据曲线拟合的Matlab代码转换为python代码,但是在获取相似答案时遇到了麻烦.数据是:

I am trying to convert some Matlab code I have for curve fitting my data into python code but am having trouble getting similar answers. The data is:

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代码为:

The Matlab code is:

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

start_point = rand(1,3);

model =@efun;
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

到目前为止,我在Python中拥有:

and so far in Python I have:

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)

我认为我必须在p0上运行100次尝试,但是曲线只能收敛大约1/10倍,并且收敛到一条直线,与我在Matlab中获得的值相去甚远.我看到的大多数关于曲线拟合的问题都使用B np.exp(-k t)+ A,但是我上面要使用的指数公式就是我要用于此数据的公式.有什么想法吗?谢谢您的时间!

I think I have to do something with running 100 attempts on the p0, but the curve only converges about 1/10 times and it converges to a straight line, way off from the value I get in Matlab. Also most questions regarding curve fitting that I have seen use Bnp.exp(-kt) + A, but the exponential formula I have above is the one I have to use for this data. Any thoughts? Thank you for your time!

推荐答案

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).自变量排在第一位.请参见下面的代码:

curve_fit(fitFunc, y, x], p0=init_vals) should be curve_fit(fitFunc, x,y, p0=init_vals) ie, x goes before y . fitFunc(A, B, k, t) should be fitFunc(t,A, B, k). The independent variable goes first. See the code below:

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()

这篇关于用python拟合指数曲线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆