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()
,才能做任何事情,您可能会忘记……但如果没有更多的上下文,您无法说出如何重新设计它