Rust ode_solvers 获取整个积分过程中的所有状态(用于绘图)

问题描述 投票:0回答:1

我正在尝试学习在 rust 中使用 ode_solvers 箱,文档和(更多信息)github 文档可以在以下位置找到:

https://docs.rs/ode_solvers/latest/ode_solvers/

https://srenevey.github.io/ode-solvers/index.html

我已经能够运行模拟。但是,我无法弄清楚如何获取步骤给出的值以绘制路径。例如。他们的文档中给出的示例之一是开普勒轨道https://srenevey.github.io/ode-solvers/examples/kepler_orbit.html,其中他们显示了轨道图,但据我所知,他们确实这样做了没有显示它是如何绘制的,我无法弄清楚如何提取积分给出的值。

请让我知道如何提取最终值和中间值,以便我可以绘制路径。谢谢,

开普勒轨道示例的代码是:

use ode_solvers::{self, dop853::*};

type State = ode_solvers::Vector6<f64>;
type Time = f64;

struct KeplerOrbit {
    mu: f64,
}

impl ode_solvers::System<Time, State> for KeplerOrbit {
    // Equations of motion of the system
    fn system(&self, _t: Time, y: &State, dy: &mut State) {
        let r = (y[0] * y[0] + y[1] * y[1] + y[2] * y[2]).sqrt();

        dy[0] = y[3];
        dy[1] = y[4];
        dy[2] = y[5];
        dy[3] = - self.mu * y[0] / r.powi(3);
        dy[4] = - self.mu * y[1] / r.powi(3);
        dy[5] = - self.mu * y[2] / r.powi(3);
    }
}

fn main() {
    let system = KeplerOrbit {mu: 398600.435436};

    let a: f64 = 20000.0;
    let period = 2.0 * std::f64::consts::PI * (a.powi(3) / system.mu).sqrt();
    let y0 = State::new(-5007.248417988539, -1444.918140151374, 3628.534606178356, 0.717716656891, -10.224093784269, 0.748229399696);

    let mut stepper = Dop853::new(system, 0.0, 5.0 * period, 60.0, y0, 1.0e-10, 1.0e-10);
    let res = stepper.integrate();

    // Handle result
    match res {
        Ok(stats) => {
            println!("stats: {:?}", stats)
            
        },
        Err(_) => println!("An error occured."),
    }
}
rust integration
1个回答
0
投票

您的

system
变量具有
x_out
y_out
方法,您可以在积分后使用它们来获取每个积分步骤的值。

© www.soinside.com 2019 - 2024. All rights reserved.