векторное дифференциальное уравнение Юлии: построение только первых n компонент вектора - PullRequest
0 голосов
/ 08 января 2019

Я интегрирую векторное дифференциальное уравнение в Юлии (количество компонентов порядка 50). Когда я строю это решение, очевидно, что этот график будет очень насыщенным, если я нанесу все компоненты, поэтому я хочу построить только, скажем, первые 10 компонентов. Я не могу найти, как это сделать. Кроме того, вместо отображения выходных данных для каждого компонента, я хотел бы построить не выходные данные интегрирования на каждом временном шаге, а их гиперболический тангенс. Я также не нахожу, как сделать эту манипуляцию. Я думаю, что ключевая проблема заключается в том, что я не понимаю / не нахожу, что это за решение дифференциального уравнения в Юлии.

Вот минимальный рабочий пример, который интегрирует дифференциальное уравнение и строит график всего решения.

using DifferentialEquations
using Plots
using LinearAlgebra

N=50                      
J=0.18*randn(Float64,N,N)   
g=1   

function hDerivative(timederiv,h,p,t)
    for i=1:length(h)
        timederiv[i] = -h[i]
        for j=1:length(h)
            timederiv[i]=+timederiv[i]+J[i,j]*tanh(g*h[j])            
        end

    end  
end

function pltTimeVolution()
    hinit=rand(Float64,N)
    tspan=(0.0,50)
    prob = ODEProblem(hDerivative,hinit,tspan)
    sol=solve(prob)

    plot(sol)  
    print(sol)

end

pltTimeVolution()

1 Ответ

0 голосов
/ 09 января 2019

Для получения справки взгляните на страницу обработки решения: http://docs.juliadiffeq.org/latest/basics/solution.html. Решением является как абстрактный массив, так и непрерывная функция. Так, например, вы можете получить непрерывное решение в 10000 равномерно распределенных временных точках, таких как t=range(tspan[1],stop=tspan[2],length=10000), do A = sol(t), и это даст 50x10000 временных рядов каждого решения в равномерно распределенных временных точках, и тогда sol[i,:] будет временной серией переменная i в моменты времени t. Вы можете использовать это для построения массивов, которые вы хотите построить. Полный код вроде этого:

t=range(tspan[1],stop=tspan[2],length=10000)
A = sol(t)
ts10 = sol[10,:]

Другой способ сделать это - решить что-то вроде saveat=t, и в этом случае решением является массив, который сохраняется в эти моменты времени. Это выглядит так:

t=range(tspan[1],stop=tspan[2],length=10000)
sol=solve(prob,saveat=t)
ts10 = sol[10,:]

Или вы можете использовать рецепт сюжета, который выполняет такую ​​обработку внутри. Взгляните на http://docs.juliadiffeq.org/latest/basics/plot.html#Choosing-Variables-1. Вы можете сделать такие вещи, как построение первой переменной и затем наложить на график 10-й переменной, например:

plot(sol,vars=(0,1))
plot!(sol,vars=(0,10))

! означает функцию изменяющегося графика, то есть изменить предыдущий график, добавив новую серию. Затем, как отмечено в документации, существуют ярлыки, такие как

plot(sol,vars = [1, 3, 4])

будет отображать 1-ю, 3-ю и 4-ю переменные как функции времени. В этой форме вы также можете указать, какой тип преобразования вы хотите использовать в качестве функции. Это упоминается в том же месте в документации. Например, двумерный график времени против tanh будет функцией преобразования f=(t,y)->(t,tanh(y)), т. Е. Как вы берете 2D-переменную и выплевываете 2D-переменную для построения графика, просто проходя через первую и tanh вторую. Затем, используя это, вы будете использовать команду plot:

f=(t,y)->(t,tanh(y))
plot(sol,vars = (f,0,5))

для построения tanh 5-й переменной от времени.

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

...