Поиск параметров с использованием метода Leastsq для Левенберга Марквардта - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь построить данные для моей модели и уравнения наименьшего количества, так как я получаю ошибки формы. Я просто пытаюсь угадать параметры, которые соответствуют данным, но я не могу этого сделать, если я не вижу графиков.

Вот что у меня есть:

from scipy.integrate import odeint
Import numpy as np
Import matplotlib.pyplot as plt

#data
didata1 = np.loadtxt("diauxic1.txt")
time = didata1[:,0]
pop2 = didata1[:,1]

# model equations
def diauxic_ode(x,t,params):
    r1,r2,k = params  
    y,S1,S2 = x
    derivs = [r1*S1*y+(k/(k+S1))*r2*S2*y, -r1*S1*y, -(k/(k+S1))*r2*S2*y]
    return derivs

# runs a simulation and returns the population size
def diauxic_run(pars,t):
    r1,r2,k,y0,S10,S20 = pars
    ode_params=[r1,r2,k]
    ode_starts=[y0,S10,S20]
    out = odeint(diauxic_ode, ode_starts, t, args=(ode_params,))
    return out[:,0] 

# residual function
def diauxic_resid(pars,t,data):
    r1,r2,k,y0,S10,S20 = pars
    ode_params=[r1,r2,k]
    ode_starts=[y0,S10,S20]
    out = odeint(diauxic_ode, ode_starts, t, args=(ode_params,))
    return diauxic_run(pars,t)-data


p0 =[1,1,1,1,1,1]
lsq_out = leastsq(diauxic_resid, p0, args=(time,pop2))

plt.plot(time,pop2,'o',time,diauxic_resid(p0,time,lsq_out[0]))

plt.show()

1 Ответ

0 голосов
/ 11 января 2020

Непосредственной ошибкой является вызов diauxic_resid(p0,time,lsq_out[0]).

  • Вы действительно хотите отобразить исходные данные и ошибки на одном графике?
  • Аргументы неверны, как для resid, так и для run. То, что что-то не так, уже ясно, имея начальную точку p0 в аргументах, где вы хотите построить адаптированный результат.

Таким образом, замените на diauxic_run(lsq_out[0],time). Или, что еще лучше, разделите команды графика и увеличьте плотность выборки для кривой

plt.plot(time,pop2,'o');
time = np.linspace(time[0], time[-1], len(time)*10-9)
plt.plot(time,diauxic_run(lsq_out[0], time))

enter image description here

из тестовых данных, сгенерированных с помощью

ptest = [0.5, 0.2, 20, 0.2,3.,1.5]
time = np.linspace(0,10,21);
pop2 = diauxic_run(ptest, time)+ np.random.randn(len(time))*0.01

ведет к установленным параметрам

lsq_out[0]: [ 0.23199391  0.5998453  20.67961621  0.19636029  2.16841159  2.32688635]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...