使用已知公式求解缺失的变量

时间:2013-03-03 06:43:11

标签: c++ formula solver

这就是我现在所做的,但我只是想知道是否有更好的方法?

如果已设置变量,我的运动变量类只保留一个long double值和一个bool。我重载了=赋值运算符。

// v_f = v_o + a*t
bool KinematicEquations::equation_vat(KinematicVariable &vo, KinematicVariable &vf,
                                      KinematicVariable &a, KinematicVariable &t)
{
    if (vf.isUsed() && vo.isUsed() && a.isUsed())
        t = (vf.value() - vo.value()) / a.value();  // t = (vf - vo)/a
    else if (vf.isUsed() && vo.isUsed() && t.isUsed())
        a = (vf.value() - vo.value()) / a.value();  // a = (vf - vo)/t
    else if (vf.isUsed() && t.isUsed() && a.isUsed())
        vo = vf.value() - a.value() * t.value(); // vo = vf - a*t
    else if (vo.isUsed() && t.isUsed() && a.isUsed())
        vf = vo.value() + a.value() * t.value(); // vf = vo + at
    else
        return false;

    return true;
}

1 个答案:

答案 0 :(得分:2)

我会考虑使用t = 0和/或a = 0这个等式或多或少没用。它导致vo = vf。所以,我会说先检查一下。具有物理知识的用户可以围绕这样的想法,即如果t或a为零,则必须为它们求解:

bool KinematicEquations::equation_vat(KinematicVariable &vo, KinematicVariable &vf,
                                      KinematicVariable &a, KinematicVariable &t)
{
    if (t == 0)
        t = (vf.value() - vo.value()) / a.value();  // t = (vf - vo)/a
    else if (a == 0)
        a = (vf.value() - vo.value()) / a.value();  // a = (vf - vo)/t
    else if (vf.isUsed())
        vo = vf.value() - a.value() * t.value(); // vo = vf - a*t
    else if (vo.isUsed())
        vf = vo.value() + a.value() * t.value(); // vf = vo + at
    else
        return false;

    return true;
}

这样做至少可以节省几个操作。将变量初始化为0如果它们没有被使用,它们将具有0并且一切都很好。此外,当您到达最后两个时,您已经确定已使用at,因此无需检查。我认为这是一个基于用户感知知识的公平解决方案。