Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Newton法で平方根を求めるJavaのサンプルプログラム+操作動画もご紹介

投稿日:2020年9月20日 更新日:

<目次>

(1) Newton法で平方根を求めるJavaのサンプルプログラム
 (1-1) Newton法の式を簡単に復習
 (1-2) Newton法のサンプルプログラム

(1) Newton法で平方根を求めるJavaのサンプルプログラム

一変数の非線形方程式の近似解を反復的に求めるアルゴリズムである「ニュートン法」のプログラムをJavaで実装した例を紹介します。

【おまけ】
特に今回はdouble型の誤差(double型で発生する誤差について)を解消し、より高精度に解を求めるために、doubleに代わりBigDecimalを使って実装しています。

(1-1) Newton方の式を簡単に復習


①一般的な直線の式

点\((x_{1}, y_{1})\)を通って傾きが \(a\) の直線の式は
$$
y-y_{1}=a(x-x_{1})
$$


②反復1回目の接線

方程式\(y=f(x)\)でニュートン法の初期値を\(x_{1}\)とすると、1回目の接線は点「\((x_{1},f(x_{1})\)」を通って傾きが\(f'(x_{1})\)の直線になります。 これらを①の式に代入すると
$$
y-f(x_{1})=f'(x_{1})(x-x_{1})
$$

③反復1回目の解(【★実装に使う式】)
上記の式で\(y=0\)を代入して\(x\)について解くと、反復1回目の解(\(x_{2}\)とする)が求まります
この反復1回目の解\(x\)を\(x_{2}\)と呼ぶとすると

$$
x_{2}=x_{1}-\frac {f(x_{1})}{f'(x_{1})}
$$

となり、同様に反復2回目の解を求める式は次の通りです。
$$
x_{3}=x_{2}-\frac {f(x_{2})}{f'(x_{2})}
$$

この計算を繰り返していく事で\(x\)がどんどん解に近づいていきます。
目次にもどる

(1-2) Newton法のサンプルプログラム

今回のプログラムは上記ニュートン法の式(【★実装に使う式】)に\(f(x)=x^2-a\)を適用した式で実装しています。
$$
x_{n}=x_{n-1}-\frac {(x_{n-1}^2-a)}{2x_{n-1}}
$$

x = x.subtract(x.multiply(x).subtract(a).divide(c2.multiply(x),51,RoundingMode.HALF_UP));
delta = x.multiply(x).subtract(a).abs();

(サンプルPG)
⇒BigDecimalの使い方を確認したい方は、こちらの記事「JavaのBigDecimalの使い方」をご参照ください。

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Newton1 {
        public static void main(String[] args) {

                //平方根を求める数字「a」を引数から取得
                BigDecimal a = new BigDecimal(args[0]);

                //引数から「x」の初期値を取得(一旦は「a」と同じ値にしています)
                BigDecimal x = new BigDecimal(args[0]);

                //「f(x)=x*x-a」を微分した結果「f'(x)=2x」の係数「2」をBigDecimalで定義
                BigDecimal c2 = new BigDecimal("2");
                //誤差の閾値をBigDecimalで定義				
                BigDecimal err = BigDecimal.valueOf(1E-50);
                //誤差の初期値をBigDecimalで定義
                BigDecimal delta = new BigDecimal("1");
                int count = 0;
                while (err.compareTo(delta)<0 ) {
                        //【★実装に使う式】に、今回の方程式「f(x)=x*x-a」を当てはめて計算した式
                        x = x.subtract(x.multiply(x).subtract(a).divide(c2.multiply(x),51,RoundingMode.HALF_UP));
                        //誤差の計算
                        // ⇒今回はaの平方根を求めているのでxを二乗したらaに限りなく近くなるはず
                        // ⇒よってx*x-aの絶対値を計算する
						delta = x.multiply(x).subtract(a).abs();
                        ++count;
                        System.out.println("Count="+count+" Error="+delta);
                }
                System.out.println("x = " + x);
                System.out.println("x * x = " + x.multiply(x));
        }
}

(実行時の注意点)
Eclipseで実行する場合は「Run Configurations」から実行時の引数を指定します。

(図121)

(実行結果例)
引数に「3」を与えて実行した例です(ルート3なので1.73205・・・を求める計算になります)。

(図122)

(操作動画)引数の操作からプログラム実行の簡単な動画です。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaのprintfで右揃え(右詰め)や左揃え(左詰め)にフォーマットする方法

<目次> (1) Javaのprintfで右揃えや左揃えにフォーマットする方法  (1-1) 構文  (1-2) 右揃えの方法  (1-3) 左揃えの方法  (1-4) 主要な変換文字(s,d,f,t …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート1:仕様説明編)

(0)目次&概説 (1) 仕様について  (1-1) アーキテクチャ(アプリ/DB)  (1-2) アプリの仕様概要  (1-3) データベースの仕様概要 (2) ソースコード (3) エラー対応 ( …

Javaのswitch-case文の構文や使い方を紹介+UFOキャッチャーの座標移動プログラムも紹介

<目次> (1) Javaのswitch-case文の構文や使い方を紹介  (1-1) switch-caseの構文  (1-2) else-if文との比較 (2) サンプルプログラムの紹介  (2- …

JSPでcssが適用されない(Resouce interpreted as Stylesheet but transferred with MIME type)事象のトラブルシューティング記録

<目次> (1) JSPでcssが適用されない(Resouce interpreted as Stylesheet but transferred with MIME type)事象のトラブルシューテ …

Javaのenumでフィールドを複数定義したり、値を取得する方法

<目次> (1) Javaのenumでフィールドを複数定義したり、値を取得する方法  (1-1) enumでフィールドを定義・取得する  (1-2) enumでフィールドを複数定義・取得する (1) …

  • English (United States)
  • 日本語
Top