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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

3758閲覧

二分法 C言語のプログラム

tennis1202

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/01/03 11:20

二分法のC言語のプログラムについて、エラーが出てうまくいきません。
どこが間違えているか、どこを直したらうまく出力できるか
教えていただけると幸いです。
以下がプログラムです。

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

int main(void){
double xL,xR,xM;
{
int count=0;
int xL=0,xR=2.0;
while(xR-xL > 0.0000001){
print("count++ xL,xR \n");
xM=(xL+xR)/2;
if (f(xL)*f(xM)<0)
xR=xM;
else{
xL=xM;
count ++;
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WathMorks

2017/01/03 12:59

どのようなエラーですか?
seastar3

2017/01/04 15:19

これはC#ではなく、Cのコードです。
guest

回答4

0

ベストアンサー

出力に関しては、seastar3さんのコメントをご参照ください。
その他気になった点を以下修正しています。
1.countについては、xM~xRの間に解がある時だけカウントするのではなく、iterationの数をカウントしたいのではないかと思います。この場合、count ++の場所が間違っています。(以下コードをご参照ください)
2.f(x)の定義がありません。2分法で求める対象の関数がなにか分かりませんが、例えばf(x)=(x-1)^3を対象の関数とした場合の例を、以下に記載します。
3.初期値が悪く、xL~xRの間に解が無い場合やtoleranceがシビアな場合、収束計算が終了しませんので、繰り返し計算の回数に上限を設けた方が良いかと思います。以下のコードでは50回を上限にしています。

C

1#include <stdio.h> 2#include <math.h> 3double f(double x) 4{ 5 return x*x*x-3*x*x+3*x-1; 6} 7 8int main(void){ 9double xM; 10xM=0.1; 11int count=0; 12double xL=0,xR=1.9; 13while((xR-xL > 0.0000001) && (count < 50)){ 14printf("count++=%3d xL=%2.9f , xR= %2.9f, f1(xM)=%2.9f \n",count,xL,xR,xM,f(xM)); 15xM=(xL+xR)/2; 16if (f(xL)*f(xM)<0) 17{xR=xM; 18} 19else{ 20xL=xM; 21} 22count ++; 23} 24}

以下上記の実行結果ですが、解析解のx=1付近で収束計算が終了しています。
イメージ説明

投稿2017/01/05 00:34

cesolution

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

f(0)*f(2)<0であり、かつfが[0,2]で単調であれば、提示したアルゴリズムは動くはずです。
エラーが出る原因は、プログラミング作法に問題があるか、使用しているfが仮定を満たしていないかのいずれかでしょう。

投稿2017/01/03 15:55

WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそもコンパイルが成立すると思えないです。作製途中か何かだと思います。

投稿2017/01/03 13:04

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これはC#ではなく、Cのコードですね。とりあえず動くように手直ししてみました。

C

1#include <stdio.h> 2int main(void){ 3 double xL,xR,xM; 4 int count=0; 5 xL=0.0,xR=2.0; 6 while(xR-xL > 0.0000001){ 7 printf("%4d %10.9f %10.9f\n",count,xL,xR); 8 xM=(xL+xR)/2.0; 9 if ((float)xL * (float)xM < 0) 10 xR=xM; 11 else { 12 xL=xM; 13 count++; 14 } 15 } 16} 17

printfの使い方、xL,xRの二重宣言、(float)キャストの間違い、++直前の余分なスペース、}の不整合など、いかにも初心者のコードミスが散見されました。
私も最初は訳の分からない間違いを沢山して、直すのもお手あげで先輩に見てもらったものです。コードを一字一句忠実に読み解き、たくさんエラーを直して、デバッグのセンスを養っていきましょう。

投稿2017/01/04 15:18

編集2017/01/04 15:20
seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seastar3

2017/01/04 23:51

自分でコーディングしておいてなんですが、(float)xL の浮動小数点型へのキャストは不要でしたね。 元コードの f(xL)がキャスト操作かと推測して当てはめましたが、もしかしたら別のf()関数を定義するつもりなのかも知れません。 その点の補足をお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問