Дано квадратное уравнение ax^2+bx+c=0 с параметрами, заданными интервально: a в (0,1], b в [-2,2], c в [-1,1]. Какие стратегии численного нахождения корней обеспечат устойчивость и как оценить погрешности
Кратко — устойчивые стратегии, алгоритм и оценка погрешности. 1) Устойчивый численный алгоритм (однопроходный, избегает катастрофического вычитания) - Вычислить дискриминант и его корень: D=b2−4ac,D=sqrt(D) (в комплексной области при D<0).
D=b^2-4ac,\qquad \sqrt D=\mathrm{sqrt}(D)\ (\text{в комплексной области при }D<0). D=b2−4ac,D=sqrt(D)(вкомплекснойобластиприD<0).
- Выбрать знак так, чтобы избежать вычитания близких по модулю чисел: q=−12(b+sign(b)D),(при b=0 sign(b):=1).
q=-\tfrac12\bigl(b+\operatorname{sign}(b)\sqrt D\bigr),\qquad \text{(при }b=0\ \operatorname{sign}(b):=1). q=−21(b+sign(b)D),(приb=0sign(b):=1).
Тогда корни вычисляются как r1=qa,r2=cq.
r_1=\frac{q}{a},\qquad r_2=\frac{c}{q}. r1=aq,r2=qc.
Если q=0q=0q=0 (двойной корень), взять r=−b2ar=-\tfrac b{2a}r=−2ab. Пояснение: формула через qqq эквивалентна классическому (−b±D)/(2a)( -b\pm\sqrt D)/(2a)(−b±D)/(2a), но устраняет потерю значащих цифр при вычитании большого близких по модулю слагаемых. 2) Нюансы масштабирования и точности - Нормализация на aaa (приведение к моническому многочлену x2+(b/a)x+(c/a)=0x^2+(b/a)x+(c/a)=0x2+(b/a)x+(c/a)=0) снижает число операций, но при очень малых aaa (в интервале (0,1](0,1](0,1]aaa может быть очень мала) деление усиливает погрешности. Если aaa не чрезмерно мало — нормализация допустима; при малых aaa лучше вычислять без предварительного умножения/деления, использовать удвоенную точность или компенсированные операции (FMA). - Для комплексных корней применяют ту же схему с комплексными sqrt и sign. 3) Оценка погрешностей (линейная аппроксимация) - Для малого приращения коэффициентов Δa,Δb,Δc\Delta a,\Delta b,\Delta cΔa,Δb,Δc линейная аппроксимация изменения корня rrr даёт Δr≈−r2Δa+rΔb+Δc2ar+b,
\Delta r\approx -\frac{r^2\Delta a + r\Delta b + \Delta c}{2ar+b}, Δr≈−2ar+br2Δa+rΔb+Δc,
поэтому абсолютная оценка ∣Δr∣≤∣r∣2∣Δa∣+∣r∣ ∣Δb∣+∣Δc∣∣2ar+b∣.
|\Delta r|\le\frac{|r|^2|\Delta a|+|r|\,|\Delta b|+|\Delta c|}{|2ar+b|}. ∣Δr∣≤∣2ar+b∣∣r∣2∣Δa∣+∣r∣∣Δb∣+∣Δc∣.
Для относительных возмущений коэффициентов можно перейти к соответствующим формам (подставить Δa=aδa\Delta a=a\delta aΔa=aδa и т.д.). - Оценка через обусловленность (приближённо): если вычисления имеют относительную ошибку порядка машинного эпсилон ε\varepsilonε, то ∣Δr∣≲κ(r) ε,
|\Delta r|\lesssim \kappa(r)\,\varepsilon, ∣Δr∣≲κ(r)ε,
где приближённая обусловленность κ(r)≈∣a∣∣r∣2+∣b∣∣r∣+∣c∣∣2ar+b∣.
\kappa(r)\approx\frac{|a||r|^2+|b||r|+|c|}{|2ar+b|}. κ(r)≈∣2ar+b∣∣a∣∣r∣2+∣b∣∣r∣+∣c∣.
Это даёт оценку прямой погрешности через известное относительное погрешности коэффициентов/вычислений. 4) Практические рекомендации для данного интервала a∈(0,1], b∈[−2,2], c∈[−1,1]a\in(0,1],\ b\in[-2,2],\ c\in[-1,1]a∈(0,1],b∈[−2,2],c∈[−1,1]
- Всегда использовать формулу с qqq для минимизации потерь значащих цифр. - Вычислять b2b^2b2 и 4ac4ac4ac с FMA, если доступно, чтобы уменьшить погрешность дискриминанта. - При очень малом ∣2ar+b∣|2ar+b|∣2ar+b∣ (производная многочлена близка к нулю в корне) корень плохо обусловлен — требуется увеличение точности (quad, long double) или метод интервальной арифметики для гарантированных границ. - Для гарантированных интервалов корней применять интервальную арифметику (outward rounding) или методы Кравчик/интервальный Ньютона: сначала получать численное приближение устойчивым алгоритмом, затем уточнять и контролировать радиусы интервалов. 5) Итоговая схема устойчивого вычисления и оценки - Вычислить D=b2−4acD=b^2-4acD=b2−4ac (FMA), D\sqrt DD. - Найти q=−12(b+sign(b)D)q=-\tfrac12(b+\operatorname{sign}(b)\sqrt D)q=−21(b+sign(b)D), затем r1=q/a, r2=c/qr_1=q/a,\ r_2=c/qr1=q/a,r2=c/q (обработать случаи q=0q=0q=0 и комплексные D\sqrt DD). - Оценить чувствительность по формуле ∣Δr∣≤∣r∣2∣Δa∣+∣r∣ ∣Δb∣+∣Δc∣∣2ar+b∣
|\Delta r|\le\frac{|r|^2|\Delta a|+|r|\,|\Delta b|+|\Delta c|}{|2ar+b|} ∣Δr∣≤∣2ar+b∣∣r∣2∣Δa∣+∣r∣∣Δb∣+∣Δc∣
и/или использовать κ(r)ε\kappa(r)\varepsilonκ(r)ε с κ\kappaκ выше, где ε\varepsilonε — машинный эпсилон или оценка относительной ошибки вычислений. - При плохой обусловленности увеличить точность или применить интервальную арифметику. Этого достаточно, чтобы надёжно получать корни для заданных интервалов коэффициентов и оценивать их погрешности.
1) Устойчивый численный алгоритм (однопроходный, избегает катастрофического вычитания)
- Вычислить дискриминант и его корень:
D=b2−4ac,D=sqrt(D) (в комплексной области при D<0). D=b^2-4ac,\qquad \sqrt D=\mathrm{sqrt}(D)\ (\text{в комплексной области при }D<0).
D=b2−4ac,D =sqrt(D) (в комплексной области при D<0). - Выбрать знак так, чтобы избежать вычитания близких по модулю чисел:
q=−12(b+sign(b)D),(при b=0 sign(b):=1). q=-\tfrac12\bigl(b+\operatorname{sign}(b)\sqrt D\bigr),\qquad \text{(при }b=0\ \operatorname{sign}(b):=1).
q=−21 (b+sign(b)D ),(при b=0 sign(b):=1). Тогда корни вычисляются как
r1=qa,r2=cq. r_1=\frac{q}{a},\qquad r_2=\frac{c}{q}.
r1 =aq ,r2 =qc . Если q=0q=0q=0 (двойной корень), взять r=−b2ar=-\tfrac b{2a}r=−2ab .
Пояснение: формула через qqq эквивалентна классическому (−b±D)/(2a)( -b\pm\sqrt D)/(2a)(−b±D )/(2a), но устраняет потерю значащих цифр при вычитании большого близких по модулю слагаемых.
2) Нюансы масштабирования и точности
- Нормализация на aaa (приведение к моническому многочлену x2+(b/a)x+(c/a)=0x^2+(b/a)x+(c/a)=0x2+(b/a)x+(c/a)=0) снижает число операций, но при очень малых aaa (в интервале (0,1](0,1](0,1] aaa может быть очень мала) деление усиливает погрешности. Если aaa не чрезмерно мало — нормализация допустима; при малых aaa лучше вычислять без предварительного умножения/деления, использовать удвоенную точность или компенсированные операции (FMA).
- Для комплексных корней применяют ту же схему с комплексными sqrt и sign.
3) Оценка погрешностей (линейная аппроксимация)
- Для малого приращения коэффициентов Δa,Δb,Δc\Delta a,\Delta b,\Delta cΔa,Δb,Δc линейная аппроксимация изменения корня rrr даёт
Δr≈−r2Δa+rΔb+Δc2ar+b, \Delta r\approx -\frac{r^2\Delta a + r\Delta b + \Delta c}{2ar+b},
Δr≈−2ar+br2Δa+rΔb+Δc , поэтому абсолютная оценка
∣Δr∣≤∣r∣2∣Δa∣+∣r∣ ∣Δb∣+∣Δc∣∣2ar+b∣. |\Delta r|\le\frac{|r|^2|\Delta a|+|r|\,|\Delta b|+|\Delta c|}{|2ar+b|}.
∣Δr∣≤∣2ar+b∣∣r∣2∣Δa∣+∣r∣∣Δb∣+∣Δc∣ . Для относительных возмущений коэффициентов можно перейти к соответствующим формам (подставить Δa=aδa\Delta a=a\delta aΔa=aδa и т.д.).
- Оценка через обусловленность (приближённо): если вычисления имеют относительную ошибку порядка машинного эпсилон ε\varepsilonε, то
∣Δr∣≲κ(r) ε, |\Delta r|\lesssim \kappa(r)\,\varepsilon,
∣Δr∣≲κ(r)ε, где приближённая обусловленность
κ(r)≈∣a∣∣r∣2+∣b∣∣r∣+∣c∣∣2ar+b∣. \kappa(r)\approx\frac{|a||r|^2+|b||r|+|c|}{|2ar+b|}.
κ(r)≈∣2ar+b∣∣a∣∣r∣2+∣b∣∣r∣+∣c∣ . Это даёт оценку прямой погрешности через известное относительное погрешности коэффициентов/вычислений.
4) Практические рекомендации для данного интервала a∈(0,1], b∈[−2,2], c∈[−1,1]a\in(0,1],\ b\in[-2,2],\ c\in[-1,1]a∈(0,1], b∈[−2,2], c∈[−1,1] - Всегда использовать формулу с qqq для минимизации потерь значащих цифр.
- Вычислять b2b^2b2 и 4ac4ac4ac с FMA, если доступно, чтобы уменьшить погрешность дискриминанта.
- При очень малом ∣2ar+b∣|2ar+b|∣2ar+b∣ (производная многочлена близка к нулю в корне) корень плохо обусловлен — требуется увеличение точности (quad, long double) или метод интервальной арифметики для гарантированных границ.
- Для гарантированных интервалов корней применять интервальную арифметику (outward rounding) или методы Кравчик/интервальный Ньютона: сначала получать численное приближение устойчивым алгоритмом, затем уточнять и контролировать радиусы интервалов.
5) Итоговая схема устойчивого вычисления и оценки
- Вычислить D=b2−4acD=b^2-4acD=b2−4ac (FMA), D\sqrt DD .
- Найти q=−12(b+sign(b)D)q=-\tfrac12(b+\operatorname{sign}(b)\sqrt D)q=−21 (b+sign(b)D ), затем r1=q/a, r2=c/qr_1=q/a,\ r_2=c/qr1 =q/a, r2 =c/q (обработать случаи q=0q=0q=0 и комплексные D\sqrt DD ).
- Оценить чувствительность по формуле
∣Δr∣≤∣r∣2∣Δa∣+∣r∣ ∣Δb∣+∣Δc∣∣2ar+b∣ |\Delta r|\le\frac{|r|^2|\Delta a|+|r|\,|\Delta b|+|\Delta c|}{|2ar+b|}
∣Δr∣≤∣2ar+b∣∣r∣2∣Δa∣+∣r∣∣Δb∣+∣Δc∣ и/или использовать κ(r)ε\kappa(r)\varepsilonκ(r)ε с κ\kappaκ выше, где ε\varepsilonε — машинный эпсилон или оценка относительной ошибки вычислений.
- При плохой обусловленности увеличить точность или применить интервальную арифметику.
Этого достаточно, чтобы надёжно получать корни для заданных интервалов коэффициентов и оценивать их погрешности.