重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float f(float x);
float f(float x)
{
return (float)(x-sin(x)/cos(x));
}

void main()
{
float x1,x2,eps,f1,f2,xm,ff;
int i;

printf("Bisection method\n\n");
for(;scanf("%g%g%g",&x1,&x2,&eps)!=EOF;){
f1= f(x1); f2= f(x2);
if(f1>0){
xm= x1; x1= x2; x2=xm;
ff= f1; f1= f2; f2=ff;
}
printf("\nFinding a root between x1=%g and x2=%g\n", x1, x2);
printf("f(x1)=%g f(x2)=%g eps=%g\n", f1, f2, eps);
printf("\tx1\t\tx2\t\txm\t\tf(xm)\n");
if(f2<0){
printf("????\n");
continue;
}
i= 0;
for(;fabs(x1-x2)>=eps;){
xm=(x1+x2)*((float)rand()/(float)RAND_MAX)
ff= f(xm);
i++;
printf("%2d %15.6e %15.6e %15.6e %15.6e\n",i, x1, x2, xm, ff);
if(ff<0)
x1= xm;
else
x2= xm;
}
printf("A root found between %g and %g\n", x1, x2);
}
}


f(x)=x-tanx=0の解のうち3つを表示させるためにランダムサーチのプログラムを上記のように書いたつもりなんですがうまく作動しません。どこをどう直したらいいのでしょうか、教えてください。

A 回答 (4件)

すいません。

前の質問の回答で
(x1+x2)*((float)rand()/(float)RAND_MAX)
と書いたのは僕です。。
No.2さんのが正解です。
r=(float)rand()/(float)RAND_MAX);
mx=(1-r)*x1+r*x2;

r=0.5; で固定にしたら(x1+x2)/2と同じですね。
    • good
    • 0
この回答へのお礼

いえいえ、、こんな質問に答えていただいてありがとうございます。

お礼日時:2004/10/19 02:39

> これ以外式が思いつかないのですが。



思いついてもいなければ、誤りにも気づかなかったのか…
    • good
    • 0

rを0以上1以下の乱数としたとき、内分点の公式より:



(1-r)*x1 + r*x2

ではありませんか?
思いつくとかいうんじゃなくて、'理屈'でしょう?
    • good
    • 0
この回答へのお礼

すいません・・。もう少し自分でできるようにがんばります。

ありがとうございました!

お礼日時:2004/10/18 18:20

乱数による挟み撃ちですね。



(x1+x2)*((float)rand()/(float)RAND_MAX)

この式は 'x1以上x2以下のデタラメな値'となりますか?

この回答への補足

…実行できないってことはならないんですよね。。う~ん。。これ以外式が思いつかないのですが。。

補足日時:2004/10/18 17:58
    • good
    • 0

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