visual stdio 2017 c++についてです。
無限等比級数の式をC++で書きたいのですが、まったくもってわからないため、おしえていただきたいです。
1-1/2+1/4-1/8+・・・と続き。最終的に、2/3に収束する式です。
for文?で組めそうな気がするのですが、まったくわかりません。よろしくお願いいたします。
無限等比級数について
Re: 無限等比級数について
本当にまったくわからないですか?
まずは「1~100までの整数を全て1個ずつ足した和」を計算して表示するプログラムを書けますか?
まずは「1~100までの整数を全て1個ずつ足した和」を計算して表示するプログラムを書けますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 無限等比級数について
こんにちは
という感じでしょうか?
という感じでしょうか?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: 無限等比級数について
#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までの計算は理解できるのですが、こちらからの応用が分からない状態です。
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: 無限等比級数について
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
また、インデントも整えるといいでしょう。
そして、等比級数を求められるように改造します。
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で殴ればいい!(死亡フラグ)
Re: 無限等比級数について
みけCAT様
なんとか組み直して、動かすことが出来ました!ほんとうにありがとうございました!
quote="みけCAT" id=3,19446,147052]ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
また、インデントも整えるといいでしょう。
そして、等比級数を求められるように改造します。
なんとか組み直して、動かすことが出来ました!ほんとうにありがとうございました!
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を用いる
- 出力内容を調整する
Re: 無限等比級数について
その組みなおしたプログラムを提示してください。c++++++ さんが書きました: なんとか組み直して、動かすことが出来ました!
フォーラムルールに
と書いてあります。解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
解決したのなら、なぜ 100回繰り返すのかを説明してください。
forループの中に、printf("%3d: %.16f\n", i, j); を入れて、
どうなるか見てください。
わからなければ、質問してください。
ループの終了条件に付いて、私が詳しく説明します。
級数 S = a0 + a1 + a2 + ... で、
a0 = 1
an = - an-1 / 2
ですよね。
変数名は、j、k よりも、
s、a のほうがよいように思います。
Re: 無限等比級数について
もう解決したと思っているのか、質問者からは返事がありませんが、説明します。かずま さんが書きました: 解決したのなら、なぜ 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です。
これにより、54: からあとは、s の値が変化していません。
a の値が小さくなりすぎたからです。
%f は、小数点以下 6桁で表示します。
それでよいのなら、a の絶対値が 1.0e-7 以下になった時に
ループを終了すればよいことが分かります。
#include <math.h> を追加し、
for (int i = 0; fabs(a) >= 1.0e-7; i++) {
とすれはよいでしょう。
Re: 無限等比級数について
何時も初心者の数学愛好者ですが、等比級数の残りの全項の誤差は、|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)、が希望の誤差内なら終了にすれば、よろしいのではないでしょうか。
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)、が希望の誤差内なら終了にすれば、よろしいのではないでしょうか。