используя Дифференциальные уравнения: вы не обновляете - PullRequest
0 голосов
/ 30 сентября 2018

Я считаю, что в этом коде есть ошибка.Для краткости, я просто напишу функцию, которая определяет ODE

function clones(du,u,p,t)

    (Nmut,f) = p

    # average fitness
    phi = sum(f.*u)

    # constructing mutation kernel
    eps = 0.01
    Q = Qmatrix(Nmut,eps)

    # defining differential equations
    Nclones=2^Nmut;
    du = zeros(Nclones)

    ufQ = transpose(transpose(u.*f)*Q)
    du = ufQ .- phi*u

end

. Если нужен весь код, я могу его предоставить, но он грязный, и я не уверен, как создатьминимальный пример.Я попробовал это, когда Nmut = 2, чтобы я мог сравнить с жестко закодированной версией.Вывод du на первых шагах времени идентиченНо эта версия, кажется, никогда не обновляет вас, она остается в предписанном u0.

У кого-нибудь есть идея, почему это может иметь место?Я также могу предоставить полный сценарий, но хотел бы избежать этого, если бы кто-то мог просто понять, почему вы не будете обновлять.

РЕДАКТИРОВАТЬ:

maxdim=4;
for i in 1:maxdim
    du[i] = 0.0;
    for j in 1:maxdim
        du[i] += u[j].*w[j].*Q[j,i] 
    end
    du[i] -= u[i].*phi
end

Du обновляется правильно, если мы используем эту версию.Почему это так?

1 Ответ

0 голосов
/ 30 сентября 2018

Вы используете форму на месте.При этом вам необходимо обновить значения du.В вашем скрипте вы используете

du = ufQ .- phi*u

, который заменяет имя du новым массивом, но не изменяет значения в исходном массиве du.Быстрое решение состоит в том, чтобы использовать изменяющиеся равные:

du .= ufQ .- phi*u

Обратите внимание, что это .=.

Чтобы понять, что это означает в более основанном на примере формате, подумайте об этом.У нас есть массив:

a = [1,2,3,4]

Теперь мы указываем новую переменную на этот же массив

a2 = a

Когда мы изменяем значение a, мы видим, что отражается в a2поскольку они указывают на одну и ту же память:

a[1] = 5
println(a2) # [5,2,3,4]

Но теперь, если мы заменим a, мы заметим, что ничего не происходит с a2, так как они больше не ссылаются на один и тот же массив

a = [1,2,3,4]
println(a2) # [5,2,3,4]

Пакеты, такие как DifferentialEquations.jl, используют изменяющиеся формы, чтобы пользователи могли избавиться от выделения массивов, многократно изменяя значения в кэшированных массивах.Как следствие это означает, что вы должны обновлять значения du и не заменять его указатель.

Если вам удобнее не использовать мутацию, вы можете использовать синтаксис функции f(u,p,t), хотяЭто может повлиять на производительность, если переменные состояния являются (нестатическими) массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...