Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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#_Math_Console - Fatal编程技术网

C# 我解数学方程的程序有错误吗?

C# 我解数学方程的程序有错误吗?,c#,math,console,C#,Math,Console,我写了一个简单的程序来解决这个数学问题: A^2+B^2 = 12 A*B = 9 (A+B)^2 = y 我的程序从0.00000000 1开始循环遍历每个数字,并检查第一个等式是否为真(第二个等式始终为真,因为我总是指定doubleB=9/A) 然后它写入结果并暂停。这是永远运行,因为它做了很多数学,我想知道如果我犯了任何错误,所以我可以纠正他们?这是我的密码: namespace AnnoyingMath1 { class Program { static

我写了一个简单的程序来解决这个数学问题:

A^2+B^2 = 12
A*B = 9
(A+B)^2 = y
我的程序从
0.00000000 1
开始循环遍历每个数字,并检查第一个等式是否为真(第二个等式始终为真,因为我总是指定double
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());
                }
            }
        }
    }
}
namespace烦扰Math1
{
班级计划
{
静态void Main(字符串[]参数)
{
对于(双a=0.00000001;a<9;a+=0.00000001){
双b=9/a;
如果(数学功率(a,2)+数学功率(b,2)==12)
{
if(a*b==9)//始终为真,因为b=9/a
{
Console.WriteLine(“SUCCESS!a=“+a.ToString()+”,b=“+b.ToString()+”,y=(a+b)^2=“+(Math.Pow(a+b,2)).ToString());
Console.ReadLine();
}
}
否则{
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
这是不正确的

切勿直接比较浮点值。改为使用三角形:

epsilon = 0.000001
if (Abs(a*b - 9) <= epsilon )
epsilon=0.000001

如果(Abs(a*b-9)你可能想要检查“足够接近”的答案,因为不能保证你会得到一个好的整数。因此,与其检查(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
在代数问题上使用暴力从来都不是正确的方法


(我意识到这不是数学家庭作业帮助的地方,但格式很不稳定。)

我认为使用这种算法,即使在比较时使用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
T^2-12T+81=0
Delta=144-4*81<0

你可以用虚单位进一步查找结果。

不,这是一个数学问题,我似乎无法通过讲义来解决。主题:我不建议使用计算机程序来强行解决这样的问题,因为你以后不能再做类似的问题。@DMan我自己已经得到了答案(尽管它是错误的)我的朋友也得到了一个答案,我们的答案是给y的,我们中的其他人可以找到a和b,我不需要在以后解决类似的问题,因为我在八年级,我们甚至还没有学过这种代数。啊,好的,谢谢,我必须把它放在if语句之外的任何地方吗?只是在比较等式的值时,建议你看在@nightshift的回答中,我能用数学吗?只是想知道,在第2行,+2ab是从哪里来的?因为这是我的朋友用手做的+1得到的。单用代数解比迭代浮点解要好。因为它回答了你真正想要回答的问题,而不是你实际问到的问题。你是如何从第3行到第4行的?蛮力是n方法是这样的,但也不是随机给变量赋值:-)我有两个方程,我必须找到a和b,我应该指定,而不是找到y。所以如果两个方程都是真的,我必须找出a和b是什么。@pax从OP得到了值!我在八年级,所以你在第二个盒子里把我弄丢了,但是你的意思是,我不可能找到a和b的值?