我的数学方程式求解程序有错误吗

本文关键字:程序 有错误 方程式 我的 | 更新日期: 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&amp<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

你可以更深入地研究复数,找到具有虚数单位的结果。