[C言語] 虚数解を含む二次方程式を計算する方法

C言語で虚数解を含む二次方程式を計算するには、判別式(\(\Delta = b^2 – 4ac\))を用います。

判別式が負の場合、虚数解が存在します。

この場合、平方根を計算する際に標準ライブラリmath.hsqrt関数を使用しますが、負の数の平方根は直接計算できないため、虚数部分を手動で処理します。

具体的には、虚数単位 \(i\) を用いて、実部と虚部を分けて計算します。

この記事でわかること
  • 二次方程式の解法に関する知識
  • 判別式の計算と解の分類
  • 実数解と虚数解の求め方
  • 複素数ライブラリの活用方法
  • ユーザー入力に基づくプログラムの実装

目次から探す

二次方程式の基礎知識

二次方程式の一般形

二次方程式は、次のような形で表されます。

\[ax^2 + bx + c = 0\]

ここで、\(a\)、\(b\)、\(c\)は定数で、\(a \neq 0\)です。

\(x\)は未知数で、二次方程式の解を求める対象となります。

二次方程式は、グラフで表すと放物線の形をしています。

判別式とは何か

判別式は、二次方程式の解の性質を判断するための指標です。

判別式は次のように定義されます。

\[D = b^2 – 4ac\]

ここで、\(D\)は判別式、\(a\)、\(b\)、\(c\)は二次方程式の係数です。

判別式の値によって、解の種類が決まります。

判別式による解の分類

判別式の値に応じて、二次方程式の解は以下のように分類されます。

スクロールできます
判別式の値 \(D\)解の種類解の数
\(D > 0\)異なる実数解が2つ2つ
\(D = 0\)重解(重複した実数解)1つ
\(D < 0\)虚数解が2つ2つ

このように、判別式を用いることで、二次方程式の解の性質を簡単に判断することができます。

C言語での二次方程式の解法

標準ライブラリmath.hの利用

C言語では、数学的な計算を行うために標準ライブラリmath.hを使用します。

このライブラリには、平方根を計算するための関数sqrt()が含まれています。

二次方程式の解を求める際に、判別式の平方根を計算するために必要です。

以下は、math.hを使用するためのインクルード文です。

#include <math.h>  // 数学関数を使用するためのライブラリ

実数解の場合の処理

判別式が0以上の場合、二次方程式は実数解を持ちます。

実数解を求めるためには、次の式を使用します。

\[x_1 = \frac{-b + \sqrt{D}}{2a}, \quad x_2 = \frac{-b – \sqrt{D}}{2a}\]

ここで、\(D\)は判別式です。

以下は、実数解を求めるC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, x1, x2;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 実数解の場合の処理
    if (D >= 0) {
        x1 = (-b + sqrt(D)) / (2 * a);  // 第一解
        x2 = (-b - sqrt(D)) / (2 * a);  // 第二解
        printf("実数解: x1 = %.2f, x2 = %.2f\n", x1, x2);
    } else {
        printf("実数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 -3 2
実数解: x1 = 2.00, x2 = 1.00

虚数解の場合の処理

判別式が負の場合、二次方程式は虚数解を持ちます。

虚数解を求めるためには、次の式を使用します。

\[x_1 = \frac{-b}{2a} + \frac{\sqrt{-D}}{2a}i, \quad x_2 = \frac{-b}{2a} – \frac{\sqrt{-D}}{2a}i\]

ここで、\(i\)は虚数単位です。

以下は、虚数解を求めるC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, realPart, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 虚数解の場合の処理
    if (D < 0) {
        realPart = -b / (2 * a);  // 実部
        imagPart = sqrt(-D) / (2 * a);  // 虚部
        printf("虚数解: x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", realPart, imagPart, realPart, imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
虚数解: x1 = -1.00 + 2.00i, x2 = -1.00 - 2.00i

このように、判別式の値に応じて実数解または虚数解を求めることができます。

虚数解を含む二次方程式の計算方法

判別式が負の場合の処理

判別式が負の場合、二次方程式は虚数解を持ちます。

この場合、判別式の計算結果を用いて、虚数解を求めるための準備を行います。

判別式は次のように計算されます。

\[D = b^2 – 4ac\]

判別式が負であることを確認した後、虚数解を求めるための計算に進みます。

以下は、判別式が負であることを確認するC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 判別式が負の場合の処理
    if (D < 0) {
        printf("判別式が負です。虚数解を計算します。\n");
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
判別式が負です。虚数解を計算します。

虚数部分の計算方法

虚数解を求めるためには、判別式が負であることを確認した後、虚数部分を計算します。

虚数部分は次の式で求められます。

\[\text{虚数部分} = \frac{\sqrt{-D}}{2a}\]

ここで、\(-D\)の平方根を計算するために、sqrt()関数を使用します。

以下は、虚数部分を計算するC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 判別式が負の場合の処理
    if (D < 0) {
        imagPart = sqrt(-D) / (2 * a);  // 虚数部分の計算
        printf("虚数部分: %.2f\n", imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
虚数部分: 2.00

実部と虚部の分離

虚数解を求める際には、実部と虚部を分離して計算します。

実部は次の式で求められます。

\[\text{実部} = \frac{-b}{2a}\]

この実部と先に計算した虚数部分を組み合わせて、虚数解を表現します。

以下は、実部と虚部を分離して計算するC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, realPart, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 判別式が負の場合の処理
    if (D < 0) {
        realPart = -b / (2 * a);  // 実部の計算
        imagPart = sqrt(-D) / (2 * a);  // 虚部の計算
        printf("実部: %.2f, 虚部: %.2f\n", realPart, imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
実部: -1.00, 虚部: 2.00

虚数解の出力方法

実部と虚部を計算した後、虚数解を適切に出力します。

虚数解は次の形式で表示します。

\[x_1 = \text{実部} + \text{虚部}i, \quad x_2 = \text{実部} – \text{虚部}i\]

以下は、虚数解を出力するC言語のサンプルコードです。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, realPart, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 判別式が負の場合の処理
    if (D < 0) {
        realPart = -b / (2 * a);  // 実部の計算
        imagPart = sqrt(-D) / (2 * a);  // 虚部の計算
        printf("虚数解: x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", realPart, imagPart, realPart, imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
虚数解: x1 = -1.00 + 2.00i, x2 = -1.00 - 2.00i

このように、虚数解を求めるための一連の計算を行い、結果を出力することができます。

C言語での具体的な実装例

判別式の計算

判別式を計算するためのC言語の実装例を示します。

判別式は、二次方程式の解の性質を判断するために使用されます。

以下のコードでは、ユーザーから係数を入力し、判別式を計算して出力します。

#include <stdio.h>
int main() {
    double a, b, c, D;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 判別式の出力
    printf("判別式 D = %.2f\n", D);
    
    return 0;
}
係数a, b, cを入力してください: 1 -3 2
判別式 D = 1.00

実数解の計算例

次に、判別式が0以上の場合の実数解を計算するC言語の実装例を示します。

判別式を計算した後、実数解を求めて出力します。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, x1, x2;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 実数解の場合の処理
    if (D >= 0) {
        x1 = (-b + sqrt(D)) / (2 * a);  // 第一解
        x2 = (-b - sqrt(D)) / (2 * a);  // 第二解
        printf("実数解: x1 = %.2f, x2 = %.2f\n", x1, x2);
    } else {
        printf("実数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 -3 2
実数解: x1 = 2.00, x2 = 1.00

虚数解の計算例

次に、判別式が負の場合の虚数解を計算するC言語の実装例を示します。

判別式を計算した後、虚数解を求めて出力します。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, realPart, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 虚数解の場合の処理
    if (D < 0) {
        realPart = -b / (2 * a);  // 実部の計算
        imagPart = sqrt(-D) / (2 * a);  // 虚部の計算
        printf("虚数解: x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", realPart, imagPart, realPart, imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
虚数解: x1 = -1.00 + 2.00i, x2 = -1.00 - 2.00i

虚数解を含む場合の出力フォーマット

虚数解を含む場合の出力フォーマットは、実部と虚部を分けて表示することが重要です。

以下のコードは、実部と虚部を計算し、適切なフォーマットで出力する例です。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, realPart, imagPart;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 虚数解の場合の処理
    if (D < 0) {
        realPart = -b / (2 * a);  // 実部の計算
        imagPart = sqrt(-D) / (2 * a);  // 虚部の計算
        printf("虚数解: x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", realPart, imagPart, realPart, imagPart);
    } else {
        printf("虚数解は存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
虚数解: x1 = -1.00 + 2.00i, x2 = -1.00 - 2.00i

このように、C言語を用いて二次方程式の判別式の計算、実数解および虚数解の計算を行い、結果を適切に出力することができます。

応用例

複素数ライブラリを使った実装

C言語では、複素数を扱うためのライブラリが標準で用意されています。

complex.hを使用することで、複素数の計算を簡単に行うことができます。

以下は、複素数ライブラリを使って二次方程式を解く例です。

#include <stdio.h>
#include <math.h>      // 数学関数を使用するためのライブラリ
#include <complex.h>   // 複素数を扱うためのライブラリ
int main() {
    double a, b, c;
    double complex x1, x2;  // 複素数型の変数を宣言
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    double D = b * b - 4 * a * c;
    
    // 虚数解の場合の処理
    x1 = (-b + csqrt(D)) / (2 * a);  // 第一解
    x2 = (-b - csqrt(D)) / (2 * a);  // 第二解
    
    // 解の出力
    printf("解: x1 = %.2f + %.2fi, x2 = %.2f + %.2fi\n", creal(x1), cimag(x1), creal(x2), cimag(x2));
    
    return 0;
}
係数a, b, cを入力してください: 1 2 5
解: x1 = -1.00 + 2.00i, x2 = -1.00 - 2.00i

複数の二次方程式を一度に解く方法

複数の二次方程式を一度に解くためには、配列を使用して係数を管理し、ループを用いて各方程式を解くことができます。

以下は、3つの二次方程式を解く例です。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a[3], b[3], c[3];  // 係数の配列
    double D, x1, x2;
    
    // 3つの二次方程式の係数を入力
    for (int i = 0; i < 3; i++) {
        printf("方程式 %d の係数a, b, cを入力してください: ", i + 1);
        scanf("%lf %lf %lf", &a[i], &b[i], &c[i]);
    }
    
    // 各方程式を解く
    for (int i = 0; i < 3; i++) {
        D = b[i] * b[i] - 4 * a[i] * c[i];
        
        if (D >= 0) {
            x1 = (-b[i] + sqrt(D)) / (2 * a[i]);  // 第一解
            x2 = (-b[i] - sqrt(D)) / (2 * a[i]);  // 第二解
            printf("方程式 %d の実数解: x1 = %.2f, x2 = %.2f\n", i + 1, x1, x2);
        } else {
            printf("方程式 %d の虚数解: 存在しません。\n", i + 1);
        }
    }
    
    return 0;
}
方程式 1 の係数a, b, cを入力してください: 1 -3 2
方程式 1 の実数解: x1 = 2.00, x2 = 1.00
方程式 2 の係数a, b, cを入力してください: 1 2 5
方程式 2 の虚数解: 存在しません。
方程式 3 の係数a, b, cを入力してください: 1 4 4
方程式 3 の実数解: x1 = -2.00, x2 = -2.00

ユーザー入力に対応した二次方程式の解法プログラム

ユーザーからの入力に基づいて、任意の二次方程式を解くプログラムを作成することができます。

以下は、ユーザーが係数を入力し、解を求めるプログラムの例です。

#include <stdio.h>
#include <math.h>  // 数学関数を使用するためのライブラリ
int main() {
    double a, b, c, D, x1, x2;
    
    // 二次方程式の係数を入力
    printf("係数a, b, cを入力してください: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    
    // 判別式の計算
    D = b * b - 4 * a * c;
    
    // 解の計算
    if (D > 0) {
        x1 = (-b + sqrt(D)) / (2 * a);  // 第一解
        x2 = (-b - sqrt(D)) / (2 * a);  // 第二解
        printf("実数解: x1 = %.2f, x2 = %.2f\n", x1, x2);
    } else if (D == 0) {
        x1 = -b / (2 * a);  // 重解
        printf("重解: x = %.2f\n", x1);
    } else {
        printf("虚数解: 存在しません。\n");
    }
    
    return 0;
}
係数a, b, cを入力してください: 1 -4 4
重解: x = 2.00

このように、ユーザー入力に対応した二次方程式の解法プログラムを作成することで、さまざまな方程式を解くことができます。

よくある質問

虚数解を計算する際にエラーが出るのはなぜ?

虚数解を計算する際にエラーが出る主な原因は、判別式が負であるにもかかわらず、実数解を求める処理を行おうとした場合です。

C言語では、負の数の平方根を計算しようとすると、実行時エラーが発生します。

これを避けるためには、判別式を計算し、その値が負であることを確認してから虚数解の計算に進む必要があります。

また、sqrt()関数を使用する際には、引数が負でないことを確認することが重要です。

複素数ライブラリを使うメリットは?

複素数ライブラリを使用するメリットは、複素数の計算を簡単に行える点です。

complex.hライブラリを利用することで、複素数の加算、減算、乗算、除算、平方根などの演算を直感的に行うことができます。

これにより、複雑な計算を手動で行う必要がなくなり、コードがシンプルで読みやすくなります。

また、複素数の実部や虚部を簡単に取得できる関数creal()cimag()も提供されているため、結果の処理が容易になります。

判別式がゼロの場合はどう処理すればよい?

判別式がゼロの場合、二次方程式は重解を持ちます。

この場合、解は一つだけで、次の式で求められます。

\[x = \frac{-b}{2a}\]

この解を求める際には、判別式がゼロであることを確認し、その後に実部を計算して出力します。

以下は、判別式がゼロの場合の処理を行うC言語の例です。

if (D == 0) {
    x1 = -b / (2 * a);  // 重解の計算
    printf("重解: x = %.2f\n", x1);
}

このように、判別式がゼロの場合は特別な処理を行い、重解を正しく出力することが重要です。

まとめ

この記事では、C言語を用いて虚数解を含む二次方程式を計算する方法について詳しく解説しました。

二次方程式の基本的な知識から始まり、判別式の計算、実数解や虚数解の求め方、さらには複素数ライブラリの活用や複数の方程式を一度に解く方法まで幅広く取り上げました。

これを機に、実際にC言語で二次方程式を解くプログラムを作成してみることで、プログラミングスキルをさらに向上させてみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す