首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Julia中求解初始条件为二维数组的常微分方程组

在Julia中求解初始条件为二维数组的常微分方程组
EN

Stack Overflow用户
提问于 2019-10-14 16:42:55
回答 1查看 645关注 0票数 2

http://diffeq.sciml.ai/latest/tutorials/ode_example.html

我正在尝试使用Julia (DifferentialEquations.jl)中的常微分方程求解器来求解n个相互作用的粒子系统。假设系统是二维的,每个粒子的运动方程是由它相对于时间的位置的二阶常微分方程来描述的。然后每个粒子需要四个变量,两个用于位置,两个用于速度。然后需要声明4n个变量。有没有一种方法可以推广,这样就不需要逐个列出所有4n个方程?

例如:

http://diffeq.sciml.ai/latest/tutorials/ode_example.html#Example-2:-Solving-Systems-of-Equations-1

我尝试将上面链接中的洛伦兹方程修改为n个粒子(这是一个非常非常粗糙的尝试,因为我实际上不知道如何做到这一点),尝试将udu扩展到2D阵列。

代码语言:javascript
运行
复制
using DifferentialEquations
using Plots
n = 4
function lorenz(du,u,p,t,i)
    du[i,1] = 10.0*(u[i,2]-u[i,1])*sum(u[1:n,1])
    du[i,2] = (u[i,1]*(28.0-u[i,3]) - u[i,2])*sum(u[1:n,1])
    du[i,3] = (u[i,1]*u[i,2] - (8/3)*u[i,3])*sum(u[1:n,1])
end

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

这并不令人惊讶,但我希望您能理解我想要做的事情。有没有办法让ODE求解器将u作为2D数组来求解(或者其他可以实现类似目的的方法)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-14 19:01:40

问题不在2D阵列。例如,将您的lorenz定义替换为

代码语言:javascript
运行
复制
function lorenz(du,u,p,t)
    du[1,1] = 10.0*(u[1,2]-u[1,1])
    du[1,2] = (u[1,1]*(28.0-u[1,3]) - u[1,2])
    du[1,3] = (u[1,1]*u[1,2] - (8/3)*u[1,3])
end

都会起作用的。

问题出在函数签名,不支持额外的i。如果你想解决洛伦兹振荡器的网络,你必须用一个具有相同签名的函数进行编码,例如,lorenz_network!(du, u, p, t)用于inplace版本。在你的函数中的各个振荡器上放一个循环,你就快成功了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58373017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档