【问题标题】:How to do numeric differentiation using Boost Units?如何使用 Boost Units 进行数值微分?
【发布时间】:2021-05-25 18:55:39
【问题描述】:

我想在 C++ 中执行数值微分。为了类型安全,我想使用boost::units 来避免混合单位,也想使用boost::units::absolute 来避免混合相对单位和绝对单位。

一个最小的例子是将速度计算为位置变化除以时间变化的函数:v = dx/dt,可以近似为(x1 - x0)/(t1 - t0)

在这个例子中,v 有一个绝对单位(速度),dxdt 有一个相对单位(距离/持续时间)。

虽然boost::units 导出正确的单位,但如果我们简单地在任何地方取相对单位,

static_assert(std::is_same<boost::units::divide_typeof_helper<
                               boost::units::si::length, 
                               boost::units::si::time>::type, 
                           boost::units::si::velocity>::value);

如果我们希望除法的结果是绝对速度,static_assert 会失败:

static_assert(std::is_same<boost::units::divide_typeof_helper<
                               boost::units::si::length, 
                               boost::units::si::time>::type, 
                           boost::units::absolute<boost::units::si::velocity>>::value);

我是否做了错误的假设,即除以两个相对单位的结果应该总是产生一个绝对单位?或者这是boost::units的实现中的错误?

【问题讨论】:

    标签: c++ differentiation boost-units


    【解决方案1】:

    来自docs on boost::units::absolute

    说明

    表示绝对单位(点而不是向量)的包装器。

    时空事件是点(如果不被视为半径向量),它们的差异是向量。速度也是一个向量。因此,您的假设确实看起来是错误的。

    【讨论】:

    • 速度不能再是绝对的(= 速度空间中的位置)或相对(= 速度空间中的矢量)吗?在我的理解中,绝对速度代表粒子的速度,相对速度代表两个绝对速度之间的差异,例如用于计算(绝对)加速度。
    • @user2968115 当然可以,就像位置可以被视为半径向量,因此是相对的。我不希望通用维度分析库支持这种微妙的重新解释。记住两个长度(弧长和半径)的比率如何突然得到角度的尺寸。这也是您需要手动更改维度的情况。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多