我的数学方程式求解程序有错误吗
本文关键字:程序 有错误 方程式 我的 | 更新日期: 2023-09-27 18:28:47
我写了一个简单的程序来解决数学问题:
A^2+B^2 = 12
A*B = 9
(A+B)^2 = y
我的程序从0.000000001
开始循环遍历每个数字,并检查第一个方程是否为真(第二个方程总是为真,因为我总是指定双B = 9 / A
)。
然后它写下结果并暂停。这需要很长时间才能运行,因为它做了很多数学运算,我想知道我是否犯了任何错误,这样我就可以纠正它们了?这是我的代码:
namespace AnnoyingMath1
{
class Program
{
static void Main(string[] args)
{
for (double a = 0.00000001; a < 9; a += 0.00000001) {
double b = 9 / a;
if (Math.Pow(a, 2) + Math.Pow(b, 2) == 12)
{
if (a * b == 9) // always true because b = 9 / a
{
Console.WriteLine("SUCCESS! a = " + a.ToString() + ", b = " + b.ToString() + ", y = (a+b)^2 = " + (Math.Pow(a + b, 2)).ToString() );
Console.ReadLine();
}
}
else {
Console.WriteLine("fail1 " + a.ToString() + " , " + b.ToString());
}
}
}
}
}
是。确实如此。
语句,例如:
if (a * b == 9) // always true because b = 9 / a WRONG, because you are dealing with floating point
不正确。
切勿直接比较浮点值。使用delta:
epsilon = 0.000001
if (Abs(a*b - 9) <= epsilon )
StackOverflow上还有许多类似的问题。
请阅读每一位计算机科学家应该知道的关于浮点运算的知识
您可能需要检查"足够接近"的答案,因为无法保证您会得到一个很好的整数。因此,与其检查(VAL)==12,不如检查(VAL>11.9M&<12.1M。同样,为什么不尝试某种收敛方法,而不是循环遍历每个数字呢?
由于您提到无法手动解决此问题。。。
y = (a+b)^2
= a^2 + 2ab + b^2
= (a^2 + b^2) + 2 * ab
= 12 + 2 * 9
= 30
在代数问题上使用暴力从来都不是正确的方法。
(我本来打算在评论中添加这一点,因为我意识到SO不是数学作业帮助的地方,但格式很不稳定。)
我认为使用这种算法不会找到答案,即使在比较时使用delta也是如此。在实数中没有这个方程的结果:
A + B = 9
A^2 + B^2 = 12
B = 9 / A
A^2 + (9 / A)^2 = 12
经过一些变换和T=A^2:
T^2 - 12T + 81 = 0
Delta = 144 - 4 * 81 < 0
你可以更深入地研究复数,找到具有虚数单位的结果。