ページ 1 / 1
無限等比級数について
Posted: 2017年7月30日(日) 15:45
by c++++++
visual stdio 2017 c++についてです。
無限等比級数の式をC++で書きたいのですが、まったくもってわからないため、おしえていただきたいです。
1-1/2+1/4-1/8+・・・と続き。最終的に、2/3に収束する式です。
for文?で組めそうな気がするのですが、まったくわかりません。よろしくお願いいたします。
Re: 無限等比級数について
Posted: 2017年7月30日(日) 16:11
by みけCAT
本当にまったくわからないですか?
まずは「1~100までの整数を全て1個ずつ足した和」を計算して表示するプログラムを書けますか?
Re: 無限等比級数について
Posted: 2017年7月30日(日) 16:21
by purin52002
こんにちは
コード:
初項(分母)a_d 初項(分子)a_n を用意
公比(分母)r_d 公比(分子)r_n を用意
変数に値を設定
(公比がマイナスの場合、 r_n をマイナスの値にする)
任意の回数ループ
printf("%+d/%d", a_n, a_d) で出力
a_d に r_d をかける
a_n に r_n をかける
という感じでしょうか?
Re: 無限等比級数について
Posted: 2017年7月30日(日) 16:30
by みけCAT
purin52002 さんが書きました:こんにちは
コード:
初項(分母)a_d 初項(分子)a_n を用意
公比(分母)r_d 公比(分子)r_n を用意
変数に値を設定
(公比がマイナスの場合、 r_n をマイナスの値にする)
任意の回数ループ
printf("%+d/%d", a_n, a_d) で出力
a_d に r_d をかける
a_n に r_n をかける
という感じでしょうか?
足し算を行っている部分が無いので、違うと思います。
オーバーフローを起こす可能性もありますし。
Re: 無限等比級数について
Posted: 2017年7月30日(日) 16:39
by c++++++
#include <stdio.h>
int main(void)
{
int i,j;
j=0;
for(i=1;i<101;i=i+1){
j=j+i;
}
printf("1から100までの和は%dです。",j);
return 0;
}
1から100までの計算は理解できるのですが、こちらからの応用が分からない状態です。
Re: 無限等比級数について
Posted: 2017年7月30日(日) 16:46
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
また、インデントも整えるといいでしょう。
c++++++ さんが書きました:1から100までの計算は理解できるのですが、こちらからの応用が分からない状態です。
まずはループ変数と足す数を分けます。
コード:
#include <stdio.h>
int main(void)
{
int i,j,k;
j=0; // 和
k=1; // 足す数
for(i=1;i<101;i=i+1){
j=j+k; // 和を更新
k=k+1; // 足す数を進める
}
printf("1から100までの和は%dです。",j);
return 0;
}
そして、等比級数を求められるように改造します。
コード:
#include <stdio.h>
int main(void)
{
int i; // ループ変数
double j,k;
j=0; // 和
k=1; // 足す数
for(i=1;i<101;i=i+1){
j=j+k; // 和を更新
k=k*(-1.0/2.0); // 足す数を進める
}
printf("和は%fです。",j);
return 0;
}
- 和の計算に使う数をintからdoubleにする
- 足す数を進める時の式を変える
- double型の値を出力するので、%dではなく%fを用いる
- 出力内容を調整する
Re: 無限等比級数について
Posted: 2017年7月30日(日) 17:51
by c++++++
みけCAT様
なんとか組み直して、動かすことが出来ました!ほんとうにありがとうございました!
quote="みけCAT" id=3,19446,147052]ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
また、インデントも整えるといいでしょう。
c++++++ さんが書きました:1から100までの計算は理解できるのですが、こちらからの応用が分からない状態です。
まずはループ変数と足す数を分けます。
コード:
#include <stdio.h>
int main(void)
{
int i,j,k;
j=0; // 和
k=1; // 足す数
for(i=1;i<101;i=i+1){
j=j+k; // 和を更新
k=k+1; // 足す数を進める
}
printf("1から100までの和は%dです。",j);
return 0;
}
そして、等比級数を求められるように改造します。
コード:
#include <stdio.h>
int main(void)
{
int i; // ループ変数
double j,k;
j=0; // 和
k=1; // 足す数
for(i=1;i<101;i=i+1){
j=j+k; // 和を更新
k=k*(-1.0/2.0); // 足す数を進める
}
printf("和は%fです。",j);
return 0;
}
- 和の計算に使う数をintからdoubleにする
- 足す数を進める時の式を変える
- double型の値を出力するので、%dではなく%fを用いる
- 出力内容を調整する
[/quote]
Re: 無限等比級数について
Posted: 2017年7月31日(月) 15:22
by かずま
c++++++ さんが書きました:
なんとか組み直して、動かすことが出来ました!
その組みなおしたプログラムを提示してください。
フォーラムルールに
解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
と書いてあります。
解決したのなら、なぜ 100回繰り返すのかを説明してください。
forループの中に、printf("%3d: %.16f\n", i, j); を入れて、
どうなるか見てください。
わからなければ、質問してください。
ループの終了条件に付いて、私が詳しく説明します。
級数 S = a
0 + a
1 + a
2 + ... で、
a
0 = 1
a
n = - a
n-1 / 2
ですよね。
変数名は、j、k よりも、
s、a のほうがよいように思います。
Re: 無限等比級数について
Posted: 2017年8月04日(金) 00:20
by かずま
かずま さんが書きました:
解決したのなら、なぜ 100回繰り返すのかを説明してください。
forループの中に、printf("%3d: %.16f\n", i, j); を入れて、
どうなるか見てください。
わからなければ、質問してください。ループの終了条件に付いて、私が詳しく説明します。
もう解決したと思っているのか、質問者からは返事がありませんが、説明します。
コード:
#include <stdio.h>
int main(void)
{
double s = 0; // 項の和(級数)
double a = 1; // 項
for (int i = 0; i < 100; i++) {
s += a; // 和を更新
a *= -1.0/2.0; // 項の更新
printf("%3d: s =%30.26f a =%30.26f\n", i, s, a);
}
printf("和は%fです。", s);
return 0;
}
実行結果
コード:
0: s = 1.00000000000000000000000000 a = -0.50000000000000000000000000
1: s = 0.50000000000000000000000000 a = 0.25000000000000000000000000
2: s = 0.75000000000000000000000000 a = -0.12500000000000000000000000
3: s = 0.62500000000000000000000000 a = 0.06250000000000000000000000
4: s = 0.68750000000000000000000000 a = -0.03125000000000000000000000
5: s = 0.65625000000000000000000000 a = 0.01562500000000000000000000
6: s = 0.67187500000000000000000000 a = -0.00781250000000000000000000
7: s = 0.66406250000000000000000000 a = 0.00390625000000000000000000
8: s = 0.66796875000000000000000000 a = -0.00195312500000000000000000
...
19: s = 0.66666603088378906250000000 a = 0.00000095367431640625000000
20: s = 0.66666698455810546875000000 a = -0.00000047683715820312500000
21: s = 0.66666650772094726562500000 a = 0.00000023841857910156250000
22: s = 0.66666674613952636718750000 a = -0.00000011920928955078125000
23: s = 0.66666662693023681640625000 a = 0.00000005960464477539062500
24: s = 0.66666668653488159179687500 a = -0.00000002980232238769531250
25: s = 0.66666665673255920410156250 a = 0.00000001490116119384765625
...
51: s = 0.66666666666666651863693005 a = 0.00000000000000022204460493
52: s = 0.66666666666666674068153498 a = -0.00000000000000011102230246
53: s = 0.66666666666666662965923251 a = 0.00000000000000005551115123
54: s = 0.66666666666666674068153498 a = -0.00000000000000002775557562
55: s = 0.66666666666666674068153498 a = 0.00000000000000001387778781
56: s = 0.66666666666666674068153498 a = -0.00000000000000000693889390
...
97: s = 0.66666666666666674068153498 a = 0.00000000000000000000000000
98: s = 0.66666666666666674068153498 a = -0.00000000000000000000000000
99: s = 0.66666666666666674068153498 a = 0.00000000000000000000000000
和は0.666667です。
double の精度は 2進で 53ビット、10進で約16桁です。
これにより、54: からあとは、s の値が変化していません。
a の値が小さくなりすぎたからです。
%f は、小数点以下 6桁で表示します。
それでよいのなら、a の絶対値が 1.0e-7 以下になった時に
ループを終了すればよいことが分かります。
#include <math.h> を追加し、
for (int i = 0; fabs(a) >= 1.0e-7; i++) {
とすれはよいでしょう。
Re: 無限等比級数について
Posted: 2017年10月29日(日) 15:20
by shika
何時も初心者の数学愛好者ですが、等比級数の残りの全項の誤差は、|a|< 1.0、で、
S∞ = (Sn=1+a+a^2+a^3+.......+a^n)+(ΔSn=(a^(n+1)/(1-a))= a^(n+1)+a^(n+2)+...a^(n=n+1=∞))
で、a^(n+1)/(1-a)、が希望の誤差内なら終了にすれば、よろしいのではないでしょうか。