プロが教える店舗&オフィスのセキュリティ対策術

こんばんは。C言語は超初心者です。以下の文は二分法の部分をサブ化したつもりの文です。がうまくいきません。修正箇所が山ほどあると思いますがよろしくお願いします。

int main (void)
{
double solution, x;
double bisec(double x);

solution=bisec(x);
cout<<solution<<endl;

return 0;
}



//bisec sub
double bisec(double x)
{
double x, x0, x1, x2, y, y0, y1;
int i=0, k=0, j=0;

x=0.1;
y1=f(x);
for(;;)
{
for(;;)
{
x+=0.1;
if(x>=10.0)
{
exit(0);
}
y=f(x);
if(y*y1>0)
{
y1=y;
}
else
{
x1=x-0.1;
x2=x;
x0=x;
y0=y;
break;
}
}

for(;;)
{
x=(x1+x2)/2.0;
i++;
if(fabs((x-x1)/x)>1.0e-14)
{
y=f(x);
if(y*y1>0)
{
x1=x;
y1=y;
}
else
{
x2=x;
}
}
else
{
return x;
x=x0;
y1=y0;
break;
}
}
}
}

includeと関数f(x)の定義は省略しました。二分法のサブの部分は複数の解を得ることが出来るようになっています。次のことをご教授お願いします。
一つ目は、上の文のbisec(double x)をdouble()にするとエラーが出ないのですが根本的にその理由が分かりません。
二つ目は、解を複数表示する方法が分かりません。上の文では一回returnしちるため1つしか表示されないということは分かるのですが。。
なるべく原文を崩さないで修正お願いします。あまり変わってしまうと理解できないので。。お願いします。

A 回答 (2件)

数値解析では誤差を含んだ1つの解しか見つけることができません。

その解が妥当であるかどうかは人間が検証する必要があります。逐次二分法では、通常、解の探索区間(x1,x2)を変更しながら複数回繰り返して探索します。しかし、f(x1),f(x2)の符号が同じであれば、その中に偶数個の解が含まれている可能性は否定できません。

今回のプログラムでは区間を指定できるように改造しておくといいでしょう。
    • good
    • 0
この回答へのお礼

遅くなってすみません。
ありがとうございました。

お礼日時:2002/07/17 22:45

#include <iostream.h>


#include <math.h>

int main (void)
{
//double solution, x;
double solution, x=0;
//double bisec(double x);
double bisec(double);

solution=bisec(x);
cout<<solution<<endl;

return 0;
}

// double f(double x){ return 2*x-5;}

//bisec sub
double bisec(double x)
{
//double x, x0, x1, x2, y, y0, y1;
double x0, x1, x2, y, y0, y1;

X<10でしか答えが出ませんがそれはいいのですか。
double bisec(double);
はプロトタイプ宣言ですから変数xを記入してはいけません。新たにxが宣言しようとしてしまい、前のxの宣言と重複します。
同様にsubのところも宣言が先に行われていますので、内部での宣言は不要です。

この回答への補足

ご回答ありがとうございます。大変よく理解できました。
二分法の解を複数得る方法は何かないでしょうか?よろしければお願いいたします。

補足日時:2002/07/14 01:21
    • good
    • 0

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