2022.10.17
数学
二次方程式の解の公式
二次方程式、
の解を求める式は、
です。これが、二次方程式の解の公式です。
上の式のa≠0は、aが0の場合は、二次方程式の解の公式が使えないことを表しています。公式の分母の2aが0になるので解を導きだせません。
この公式によって導かれる解は、最大2つです。以下のx1とx2です。
平方根の中の式(判別式)が0未満の場合は「解なし」、判別式の計算結果が0の場合は、x1とx2の値が同じになるので解が1つです。
Javaソースコード
QuadraticFormula.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106
public class QuadraticFormula { // 二次方程式の解 private static double[] get( double a, double b, double c ) { // 0とみなす値(任意) double e = 0.00000000001; // aが0でないかを判定 if ( e > Math.abs( a ) ) return null; // 解なし // 判別式 double d = b * b - 4.0 * a * c; // 判別式で解の存在を判定 if ( 0.0 > d ) return null; // 解なし // 解を格納する配列 double[] x = null; // 解が1つだけ存在 if ( e > d ) { x = new double[ 1 ]; x[ 0 ] = -b / ( 2.0 * a ); } else { // 解が2つ存在 x = new double[ 2 ]; x[ 0 ] = ( -b + Math.sqrt( d ) ) / ( 2.0 * a ); x[ 1 ] = ( -b - Math.sqrt( d ) ) / ( 2.0 * a ); } return x; } // 結果出力 private static void output( double[] x, double a, double b, double c ) { // パラメーターの出力 System.out.println( "a=" + a + ", b=" + b + ", c=" + c ); // 解がない場合 if ( null == x ) { System.out.println( "解なし" ); return; } // 解が1つの場合 if ( 1 == x.length ) { System.out.println( "x=" + x[ 0 ] ); return; } // 解が2つの場合 if ( 2 == x.length ) { System.out.println( "x=" + x[ 0 ] + " と x=" + x[ 1 ] ); } } // メイン public static void main( String[] args ) { // 方程式のパラメータ double a, b, c; // 解を格納する配列 double[] x; // 3x^2 - 30x - 48 = 0 a = 3.0; b = -30.0; c = 48.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 // 次の出力結果との隙間 System.out.println(); // 改行 // x^2 - 6x + 9 = 0 a = 1.0; b = -6.0; c = 9.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 // 次の出力結果との隙間 System.out.println(); // 改行 // x^2 + x + 1 = 0 a = 1.0; b = 1.0; c = 1.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 // 次の出力結果との隙間 System.out.println(); // 改行 // x - 5 = 0 a = 0.0; b = 1.0; c = -5.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 } }
出力結果
a=3.0, b=-30.0, c=48.0 x=8.0 と x=2.0 a=1.0, b=-6.0, c=9.0 x=3.0 a=1.0, b=1.0, c=1.0 解なし a=0.0, b=1.0, c=-5.0 解なし
Javaソースコードの解説
001
public class QuadraticFormula {
クラス名を、QuadraticFormulaとしています。
002 003 004
// 二次方程式の解 private static double[] get( double a, double b, double c ) {
005 006
// 0とみなす値(任意) double e = 0.00000000001;
008 009
// aが0でないかを判定 if ( e > Math.abs( a ) ) return null; // 解なし
Math.absメソッド
public static int Math.abs( int a ) public static long Math.abs( long a ) public static float Math.abs( float a ) public static double Math.abs( double a ) public static int Math.abs( byte a ) public static int Math.abs( short a )
・引数aに指定した数値の絶対値を返します。 パラメータ a : 絶対値を求めたい数値 戻り値 aの絶対値を返します。 戻りの変数型は、基本的に引数と同じ変数型と考えてよいです。
011 012
// 判別式 double d = b * b - 4.0 * a * c;
二次方程式の解の公式の平方根の中の式を判別式といいます。その判別式にa、b、cを与えて計算しています。
014 015
// 判別式で解の存在を判定 if ( 0.0 > d ) return null; // 解なし
017 018
// 解を格納する配列 double[] x = null;
020 021 022 023 024
// 解が1つだけ存在 if ( e > d ) { x = new double[ 1 ]; x[ 0 ] = -b / ( 2.0 * a ); }
判別式の計算結果dが0の場合、解が1つなので、配列xの要素を1つで作成し、判別式を0にして計算した結果を代入しています。
025 026 027 028 029 030
else { // 解が2つ存在 x = new double[ 2 ]; x[ 0 ] = ( -b + Math.sqrt( d ) ) / ( 2.0 * a ); x[ 1 ] = ( -b - Math.sqrt( d ) ) / ( 2.0 * a ); }
Math.sqrtメソッド
public static double Math.sqrt( double a )
・引数aで指定した数値の平方根を返します。 パラメータ a : 平方根を求める数値 戻り値 aの平方根
032
return x;
036 037
// 結果出力 private static void output( double[] x, double a, double b, double c )
039 040
// パラメーターの出力 System.out.println( "a=" + a + ", b=" + b + ", c=" + c );
パラメーターa、b、cを横並びでコンソール出力しています。
042 043 044 045 046
// 解がない場合 if ( null == x ) { System.out.println( "解なし" ); return; }
048 049 050 051 052
// 解が1つの場合 if ( 1 == x.length ) { System.out.println( "x=" + x[ 0 ] ); return; }
054 055 056 057
// 解が2つの場合 if ( 2 == x.length ) { System.out.println( "x=" + x[ 0 ] + " と x=" + x[ 1 ] ); }
061 062
// メイン public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
063 064
// 方程式のパラメータ double a, b, c;
方程式のパラメーターa、b、cを格納する変数を宣言しています。
066 067
// 解を格納する配列 double[] x;
069 070 071 072 073 074
// 3x^2 - 30x - 48 = 0 a = 3.0; b = -30.0; c = 48.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力
パラメーターa=3.0、b=-30.0、c=48.0を二次方程式の解を計算するgetメソッドに渡して、解xを取得しています。
076 077
// 次の出力結果との隙間 System.out.println(); // 改行
次の出力結果との隙間を開けるために改行しています。
079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104
// x^2 - 6x + 9 = 0 a = 1.0; b = -6.0; c = 9.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 // 次の出力結果との隙間 System.out.println(); // 改行 // x^2 + x + 1 = 0 a = 1.0; b = 1.0; c = 1.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力 // 次の出力結果との隙間 System.out.println(); // 改行 // x - 5 = 0 a = 0.0; b = 1.0; c = -5.0; x = get( a, b, c ); // 解の計算 output( x, a, b, c ); // a,b,cと解を出力
上記と同様にパラメーターa、b、cを変えて、結果を出力しています。
以上です。