無限ループになってしまいます。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
propane
記事: 1
登録日時: 7年前
住所: 東京

無限ループになってしまいます。

#1

投稿記事 by propane » 7年前

ありがとうございました

わかりました
最後に編集したユーザー propane on 2017年5月14日(日) 04:47 [ 編集 1 回目 ]

かずま

Re: 無限ループになってしまいます。

#2

投稿記事 by かずま » 7年前

propane さんが書きました:無限ループになってしまいます。
どうなおしたらよいでしょうか。。
無限ループになると分かっているのなら、
for文の中に printf("k=%d\n", k); や printf("start=%g\n", start); を
入れてみるぐらいのことをしてみましょう。
すぐに原因が分かりますよ。
double length = 1 / k; で、1 / 2 は 0 だからです。
1.0 / k にしましょう。
でも、そこを直したとしても、他のところに重大な間違いがありますよ。

かずま

Re: 無限ループになってしまいます。

#3

投稿記事 by かずま » 7年前

propane さんが書きました:ありがとうございました

わかりました
回答が付いた時、質問を消すというのは、
やってはいけないことです。
なぜなら、この掲示板を読んでいる多くの人が、
回答の意味を理解できないからです。

もう一度、質問のプログラムを返信で投稿してください。
と言っても、おそらくやってくれそうにないので、
元のプログラムを codeタグをつけて示します。

コード:

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

//プロトタイプ宣言// 
float integrand(float x);
double trapezoid();

int main(void)
{
	trapezoid();
	return 0;
}

//4 / ( 1 + x * x)の値を返すintegrand関数// 
float integrand(float x)
{
	float fx;
	fx = 4 / (1 + x * x);
	return fx;
}

//台形公式を使った積分を計算するtrapezoid関数// 
double trapezoid()
{
	int k = 2;					//台形の分割数の初期値// 
//1つの分割数に対する答え// 
	double sum[100];
	sum[1] = 3;
	double start = 0;
	double length = 1 / k;		//台形の一つの高さ// 
	double area = (integrand(start) + integrand(start + length)) * length / 2;	//一つの台形の面積を求める// 
//精度を求める式err// 
	double err = fabs((sum[k] - sum[k - 1]) / sum[k - 1]);
//kを大きな数に設定して、k分割した分のk個の台形の面積の合計をgoukeiに入れていく// 
	for (k = 2; k < 100; k++) {
		for (start = 0; start < 1; start = start + length) {

			sum[k] = sum[k] + area;
		}
		printf("%8d/%8f/%8f/%8f\n", k, sum[k], sum[k - 1], err);

		if (err <= 1.0e-10) {
			break;
		}
	}
	return 0;
}
無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。

かずま

Re: 無限ループになってしまいます。

#4

投稿記事 by かずま » 7年前

かずま さんが書きました:無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。
質問を削除するような人に、改善したプログラムは期待できないでしょう。

次のようなプログラムを用意していました。

コード:

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

const int N = 1024; // 分割数

double trapezoid(double f(double), double a, double b, int n)
{
    double h = (b - a) / n, s = (f(a) + f(b)) / 2;
    for (int i = 1; i < n; i++) s += f(a + h * i);
    return s * h;
}

double f1(double x) { return x; };
double f2(double x) { return x*x; };
double f3(double x) { return sqrt(1 - x*x); }
double f4(double x) { return 4 / (1 + x*x); }

int main(void)
{
    printf("∫x dx = %g\n", trapezoid(f1, 0, 1, N));
    printf("∫x^2 dx = %g\n", trapezoid(f2, 0, 1, N));
    printf("∫sqrt(1 - x^2) dx = %g\n", trapezoid(f3, 0, 1, N));
    printf("∫4 / (1 + x^2) dx = %g\n", trapezoid(f4, 0, 1, N));
    return 0;
}
積分区間は [0, 1] です。

返信

“C言語何でも質問掲示板” へ戻る