質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

二分法のプログラミング

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 289

challenge326

score -12

二分法とは、f(x) が区間[a; b] 内で連続かつ、f(a) とf(b) の符号が異なる時(計算機的には
f(a)  f(b) < 0 と書く)に、方程式f(x) = 0 の解を次のような方法で求める。

  1. まず、方程式の解は区間[a; b] 内にある。ここで、一つの解の上限をhigh, 下
    限をlow という変数に入れる。(これはプログラム的にはf(high)  f(low) < 0 の
    意味である)初期条件としては、low ( b, high ( a である。
  2. 次に、x ( (high+low)=2 と置く。ここで、f(x)f(high) < 0 の時にlow ( x
    そうでない時に、high ( x とすると、これは一つの解の上限、下限を表してい
    る。この操作を一回繰り返すごとに、解の区間が半分にせばまってくる。
  3. 上の操作を何回か繰り返して、low high の値が近くなった時、これを解と思
    い、操作を打ち切る。そうでない時は2 に戻る。
    /*houteisiki01.c*/

include <stdio.h>

include <math.h>

define EPS 1e-8 /* 打ち切り誤差*/

define LIMIT 50 /* 打ち切り回数*/

double f(double x){
return sin(x);
}
double nibun(double (*f)(double), double a, double b){
double x,low,high;
int k=1;
a=low; b=high;
for (k=1;k<=LIMIT;k++) {
x=(low+high)/2;
if (f(high)*f(x)>0) high=x; else low=x;
if (f(x)==0 || fabs(high-low)<EPS) return x;
}
if (k>LIMIT) {printf("収束しない\n"); return 99999;}
}
main(){
printf("x=%lf \n",nibun(f,-4,-3));
}
実行結果
x=-3.141593
上のプログラムでは、sin x = 0 の解をx 2 [􀀀4;􀀀3] の範囲で求めている。こ
のプログラムでは、解の範囲を[􀀀4; 3] のように、sin(􀀀4)(> 0), sin(3)(> 0) のよ
うに両端(a=high, b=low) での関数の値の符号が同じ時には上手く動かない。そ
こで、以下のようなプログラムの改良を考えてみる。
関数f(x), と区間[a; b] が与えられた時、[a; b] 内の点c でf(a)  f(c) < 0 で
あるものを見つける関数ryotan は以下のように作れる。
double ryotan(double (*f)(double), double a, double b){
int n=1,i;
double x,atai;
atai=f(a);
while(n<=1024){
for(i=1;i<=n;i++){
x=a+(b-a)*i/n;
if (atai*f(x)<0) return x;
}
n=n*2;
}
if(atai>0) {printf("f(x)>0 です.\n"); return 9999;}
if(atai<0) {printf("f(x)<0 です.\n"); return 9999;}
}
問い:houteisiki02.c 上の関数ryotan を使って、2 分法のプログラムが、f(a) 
f(b) > 0 の時も(解がある場合は)動くように改良せよ。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2020/01/23 09:47

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

+1

回答ではないですが・・・<code>の中にコードを貼り付けて下さい。
また、文字も読めません^^;
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/16 15:17

    ついでに、float.hにはFLT_EPSILON、DBL_EPSILON、LDBL_EPSILONの定義が有ります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる