情報関係のアルゴリズムの問題なのですが、わからないので教えてもらえないでしょうか
問題
半径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
情報技術検定のプログラミングの分野の質問です
Re: 情報技術検定のプログラミングの分野の質問です
オフトピック
>台形近似を利用した区分求積法
というのが,どんな話なのかはについては大丈夫なのですか?
その話自体がわからないなら,区分求積法について調べるしかないのではないでしょうか.
話がわかるなら,単にその式を書くだけですし.
(例えば (3)なんて,台形の面積の計算式そのものですよね)
というのが,どんな話なのかはについては大丈夫なのですか?
その話自体がわからないなら,区分求積法について調べるしかないのではないでしょうか.
話がわかるなら,単にその式を書くだけですし.
(例えば (3)なんて,台形の面積の計算式そのものですよね)
Re: 情報技術検定のプログラミングの分野の質問です
∫01√(1 - x2) dx を台形近似を利用した区分求積法で求めるんですね。
実行結果
このアルゴリズムでは、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) { // 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;
}
同じ 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;
}