我应该在matlab的代码中添加什么条件,以便使用这些公式得到二次方的精确解:
x1=(-2*c)/(b+sqrt(b^2-4*a*c))
x2=(-2*c)/(b-sqrt(b^2-4*a*c))
直接实施这些公式我在某些情况下没有得到正确的解决方案x^2-1000001x+1
非常感谢您的帮助
答案 0 :(得分:1)
正确的公式集是
w = b+sign(b)*sqrt(b^2-4*a*c)
x1 = -w/(2*a)
x2 = -(2*c)/w
其中,如果b> = 0,则符号(b)= 1,如果b <0,则符号(b)= - 1。
您的公式以及标准公式导致b的一个根中的灾难性取消是大的wrt。 a和c。
如果你想走极端,你也可以防止在平方根下计算术语的过度和下溢。
设m表示| a |,| b |的最大大小和| c |,例如浮点表示中指数的最大值,或者它们的绝对值......然后
w = b+sign(b)*m*sqrt( (b/m)*(b/m)-4*(a/m)*(c/m) )
在根之下的术语在-10到10之间。如果这个术语为零,那么这不是由于下溢造成的。
答案 1 :(得分:0)
您正在使用matlab处理浮点运算,因此无法保证精确的解决方案。 (即,当您插入原始二次方程时,每个浮点值都可能导致舍入误差,给出非零答案)。检查是否找到浮点方程的解决方案的更好方法是使用公差,并检查答案的绝对值是否小于公差。