我在这里有一个立方线图:https://jsfiddle.net/v6bLu80w/2/,它应该在任何时候绘制一条线以显示所显示的三个点。它上面的滑块增加了等式,同时保持在点内。或者至少,它应该,这让我想到了我的问题。
在我的图中,我使用以下等式来设置立方体的系数:
xzero = (thirdy - (firsty * Math.pow(thirdx, 3) / Math.pow(firstx, 3)) + (secondy * Math.pow(thirdx, 3) / firstx) - (Math.pow(thirdx, 3) * (firsty * Math.pow(secondx, 3) / Math.pow(firstx, 3)) / firstx) + (Math.pow(thirdx, 3) * (xone * (secondx, 3) / Math.pow(xone, 2)) / firstx) + (xone * Math.pow(thirdx, 3) / Math.pow(firstx, 2)) - secondy * Math.pow(thirdx, 2) + (firsty * Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 3)) - (xone * Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 2)) + (xone * secondx * Math.pow(thirdx, 2)) - xone * thirdx) / (1 + (Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 3)) + (Math.pow(thirdx, 3) / firstx) - Math.pow(thirdx, 2) - (Math.pow(secondx, 3) * Math.pow(thirdx, 3) * (1 / Math.pow(firstx, 3)) / firstx))
xtwo = (secondy - (firsty * Math.pow(secondx, 3) / Math.pow(firstx, 3)) + (xone * Math.pow(secondx, 3) / Math.pow(firstx, 2)) + (xzero * Math.pow(secondx, 3) / Math.pow(firstx, 3)) - xone * secondx - xzero) / (Math.pow(secondx, 2) - (Math.pow(secondx, 3) / firstx));
xthree = (firsty / Math.pow(firstx, 3)) - (xtwo / firstx) - (xone / Math.pow(firstx, 2)) - (xzero / Math.pow(firstx, 3));
根据我使用的代数,所有方程都应该通过三个点,但是从程序中可以看出,除了起始值之外,所有滑块值的线都将移出第三个点。
我想知道为什么它没有通过第三点,并且如果可能的话,请解决这种情况。
我仍然无法弄清楚问题,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
在您的代码中,您有此声明(拆分为行):
xzero = (
thirdy
- (firsty * Math.pow(thirdx, 3) / Math.pow(firstx, 3))
+ (secondy * Math.pow(thirdx, 3) / firstx)
- (Math.pow(thirdx, 3) * (firsty * Math.pow(secondx, 3) / Math.pow(firstx, 3)) / firstx)
+ (Math.pow(thirdx, 3) * (xone * (secondx, 3) / Math.pow(xone, 2)) / firstx)
+ (xone * Math.pow(thirdx, 3) / Math.pow(firstx, 2))
- secondy * Math.pow(thirdx, 2)
+ (firsty * Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 3))
- (xone * Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 2))
+ (xone * secondx * Math.pow(thirdx, 2))
- xone * thirdx
) / (
1
+ (Math.pow(secondx, 3) * Math.pow(thirdx, 2) / Math.pow(firstx, 3))
+ (Math.pow(thirdx, 3) / firstx)
- Math.pow(thirdx, 2)
- (Math.pow(secondx, 3) * Math.pow(thirdx, 3) * (1 / Math.pow(firstx, 3)) / firstx )
)
这里有一些问题。到目前为止,最大的一个问题是,这是一个非常长的陈述,它在一个地方放得太多而且很容易在构造中犯错误,因为人类实际上很难跟踪括号。至少获得一个带括号突出显示的编辑器,以便您及早收到关闭哪个括号的提示。
这样的陈述出于以下几个原因出错:
xone * (secondx, 3)
的位置似乎在我的控制台中导致xone * 3
,但似乎不太可能是正确的。我怀疑前两个点似乎仍然有用的原因是计算了xzero系数,然后使用前两个坐标(但不是第三个)的坐标来获得其他系数。这会根据你的xzero公式构建一条通过这两点和另一点的曲线,从而看出你所看到的行为。
通常,很难以合理的方式将数学公式转换为代码。并非不可能,但值得努力。通常,在计算每个系数或因子之上的伪数学中添加注释可以更容易地编写正确的代码,更不用说以后修复错误了。
如果您有一个函数来解决一组特定的值并返回一个答案(而不是直接更新全局变量),那么您可以通过调用该函数并检查返回值来为特定案例编写单元测试。对于一些非常基本的情况(y =常数,y = x,y = -x ^ 2)这样做会快速指示错误的来源,因为系数的值显然是正确的或错误的。像这样的代码需要从简单到复杂的构建。我曾经认为如果我能够在顶部潜水并获得正确的数字代码,我就很聪明。现在我意识到我的愚蠢。
关于在上述声明中进行的解决;因为你正在求解3个系数(给出xone
)并给出3 x,y对,所以完全有可能进行秩-3矩阵求逆以得到系数。为此,可以使用代码示例,库等。将此重新构造为矩阵求逆也解开了围绕这种反转的数学,特别是答案不可知的输入组合 - 例如,你的分母项为零,或者firstx为零,你的分子和分母都是无限......换句话说,利用已经完成的大量工作来使你的解决方案真正合适。