プロが教えるわが家の防犯対策術!

プログラミングの勉強です。原始反復法で方程式x^2−2=0を教えて頂きたいです。因みに実行結果も教えていただけると幸いです。

質問者からの補足コメント

  • プログラミングと実行結果です

      補足日時:2021/04/27 00:36
  • c言語の入力したものと実行結果はどのようになるのでしょうか

      補足日時:2021/04/27 09:38

A 回答 (5件)

・あなたのいう「原始反復法」とは, 具体的にはどのような方法なのですか?


・「方程式x^2−2=0を教えて頂きたいです」というのは, その方程式の何を知りたいのですか?
・一般に「反復法」は初期値によって最終的に得られる値が違うというのは認識できていますか?
    • good
    • 0
この回答へのお礼

プログラミング上での方程式の解き方を教えていただきたいです。プログラミングの打つ順番そのものです。
どうぞ宜しくお願いします

お礼日時:2021/04/27 00:35

企業で統計を推進する立場の者です。



#1さんの補足をします。
「初期値によって最終的に得られる値が違う」についてです。

いま、与えられた方程式は解を2つ持ちますよね。±√2です。
反復法(ソルバー)は探索方向によって、どちらか1つしか見つけることしかできません。

一般的には、多項式はグネグネの山の形になっています。解が頂点でなく山の中腹だったら、複数のxが該当します。反復法はグリッドサーチでもネルダーミードでもシミュレーティッドアニーリングでも、そのうち1つの解に収束すると計算が止まります。そのため、多数の初期値から出発して探索することが行われます。

さて、問題の回答ですが、

原始反復法って単なるグリッドサーチのことだと考えると・・・、
①仮の解tを与え、その両側に±hのサーチ幅を取る
②損失関数eを決める。通常は(ターゲット値-計算値)^2
③サーチ幅を100分割程度にグリッド化し各損失を求める
④損失が最小となるtを求める。
⑤h=±1/2hとする
⑥指定された回数あるいは、損失関数が指定値以下になるまで、③以降を繰り返す

以下はR言語で書いたプログラムです(等幅フォントで見て下さい)。

~~~~~~~~~~~~~~~~~~~~~~

t <- 0 # 解の初期値(通常はここを乱数で多数試す)
h <- 100 # 探索範囲の初期値
i <- 100 # 探索回数

while(i > 0){ # iが0以上なら繰り返す
e <- NULL # 損失関数をリセット
x <- seq(t - h, t + h, length = 100) # 探索範囲を100分割する
e <- append(e, (0 - (x^2 - 2))^2) # ターゲット値との差の2乗を計算
t <- x[which.min(e)] # 最小値を与える代入値を新たな解にする
h <- 1/2 * h # 探索範囲を半分にする
i <- i - 1 # カウンタを1つ減らす
}

t # 解を表示する

~~~~~~~~~~~~~~~~~~~~~~

実行結果は次のとおりです。2つある解の1つが求まっています。
> t
[1] -1.414214
    • good
    • 1
この回答へのお礼

ありがとうございます

お礼日時:2021/04/27 09:36

私ゃCは分からいねぇ。



私の説明に沿って自分でC++なんかで書いてみれば、だれか添削してくれますよ。
    • good
    • 1
この回答へのお礼

ありがとうございます

お礼日時:2021/04/27 09:45

#2です。

損失関数を求めている行が間違っていましたので訂正します。解は変わりません。

t <- 0 # 解の初期値(通常はここを乱数で多数試す)
h <- 100 # 探索範囲の初期値
i <- 100 # 探索回数

while(i > 0){ # iが0以上なら繰り返す
e <- NULL # 損失関数をリセット
x <- seq(t - h, t + h, length = 100) # 探索範囲を100分割する
e <- (0 - (x^2 - 2))^2 # ターゲット値との差の2乗を計算
t <- x[which.min(e)] # 最小値を与える代入値を新たな解にする
h <- 1/2 * h # 探索範囲を半分にする
i <- i - 1 # カウンタを1つ減らす
}

t # 解を表示する
    • good
    • 0

何かの値を求めたいときに、


その値を極限に持つ数列を構成することを
一般に「反復法」と呼びます。
問題の種類と数列の作り方によって
実にさまざまな反復法があります。
質問の「原始反復法」ですが、調べた範囲では
どんな反復法なのか判りませんでした。
あまり普及した用語ではないようです。
特定の反復法を指定した質問なのであれば、
どんな反復法を実装してほしいのか
少し説明したほうがよいように思います。

よくある簡単な反復法の例として、
ここではニュートン法を挙げてみましょう。
ニュートン法とは、方程式 f(x)=0 に対して
漸化式 x[n+1] = ーf(x[n])/f’(x[n]) を用いる
方法のことを言います。
f(x)=x^2-2 であれば、漸化式は
x[n+1] = ー{x[n]^2-2}/(2x[n]) です。
ニュートン法の初期値の選び方は難しく、
個々の問題に対してよく考える必要があります。
ここでは、x[1]=2 から始めてみましょうか。

C言語でのコードは、以下のようになります。
#include <stdio.h>
#include <stdlib.h>
#define Eps 0.00001
#define LOOP 10000
#define Xini 2
main() {
  double x, x1 = Xini;
  int i;
  for( i = 0; i < LOOP; i++ ) {
    x = x1;
    x1 = - (x^2 - 2)/(2*x);
    if( abs(x1 - x) < Eps ) break;
  }
  printf("%f\n", x1);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!