情報技術検定のプログラミングの分野の質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コアラ

情報技術検定のプログラミングの分野の質問です

#1

投稿記事 by コアラ » 8年前

情報関係のアルゴリズムの問題なのですが、わからないので教えてもらえないでしょうか
問題
半径1の円の方程式は、x^2+y^2=1で表される。
この式から、y=√(1-x^2)(0≦x≦1)で表される図形は、原点(0,0)を中心とする半径1の円の第一象限の部分であることがわかる。
したがって、定積分∫1 ,0√(1-x^2)dxは、円の第一象限の部分の面積表す。
この面積の台形近似を利用した区分求積法により求め、その値をもとにして円周率πを求めるアルゴリズムを考えた。このとき、流れ図の中の空欄①~⑤に入れるべきものを図にならって記入し、流れ図を完成しなさい。ただし、ループ開始端野式は、繰り返しの終了条件を示す。
で、こっからアルゴリズムです。
はじめ

関数f(x)=√(1-x^2)

nを入力

x←0
S←0

dx←①

ループ開始
x≧1

y1←f(x)

x←②

y2←f(x)

ds←③

s←④

ループ終了

PI←⑤

PIを表示

おわり

なんですが、①はわかるのですが、それ以降が何がなんだかわかりません
答えは
①1÷n②x+dx③(y1+y2)×dx÷2④S+ds⑤S×4

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 情報技術検定のプログラミングの分野の質問です

#2

投稿記事 by usao » 8年前

オフトピック
>台形近似を利用した区分求積法

というのが,どんな話なのかはについては大丈夫なのですか?
その話自体がわからないなら,区分求積法について調べるしかないのではないでしょうか.

話がわかるなら,単にその式を書くだけですし.
(例えば (3)なんて,台形の面積の計算式そのものですよね)

かずま

Re: 情報技術検定のプログラミングの分野の質問です

#3

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

01√(1 - x2) dx を台形近似を利用した区分求積法で求めるんですね。

コード:

#include <stdio.h>  // scanf, printf
#include <math.h>   // sqrt

double f(double x) { return sqrt(1 - x*x); }

int main(void)
{
    int n;
    while (scanf("%d", &n) == 1) {          // n を入力
        double x = 0;
        double S = 0;
        double dx = 1.0 / n;                // (1)
        while (x < 1) {                     // ループ開始
            double y1 = f(x);
            x = x + dx;                     // (2)
            double y2 = f(x);
            double ds = (y1 + y2) * dx / 2; // (3)
            S = S + ds;                     // (4)
        }                                   // ループ終了
        double PI = S * 4;
        printf("PI = %g\n", PI);            // PI を表示
    }
    return 0;
}
実行結果

コード:

256    <-- 入力
PI = 3.14131
1024   <-- 入力
PI = 3.14156
4096   <-- 入力
PI = 3.14159
.      <-- 入力
このアルゴリズムでは、y1 と y2 を求めるのに
同じ f(x) の計算を 2回行っており、無駄があります。
n が 2のべき乗でないとき、dx は誤差を持ち、
x = x + dx で、x に誤差が蓄積し、
n回ループを回っても、x が 1 にならず、
もう一回余分にループを回る可能性があります。

ということで別解です。

コード:

#include <stdio.h>  // scanf, printf
#include <math.h>   // sqrt

double f(double x) { return sqrt(1 - x*x); }

int main(void)
{
    int n;
    while (scanf("%d", &n) == 1) {
        double dx = 1.0 / n;
        double S = (f(0) + f(1)) / 2;
        for (int i = 1; i < n; i++)
            S += f(dx * i);
        double PI = S * dx * 4;
        printf("PI = %g\n", PI);
    }
    return 0;
}

返信

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