Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用已知公式求解缺少的变量_C++_Formula_Solver - Fatal编程技术网

C++ 用已知公式求解缺少的变量

C++ 用已知公式求解缺少的变量,c++,formula,solver,C++,Formula,Solver,这就是我目前正在做的,但我只是想知道是否有更好的方法 我的运动学变量类只保存一个长的双精度值和一个布尔值(如果变量已设置或未设置)。我重载了=赋值运算符 // v_f = v_o + a*t bool KinematicEquations::equation_vat(KinematicVariable &vo, KinematicVariable &vf, KinematicVariable &a

这就是我目前正在做的,但我只是想知道是否有更好的方法

我的运动学变量类只保存一个长的双精度值和一个布尔值(如果变量已设置或未设置)。我重载了=赋值运算符

// 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;
}

我想,用<代码> t=0 < /代码>和/或<代码> a=0 < /Cord>这个方程式或多或少无用。它会导致

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
s,并且一切正常。此外,当您到达最后两个时,您已经确定使用了
a
t
,因此无需检查。我认为这是一个基于用户感知知识的公平解决方案

它看起来并不特别优雅,但这似乎更像是
KinematicEquations
接口的一个设计问题,很难说在没有更多上下文的情况下如何改进它。也许你最好用
v_f=Add[v_o,Multiply[a,t]]这样的函数重写表达式
,然后递归地将其反转以求解所需变量。这将减少所需硬编码解算器的数量。运动学方程是一组约3个“主要”方程,用于计算物体在一维平面上的运动。每个方程有3个变量,可以求解第4个变量。这是这个集合中最简单的公式之一。@whoevencare我想你也可以使用CAS(计算机代数系统),或者在最坏的情况下将其提交给W | a API。在创建此项之前,您试图解决的问题是什么?:)@不管怎样,我不喜欢用
isUsed()==true
表示“给定变量”,用
isUsed()==false
表示“要求解的变量”,这似乎很容易出错。基本上,这意味着您必须始终检查
isUsed()
,才能做任何事情,您可能会忘记……但如果没有更多的上下文,您无法说出如何重新设计它