算法二次方程MATLAB

时间:2014-03-14 19:58:02

标签: algorithm matlab equation numerical-methods numerical-analysis

我应该在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

非常感谢您的帮助

2 个答案:

答案 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处理浮点运算,因此无法保证精确的解决方案。 (即,当您插入原始二次方程时,每个浮点值都可能导致舍入误差,给出非零答案)。检查是否找到浮点方程的解决方案的更好方法是使用公差,并检查答案的绝对值是否小于公差。