無限ループになってしまいます。
Posted: 2017年5月14日(日) 02:25
ありがとうございました
わかりました
わかりました
無限ループになると分かっているのなら、propane さんが書きました:無限ループになってしまいます。
どうなおしたらよいでしょうか。。
回答が付いた時、質問を消すというのは、propane さんが書きました:ありがとうございました
わかりました
#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;
}
質問を削除するような人に、改善したプログラムは期待できないでしょう。かずま さんが書きました:無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。
#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;
}