無限等比級数について

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

無限等比級数について

#1

投稿記事 by c++++++ » 6年前

visual stdio 2017 c++についてです。

無限等比級数の式をC++で書きたいのですが、まったくもってわからないため、おしえていただきたいです。


1-1/2+1/4-1/8+・・・と続き。最終的に、2/3に収束する式です。

for文?で組めそうな気がするのですが、まったくわかりません。よろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 無限等比級数について

#2

投稿記事 by みけCAT » 6年前

本当にまったくわからないですか?
まずは「1~100までの整数を全て1個ずつ足した和」を計算して表示するプログラムを書けますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: 無限等比級数について

#3

投稿記事 by purin52002 » 6年前

こんにちは

コード:

初項(分母)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 をかける
という感じでしょうか?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 無限等比級数について

#4

投稿記事 by みけCAT » 6年前

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 をかける
という感じでしょうか?
足し算を行っている部分が無いので、違うと思います。
オーバーフローを起こす可能性もありますし。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

c++++++

Re: 無限等比級数について

#5

投稿記事 by c++++++ » 6年前

#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までの計算は理解できるのですが、こちらからの応用が分からない状態です。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 無限等比級数について

#6

投稿記事 by みけCAT » 6年前

ソースコードを提示する際は、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を用いる
  • 出力内容を調整する
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

c++++++

Re: 無限等比級数について

#7

投稿記事 by c++++++ » 6年前

みけ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: 無限等比級数について

#8

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

c++++++ さんが書きました:    なんとか組み直して、動かすことが出来ました!
その組みなおしたプログラムを提示してください。

フォーラムルール
解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
と書いてあります。

解決したのなら、なぜ 100回繰り返すのかを説明してください。
forループの中に、printf("%3d: %.16f\n", i, j); を入れて、
どうなるか見てください。
わからなければ、質問してください。
ループの終了条件に付いて、私が詳しく説明します。

級数 S = a0 + a1 + a2 + ... で、
 a0 = 1
 an = - an-1 / 2
ですよね。

変数名は、j、k よりも、
s、a のほうがよいように思います。

かずま

Re: 無限等比級数について

#9

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

かずま さんが書きました: 解決したのなら、なぜ 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++) {
とすれはよいでしょう。

shika

Re: 無限等比級数について

#10

投稿記事 by shika » 6年前

何時も初心者の数学愛好者ですが、等比級数の残りの全項の誤差は、|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)、が希望の誤差内なら終了にすれば、よろしいのではないでしょうか。

返信

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