disp(x disp(x r p ql) el-abs(x-r).c2-abs( disp('e e3') disp(el e2 e31) subplot(22 1)plot(0:10el'd') subplot(22.2)plot(0:10.e2+) subplox(2.2.3):10.3. 从上面的计算可 看到,初始误差通常通过一系列的计算进行传播。对于任何数值计算而言 都要尽量减少初始误差,因为初始条件下的小误差对最终结果产生的影响较小。另外,不同 的计算方法导致的误差也不同,要选择合适的方法进行计算。 设a≠0,b2-4ac>0,则一元二次方程a2+bx+c=0有两种等价的求根公式如 下: i)bac =b-1B-4ac 2a 2a _2 -2n 的= +B-4ac5 b-b2-4ac 当b2》4ac即bl≈V万2一4ac时,上述两组公式总会存在“相近数相减”的运算,从 而导致精度损失。所以在这种情况下应该重新构造合适的求根公式。利用上述两组 公式,构造出求解x和?的适当公式,设计算法,编写MATLAB程序,并计算下 列二次方程的根。 a)x2-1000.001x+1=0 b)x2-1000000.000001x+1=0 用公式)、以公式i)、自编程序和Matlab自带的求多项式的根的函数roots求解上述 方程的根,比较结果。 为防止出现“相近数相减的运算,关键在于正确处理b和vD2一4之间的运算,只 要让它们同号(相加)就可以了。所以重新构造如下求根公式: xb-sign(b)-4ac 2a 程序代码: function naquadeq(a.b.c) Solve a Unary quadraticequ %Input -a,b.c are the coefficients of the equation by descending order Output -x is a vector involving the roots if (a=0)(b2-4*a*c<-0).retum.end xl=(-b-sign(b)*sqrt(b24*a*c)Y(2*a): x2-/a'xl) x=(xl.x2] 公式 公式前 自编函数 rootsi函数 a)x=1.0e+03· x=l.0e+03* x=1.0e+03· 3ns=1.0e+03 disp('x r p q') disp([x r p q]) e1=abs(x-r); e2=abs(x-p); e3=abs(x-q); disp('e1 e2 e3') disp([e1 e2 e3]) subplot(2,2,1),plot(0:10,e1,'d') subplot(2,2,2),plot(0:10,e2,'+') subplot(2,2,3),plot(0:10,e3,'*') 从上面的计算可以看到,初始误差通常通过一系列的计算进行传播。对于任何数值计算而言, 都要尽量减少初始误差,因为初始条件下的小误差对最终结果产生的影响较小。另外,不同 的计算方法导致的误差也不同,要选择合适的方法进行计算。 3. 设a ≠ 0, 𝑏 2 − 4𝑎𝑐 > 0,则一元二次方程 2 ax bx c + + = 0 有两种等价的求根公式如 下: i) 2 2 1 2 4 4 , 2 2 b b ac b b ac x x a a − + − − − − = = ii) 1 2 2 2 2 2 , 4 4 c c x x b b ac b b ac − − = = + − − − 当𝑏 2 ≫ 4𝑎𝑐即|𝑏| ≈ √𝑏 2 − 4𝑎𝑐时,上述两组公式总会存在“相近数相减”的运算,从 而导致精度损失。所以在这种情况下应该重新构造合适的求根公式。利用上述两组 公式,构造出求解 x1 和 x2 的适当公式,设计算法,编写 MATLAB 程序,并计算下 列二次方程的根。 a) x 2 -1000.001x+1=0; b) x 2 -1000000.000001x+1=0 用公式 i)、公式 ii)、自编程序和 Matlab 自带的求多项式的根的函数 roots 求解上述 方程的根,比较结果。 为防止出现“相近数相减”的运算,关键在于正确处理 b 和√𝑏 2 − 4𝑎𝑐之间的运算,只 要让它们同号(相加)就可以了。所以重新构造如下求根公式: 2 1 2 1 sign( ) 4 , 2 b b b ac c x x a ax − − − = = 程序代码: function x=unaquadeq(a,b,c) % Solve a Unary quadratic equation % Input - a, b, c are the coefficients of the equation by descending order % Output - x is a vector involving the roots if (a==0)|(b^2-4*a*c<=0), return, end x1=(-b-sign(b)*sqrt(b^2-4*a*c))/(2*a); x2=c/(a*x1); x=[x1,x2]; 公式i) 公式ii) 自编函数 roots函数 a) x =1.0e+03 * x =1.0e+03 * x =1.0e+03 * ans =1.0e+03 *