Efficiently evaluating ODE event that depends on only some variables
1 回表示 (過去 30 日間)
古いコメントを表示
I'm simulating an N-body problem in the plane.
I want to know when the three particles that are closest to each other are collinear. (Supposing I have a MATLAB function that identifies the "three closest particles.")
Suppose that I have a function f(z1,z2,z3) that vanishes when the particles z1, z2, z3 are collinear.
Right now my simulation evaluates a vector containing all
triples of particles and records all the times any triple is collinear.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1559379/image.png)
Then at the end of the run, I sort through all the events and throw away all the ones where the particles are not "the three closest."
I would rather compute this during the ODE simulation and not afterward. I'd like to construct a new event g that gets triggered whenever f(z1,z2,z3)=0 and z1, z2, and z3. are the closest.
The events construct doesn't seem well-suited to this situation, since it detects zero crossings and the second half of my event is just a boolean. Is there a workaround?
0 件のコメント
回答 (1 件)
Torsten
2023 年 12 月 4 日
編集済み: Torsten
2023 年 12 月 4 日
Use OutputFcn to check your condition after each successful time step.
But I think it will be difficult to check for complanarity for a time-dependent system. It's like checking if a variable equals 0 - floating point arithmetic and the discrete time stepping will hinder to correctly detect such events.
参考
カテゴリ
Help Center および File Exchange で Ordinary Differential Equations についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!