ありがとうございました
わかりました
無限ループになってしまいます。
無限ループになってしまいます。
最後に編集したユーザー propane on 2017年5月14日(日) 04:47 [ 編集 1 回目 ]
Re: 無限ループになってしまいます。
無限ループになると分かっているのなら、propane さんが書きました:無限ループになってしまいます。
どうなおしたらよいでしょうか。。
for文の中に printf("k=%d\n", k); や printf("start=%g\n", start); を
入れてみるぐらいのことをしてみましょう。
すぐに原因が分かりますよ。
double length = 1 / k; で、1 / 2 は 0 だからです。
1.0 / k にしましょう。
でも、そこを直したとしても、他のところに重大な間違いがありますよ。
Re: 無限ループになってしまいます。
回答が付いた時、質問を消すというのは、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: 無限ループになってしまいます。
質問を削除するような人に、改善したプログラムは期待できないでしょう。かずま さんが書きました:無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。
次のようなプログラムを用意していました。
#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;
}