#3

[C言語]2次方程式を解く方法をご紹介します!

こんにちは。Takuya.B(@TB_IQ)です。

研究で2次方程式を解く機会がありました。もちろん中学3年生で習うような"x=3,4"のようなシンプルな解ではありません。C言語で2次方程式を解くプログラムを作りたい方の為に方法をご紹介します!

スポンサーリンク

2次方程式を解くには"解の公式"を使う!

プログラムに2次方程式を解かせるためには解の公式を使います。

解の公式とは以下の公式です。

2jihouteisiki-001

解の公式にa,b,cの値をぶっ込んでやれば、解が得られるわけですが…

2次方程式の解は3種類に分けることができます。

  1. 異なる実数解
  2. 重解
  3. 異なる虚数解

これら3種類はルートの中身が正なのか負なのか0なのかによって判別することができます。そのためルートの中身の部分は判別式と呼ばれます。

実際のプログラム

サンプルコード

異なる虚数解に関しては別途 real, imag を宣言していますが、便宜上宣言しているに過ぎませんので、kai1, kai2に置き換えた方がスッキリします。

#include<stdio.h>
#include<math.h>        //sqrt関数を使うので必ずインクルード

int main(void)
{
	float a,b,c;
	float d; /*判別式*/
	float kai1, kai2;	/*2次方程式の解*/
	float real, imag;	/*2次方程式の虚数解*/

	printf("2次方程式の係数a,b,cを入力して下さい。\n");
	printf("a -->");
	scanf("%f", &a);
	printf("b -->");
	scanf("%f", &b);
	printf("c -->");
	scanf("%f", &c);

	/*判別式を計算する*/
	d = b*b - 4*a*c;     //b*bはpow(b,2)としてもok
	
	/*判別式でif文(条件分け)をする*/
	if(d>0){
		
		kai1 = (-b + sqrt(d)) / (2*a) ;
		kai2 = (-b - sqrt(d)) / (2*a) ;

		printf("x= %.3f , %.3f ---異なる実数解\n", kai1, kai2);

	} else if(d==0) {

		kai1 = kai2 = -b / (2*a);

		printf("x= %.3f ---二重解\n", kai1);
	}	else {
		/*解の計算*/
		real = -b / (2*a);
		imag = sqrt(-d) / (2*a);

		printf("x= %.3f ± %.3f i ---異なる虚数解\n", real, imag);
	}

	return 0;
}

出力した結果は以下のようになります。

2jikai

研究ではプログラムで積分計算をさせることが多いのですが、まさか2次方程式を解くとは思いませんでした…。一度、作っておくと便利ですので参考までに。

スポンサーリンク

まとめ

C言語で2次方程式を解くためのまとめです。

  1. 解の公式を使う
  2. 判別式をif文で条件分岐(正・0・負)

まとめてみるとシンプルですね。

オススメ書籍

最後に私が実際にC言語を学習していた頃に使用していた書籍をご紹介します。