Прежде всего, отредактируйте первый пакет, который Distributions
, а не Distribution
, мне потребовалось некоторое время, чтобы найти ошибку xD
Основная проблема - .=
в вашем первомуравнение.Когда вы делаете это, вы не просто присваиваете новые значения массиву, вы делаете view
.Я не могу точно объяснить вам, что такое представление, но я могу вам сказать, что при таком назначении левая и правая стороны должны иметь одинаковый тип.
Например:
N = 100
u = rand(N,N+1)
du = rand(N,N+1)
julia> u[:,1] .= du[:,1]
100-element view(::Array{Float64,2}, :, 1) with eltype Float64:
0.2948248997313967
0.2152933893895821
0.09114453738716022
0.35018616658607926
0.7788869975259098
0.2833659299216609
0.9093344091412392
...
Результатом является view
, а не Вектор.С этим синтаксисом левая и правая стороны должны иметь один и тот же тип, чего не происходит в вашем примере.Обратите внимание, что типы rand(5)
и rand(5,1)
различны в Юлии: первый - Array{Float64,1}
, а другой - Array{Float64,2}
.В вашем коде d[:,1]
- это Array{Float64,1}
, а 1 .- 1/N .* sum.([u[i,j+1] * sin(u[i,1] - u[j,1] + a) for i in 1:N, j in 1:N], dims=2)
- это Array{Float64,2}
, поэтому он не работает.У вас есть два варианта: изменить знак равенства на:
du[:,1] = ...
Или:
du[:,1] .= 1 .- 1/N .* sum.([u[i,j+1] * sin(u[i,1] - u[j,1] + a) for i in 1:N, j in 1:N], dims=2)[:,1]
Первый вариант - это просто базовое назначение, второй вариант использует способ view
исоответствует типам обеих сторон.