#python #scipy #differential-equations
Вопрос:
Я пытаюсь подогнать простую модель логистического роста к фиктивным данным, используя Scipy
пакет Python. Код показан ниже вместе с выводом, который я получаю. Правильный вывод показан ниже. Я не совсем понимаю, что здесь происходит не так.
import scipy.optimize as optim
from scipy.integrate import odeint
import numpy as np
import pandas as pd
N0 = 0.37
parsic = [.25, 12.9]
df_yeast = pd.DataFrame({'cd': [9.6, 18.3, 29., 47.2, 71.1, 119.1, 174.6, 257.3, 350.7, 441., 513.3, 559.7, 594.8, 629.4, 640.8, 651.1, 655.9, 659.6], 'td': np.arange(18)})
def logistic_de(t, N, r, K):
return r*N*(1 - N/K)
def logistic_solution(t, r, K):
return odeint(logistic_de, N0, t, (r, K), tfirst=True).ravel()
params, _ = optim.curve_fit(logistic_solution, df_yeast['td'], df_yeast['cd'], p0=parsic)
N1 = odeint(logistic_de, N0, np.linspace(0, 20, 10000), (params[0], params[1]), tfirst=True)
plt.plot(np.linspace(0, 20, 10000), N1)
plt.scatter(df_yeast['td'], df_yeast['cd'])
plt.ylabel('num yeast')
plt.xlabel('time')
Комментарии:
1. Сделайте
N0
дополнительный параметрlogistic_solution
(см. Ответ @DavisHerring). Используйте пределы известных данных в качестве разумного начального предположения о параметрах, напримерN0=9.6
,K=660
.2. @WarrenWeckesser не могли бы вы включить код, чтобы исправить это?
3. @AnIgnorantWanderer: В комментарии уже сказано, что делать, не так ли? Переполнение стека-это не служба написания кода, хотя, похоже, кто-то был так любезен, что согласился.
4. @DavisHerring в нем говорится, что делать, я попытался просто добавить его в качестве параметра, но нужно было сделать и что-то еще
5. @Davis Herring Я дал OP преимущество сомнения в том, что они попытались отредактировать
logistic_solution
функцию, как было предложено, и скорректировалиcurve_fit
строку, чтобы запустить код, но очень возможно пропустить редактированиеN1
и получить неправильный результат.
Ответ №1:
Это правка, на которую они намекают, может быть, это поможет вам понять:
# include N0 as an argument
def logistic_solution(t, N0, r, K):
return odeint(logistic_de, N0, t, (r, K), tfirst=True).ravel()
# N0 thus included as parameter to fit
params, _ = optim.curve_fit(logistic_solution, df_yeast['td'], df_yeast['cd'],
p0=[N0, *parsic])
# N1 integral factors in the fitted N0 parameter
# (not the same as the global variable named N0,
# should change global variable to something like N0_guess)
N1 = odeint(logistic_de, params[0], np.linspace(0, 20, 10000),
tuple(params[1:]), tfirst=True)
Ответ №2:
Ваша оптимизация не позволяет изменять N0
, что резко отличается от фактического значения t=0 в списке.
Комментарии:
1. не могли бы вы включить код, чтобы исправить это?