• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語プログラム(二分法)について質問です。)

C言語プログラム(二分法)についての質問

このQ&Aのポイント
  • C言語プログラム(二分法)でa*xの最大点を求めるためのプログラムは?
  • C言語プログラム(二分法)でaを1〜10まで変化させたときのxの値を求めるためのループはどうすればいいか?
  • C言語プログラム(二分法)による解の求め方について質問です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

関数 nibun() は、係数入力の printf(); scanf(); を省いただけで、そのまま用いています。 プログラムは計算区間を #define で START,END,STEP定数化したり、式を事前に定義(formula())し、変更はプログラム本体を触らなくても良いようにしてあります。 なお、変数a は実数であるため、よくある for()の桁落ち誤差が発生しても大丈夫なように1%(STEP/100.0)の重みを付けてあります。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define EPS 1.0e-6 #define START 1.0 // aの始点 #define END 10.0 // 〃終点 #define STEP 1.0 // 〃刻み #define formula(a,x) a*x // 検討式 double f(double); double nibun(void); double a,b=0.3; // 広域変数 int main(void) { double x, max, max_a, max_x; for (a=START; a<=END+STEP/100.0; a+=STEP) { x=nibun(); if (a==START || formula(a,x)>max) { max_a=a; max_x=x; max=formula(a,x); } } printf("max(a*x)= %.1F * %f = %f\n", max_a, max_x, max); return 0; } double nibun(void) { int count=0; double x0,x1,m; x0=-2*b; x1=b; do { count++; m=(x0+x1)/2.0; if(f(m)*f(x0)<0) x1=m; else x0=m; if(count>=700) printf("Error\n"), exit(1); } while (!(fabs(x0-x1)<EPS)); printf("\t解の値は a=%.1f のとき %f\n",a,m); return m; } double f(double x) { return b - log(a) - (a+x)/2; }

その他の回答 (2)

回答No.2

main() をこんな感じに書き直します。 (ただし、この main() は、No.1 の方の回答とほぼ同じロジックを書き直しただけです) 当然、このままでは nibun() の呼び出しに失敗しますから、 「方程式の解を表示する関数」void nibun(void) を、 「定数 a を指定したら、方程式の解 x を返す関数」double nibun(double a) となるように書き直します。 オリジナルの nibun() の中でわざわざ「a を入力」したり、「結果を表示したり」していますから、引数の a をどう処理するとか、結果はどこに求まっているかはわかると思います。 double nibun(double a); int main() { int resultA = -1; double resultX = 0; for(int a = 0; a <= 10; a++) { double x = nibun(a); if ((resultA < 0) || (rsultX < a * x)) { resultA = a; resultX = a * x; } } // ここで、resultA と resutlX に答えが求まる } あと、nibun() の引数として a を持つことから、 double f(double x) を double f(double a, double x) に変更して、呼び出し時に a を私のも良いかもしれません。

  • patawan
  • ベストアンサー率16% (2/12)
回答No.1

プログラムの細かい部分はお任せします。 ココでは質問内容にあった『aの値を変化させ、最大値を求める』という点に絞って説明します。 aを1から10まで変化させる為にループ文を使います。 for (i=0 ; i < 10 ; i++) { } こんな感じですね。 このfor文の{}内でaの値は変化しますので、その中でxの値を求め、a*xの値(xx)を求めます。 for (i=0 ; i < 10 ; i++) { x = ・・・(xの計算式) ; xx = a * x ; } max_xの値(前回までの最大値)とxの値を比較し、xxの方が大きければmax_xにxxの値を入れます。(max_xの値の方が大きければ、スル~) for (i=0 ; i < 10 ; i++) { x = ・・・(xの計算式) xx = a * x ; if ( max_x < xx ) { max_x = xx ; } } って、こんな感じじゃダメかな? 変数の初期化は必ず行って下さいね。

qwe1232
質問者

補足

回答ありがとうございます。 今回の式は x=~ という形では解が求まらないため、二分法を用いて解析的にといています。 回答にあるような感じのことならばできるのですが、二分法を用いたプログラムは記載したように、 関数が二つに分かれています。 そのため、回答のように、for文を作ってただ式を入れて解を比較する。ということができません。 このような場合において、aの値を変化させ、最大値を求める。ということをしたい場合、 記載したプログラム(二分法)のどの部分に何を書き加えればよいのかということを教えていただきたいです。

関連するQ&A