Вы используете форму на месте.При этом вам необходимо обновить значения 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)
, хотяЭто может повлиять на производительность, если переменные состояния являются (нестатическими) массивами.