2次方程式
\[\begin{equation}
ax^2+bx+c=0 \hspace{1em} (a\neq 0)
\label{eq.problem}
\end{equation}\]
の解を求める。
Calculate the solution of a quadratic equation (\ref{eq.problem}).
◆形式(Format)
#include <equation.h>
inline struct im ∗eqsol2
(const double a,const double b,const double c)
◆引数(Arguments)
a
\(x^2\)の係数。
The coefficient of \(x^2\).
b
\(x\)の係数。
The coefficient of \(x\).
c
方程式の定数項。
The constant term of the equation.
◆戻り値(Return value)
2次方程式(\ref{eq.problem})の2つの解(複素数)を並べた配列を関数内で作成し、
その先頭アドレスを返す。
The first address of an array created in this function
which consists of the two solutions (complex numbers)
of eq. (\ref{eq.problem}).
◆使用例(Example)
struct im ∗solution=eqsol2(1.2,3.4,5.6);
◆計算式とアルゴリズム
(Formula and algorithm)
1. \(a=0\)の判定と処理
(Judgement and processings for \(a=0\))
\(a=0\)のときは1次方程式として解くことも可能であるが、
気づかず意図しない結果を生じるのを防ぐために
\(a=0\)の場合はエラー終了する仕様にしている。
Although it is possible to solve a linear equation
in case of \(a=0\),
this function treats \(a=0\) as an error
to avoid obtaining unexpected results without awaring it.
\(a=0\)であるか否かの判定には関数doublecmpを使用し、
\(a\)と\(\max\{|b|,|c|\}\)の比較によって判定している。
Function doublecmp is used for the judgement of \(a=0\),
where \(a\) is compared with \(\max\{|b|,|c|\}\).
2. \(a\neq 0\)のときの解
(Solution in case of \(a \neq 0\))
判別式\(D \equiv b^2-4ac\)の値に応じて場合分けするのが本来の解き方であるが、
\(D\)が非常に0に近い場合の丸め誤差による数値的不安定を回避するために
場合分けを避けて統一的な扱いをしている。
まず
\[\begin{equation}
D=r e^{i\theta} \hspace{1em} (r \geq 0, -\pi < \theta \leq \pi)
\label{eq.D.r_theta}
\end{equation}\]
を満たす\(r\)と\(\theta\)を求める(これには関数imabs,imargを利用する)。
これらの値を用いて解は
\[\begin{equation}
x_1 = \frac{-b+\sqrt{r} e^{i\theta/2}}{2a}
\label{eq.x1}
\end{equation}\]
\[\begin{equation}
x_2 = \frac{-b+\sqrt{r} e^{i(\theta/2+\pi)}}{2a}
\label{eq.x2}
\end{equation}\]
と書ける。これは\(D\)の符号によらない統一的な解の表現である。
This function avoids case-by-case approaches
using a discriminant \(D \equiv b^2-4ac\),
since it may be unstable due to rounding errors
when \(D\) is very close to zero.
Instead, the following approach is adopted.
First, \(r\) and \(\theta\) which satisfies (\ref{eq.D.r_theta})
are obtained using functions imabs and imarg.
Then the two solutions are expressed by eqs (\ref{eq.x1}) and (\ref{eq.x2})
regardless of the sign of \(D\).