関数eqsol2 マニュアル

(The documentation of function eqsol2)

Last Update: 2021/11/30


◆機能・用途(Purpose)

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\).