gpt4 book ai didi

julia - 在 Julia 中模拟粒子的碰撞

转载 作者:行者123 更新时间:2023-12-04 07:22:55 25 4
gpt4 key购买 nike

我想模拟盒子内粒子的碰撞。
更具体地说,我想创建一个函数(我们称之为 collision! ),在每次交互后更新粒子速度,如图所示。
enter image description here
我定义了粒子(半径等于 1)如下:

mutable struct Particle
pos :: Vector{Float64}
vel :: Vector{Float64}
end
p = Particle( rand(2) , rand(2) )
# example for the position
p.pos
> 2-element Vector{Float64}:
0.49339012018408135
0.11441734325871078
而对于碰撞
function collision!(p1::Particle, p2::Particle)

# ... #

return nothing
end
主要思想是当两个粒子碰撞时,它们“交换”平行于粒子中心的速度向量(向量 n hat)。
为了做到这一点,需要将速度向量转换为碰撞法线(n hat)的正交基。
enter image description here
然后调换平行元件,在原来的基础上旋转回来。
enter image description here
我想我的数学是对的,但我不确定如何在代码中实现它

最佳答案

需要注意的是,我根本没有检查数学,您提供的 2d 案例的一种实现可能是:

struct Particle
pos :: Vector{Float64}
vel :: Vector{Float64}
end

p1 = Particle( rand(2) , rand(2) )
p2 = Particle( rand(2) , rand(2) )

function collision!(p1::Particle, p2::Particle)
# Find collision vector
n = p1.pos - p2.pos
# Normalize it, since you want an orthonormal basis
n ./= sqrt(n[1]^2 + n[2]^2)
# Construct M
M = [n[1] n[2]; -n[2] n[1]]
# Find transformed velocity vectors
v1ₙ = M*p1.vel
v2ₙ = M*p2.vel
# Swap first component (or should it be second? Depends on how M was constructed)
v1ₙ[1], v2ₙ[1] = v2ₙ[1], v1ₙ[1]
# Calculate and store new velocity vectors
p1.vel .= M'*v1ₙ
p2.vel .= M'*v2ₙ
return nothing
end
几点:
  • 您不需要 mutable struct ;只是一个普通的struct将正常工作,因为 Vector本身是可变的
  • 如果您可以就地工作或更可行地在堆栈上工作(例如,使用某种静态数组而不是基本数组作为位置和速度向量的基础),则此实现有很多多余的分配,您可以避免这些分配。 .如果你只是创建另一个结构(比如“CollisionEvent”),它保存 M、n、v1n 和 v2n 的预分配缓冲区,并将其传递给 collision!,就地实际上可能不会太难。功能一样。
  • 虽然我还没有深入研究,但可以在像 https://github.com/JuliaMolSim/Molly.jl 这样的分子动力学包中找到这种类型碰撞的有用引用实现。
  • 关于julia - 在 Julia 中模拟粒子的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68380118/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com