在用DifferentialEquations.jl解方程时得到的解怎么传递给其他变量?


#1

在用DifferentialEquations.jl解方程时得到的解后,sol是一个包含了时间数组和解的数组的东西。如果我想用循环一次输入多个不同的初始参数,然后得到多个不同sol,怎么把sol的值传递给不同的变量。或者有什么其他更好的办法吗。

function lorenz(du,u,p,t)
 du[1] = 10.0*(u[2]-u[1])
 du[2] = u[1]*(28.0-u[3]) - u[2]
 du[3] = u[1]*u[2] - (8/3)*u[3]
end

u0 = [1.0;0.0;0.0]
tspan = (0.0,100.0)
prob = ODEProblem(lorenz,u0,tspan)
sol = solve(prob)

julia> sol
retcode: Success
Interpolation: 3rd order Hermite
t: 1287-element Array{Float64,1}:
   0.0
   3.5678604836301404e-5
   0.0003924646531993154
   0.0032624016752212923
   0.00905808176456279
   ⋮
  99.73556893651245
  99.81512588011671
  99.88533419341042
  99.94751447208056
 100.0
u: 1287-element Array{Array{Float64,1},1}:
 [1.0, 0.0, 0.0]
 [0.999643, 0.000998805, 1.78143e-8]
 [0.996105, 0.0109654, 2.14696e-6]
 [0.969359, 0.0897704, 0.000143801]
 [0.924204, 0.242289, 0.00104616]
 ⋮
 [9.24468, 15.6918, 16.6348]
 [14.3434, 19.1929, 29.3336]
 [14.753, 10.4484, 39.3374]
 [10.2159, 1.29592, 37.3659]
 [5.79036, -1.64216, 32.3329]

#2
a=sol.t
b=sol.u

大约是这样的,不行吗?


#3

行是行,但如果是有100个不同的的sol,怎么写进循环里啊?


#4

那就弄两个数组,分别存放100个t和u啊,或者你想玩什么高级操作?


#5

那该怎么构造数组能存放sol的数组啊?问题可能有点小白,大佬要不闲麻烦能不能写个例子。


#6

你可能需要用到 广播 了,假设 UT分别是 100 个 u0tspan 组成的数组,那么 solve.(ODEProblem.(lorenz, U, T) 的结果即为 100 个对应的 sol 组成的数组,若将其记为 S,则 getfield.(S, :t) 则返回 100 个 solt 字段组成的数组。


#7

我不是大佬,楼上大佬正解,速度快。
我说的办法肯定可行,但作为一个萌新我只用手机也不知道具体怎么写,只是知道查查文档肯定能找到而已……


#8

你的意思是不是把一个array t赋给t1, t2, t3, …, tn?


#9

找到解决方法了,就是得提前创建一个未初始化的数组。。。

solCollect = Array{Array}(undef, 100, 2)
for i in 1:100
    p[i]
    prob = ODEProblem(ReactionKinetics, u0, tspan,  p[i])
    sol = solve(prob, CVODE_BDF())
    solCollect[i, 1] = sol.t
    solCollect[i, 2] = sol
end