Ограничьте решения положительным значением, используя JiTCDDE

Я использую JiTCDDE для решения DDE на модифицированной модели Oregantor. Проблема, с которой я сталкиваюсь, находится рядом с точкой бифуркации, она будет возвращать отрицательные значения. Хотя я знаю, что это математически правильные решения, Орегантор представляет собой химическую систему. Следовательно, отрицательные ответы нереалистичны для реальной системы. Есть ли способ настроить код для возврата минимального значения переменной, когда оно равно ‹=0. Ниже приведена основная часть кода, который у меня есть.

def P1(k):
        return(
            ((H*y(k))/(k01+H*y(k)+kl*H*H*A))*phi
        )

def C(i,j):

    return(
        M1 * ( y(j,t-tau1)-y(i) ) 
      + M2 * ( y(j,t-tau2)-y(i) ) 
    )




MO4 = [
 k1*A*y(1)-k2*y(0)*y(1)+ k3*A*y(0)-2.0*k4*y(0)*y(0)-(y(0)-xsur)*kf,           #HBrO2
 -k1*A*y(1)-k2*y(0)*y(1)+f1*k5*y(2)-(y(1)-ysur)*kf+P1(3)+C(2,6),              #Bromide
 2*k3*A*y(0)-k5*y(2)+P1(3)+C(2,6),                                            #Cataylst
 k1*A*y(1)+2*k2*y(0)*y(1)+k4*y(0)*y(0)-k6*y(3)-(y(3)-vsur)*kf-P1(3)-C(2,6),   #BrMa
 k1*A*y(5)-k2*y(4)*y(5)+ k3*A*y(4)-2.0*k4*y(4)*y(4)-(y(4)-xsur)*kf,           #HBrO2
 -k1*A*y(5)-k2*y(4)*y(5)+f2*k5*y(6)-(y(5)-ysur)*kf+P1(7)+C(6,2),              #Bromide
 2*k3*A*y(4)-k5*y(6)+P1(7)+C(6,2),                                            #Cataylst
 k1*A*y(5)+2*k2*y(4)*y(5)+k4*y(4)*y(4)-k6*y(7)-(y(7)-vsur)*kf-P1(7)-C(6,2),   #BrMa
]

I = jitcdde(MO4)
I.set_integration_parameters(rtol=1e-7,atol=1e-7)
I.constant_past ([0,1.0e-6,0,0,1.0e-6,1.0e-6,1.0e-6,1.0e-6], time=0.0)
I.step_on_discontinuities(max_step=.00001)


data=[]
for time in times:
    data.append( I.integrate(time))
np.savetxt('peaks_%d.dat'%(i), data,)

data1=np.loadtxt('peaks_%d.dat'%(i),dtype = float,delimiter=' ',skiprows=200,usecols=(2,6)).T #,skiprows=80
plt.plot(data1[0],'r')
plt.plot(data1[1],'-.b')
plt.title( 'Catalyst ' )
plt.xlabel('time(sec)')
plt.ylabel('Amplitude')
plt.show()
print('DONE')

person Iamtrying    schedule 12.11.2018    source источник


Ответы (1)


В JiTCDDE нет прямого способа ограничить знаки решений. (Источник: я автор, я бы знал.)

Что вам нужно сделать, так это выяснить, почему ваши решения становятся отрицательными. Пока я могу думать о трех возможных причинах (и я не могу сказать вам больше, не зная вашей точной настройки):

  • Численный шум переводит решение из математически правильного положительного решения в математически правильное отрицательное (но переход между решениями не является математически правильным). В этом случае вы сможете избежать этого, уменьшив абсолютный допуск (atol) или, возможно, максимальный размер шага (max_step). Альтернативой является работа в логарифмической области (см. также этот ответ на аналогичный вопрос), т. е. вы делаете ноль недостижимым по построению (также вы сильнее взвешиваете ошибки, близкие к нулю).

  • Ваша модель позволяет этому происходить, когда этого не должно происходить. В этом случае, и если вам действительно нужно избегать отрицательных значений, избегайте отрицательной производной динамических переменных, которые уже довольно близки к нулю, обернув вокруг нее функцию, которая делает именно это — используя сигмоиды для реализации этой логики (см. также этот мой ответ на другой вопрос). Не поддавайтесь искушению использовать для этого пошаговые функции, поскольку интеграторам это не нравится (далее чтение).

  • Ваши начальные условия положительны, но неправдоподобны. В этом случае используйте другие начальные условия. Если нет прямого способа сказать, какие начальные условия правдоподобны, может быть уместно выбрать случайные, пока вы не найдете подходящее.

Наконец, я рекомендую вам решить, что вы хотите, чтобы произошло, если решение станет отрицательным, и действительно ли это будет лучше.

person Wrzlprmft    schedule 12.11.2018