Fitting data to system of ODEs using Python via Scipy & Numpy

前端 未结 4 1965
情书的邮戳
情书的邮戳 2021-02-06 03:15

I am having some trouble translating my MATLAB code into Python via Scipy & Numpy. I am stuck on how to find optimal parameter values (k0 and k1) for my system of ODEs to fi

4条回答
  •  無奈伤痛
    2021-02-06 03:36

        # cleaned up a bit to get my head around it - thanks for sharing 
        import pylab as pp
        import numpy as np
        from scipy import integrate, optimize
    
        class Parameterize_ODE():
            def __init__(self):
                self.X = np.linspace(0,9,10)
                self.y = np.array([0.000,0.416,0.489,0.595,0.506,0.493,0.458,0.394,0.335,0.309])
                self.y0 = [1,0,0] # inital conditions ODEs
            def ode(self, y, X, p):
                return (-p[0]*y[0],
                         p[0]*y[0]-p[1]*y[1],
                                   p[1]*y[1])
            def model(self, X, p):
                return integrate.odeint(self.ode, self.y0, X, args=(p,))
            def f_resid(self, p):
                return self.y - self.model(self.X, p)[:,1]
            def optim(self, p_quess):
                return optimize.leastsq(self.f_resid, p_guess) # fit params
    
        po = Parameterize_ODE(); p_guess = [0.2, 0.3] 
        c, kvg = po.optim(p_guess)
    
        # --- show ---
        print "parameter values are ", c, kvg
        x = np.linspace(min(po.X), max(po.X), 2000)
        pp.plot(po.X, po.y,'.r',x, po.model(x, c)[:,1],'-b')
        pp.xlabel('X',{"fontsize":16}); pp.ylabel("y",{"fontsize":16}); pp.legend(('data','fit'),loc=0); pp.show()
    

提交回复
热议问题