この前、学校の授業でマチンの公式による円周率の計算をするプログラムを以下の方針で考えました。ここで、atanを求めるユーザー定義関数を作りたいのですが、途中までは考えたのですが以下の空欄の部分が、よく分かりません。
【方針】1.数列a(k)=±(1/2k-1)*x^(2k-1)(k=1,2,…)の漸化式を作る。(a(k)のkは添え字です)
2.a(1)+a(2)+a(3)+…+a(N)の値をatan(x)の近似値とする。
(1,2,3,…,Nは添え字です)
(プログラムの一部)→atanの近似値を求める関数
double Atan(double x)
{
double s=_,a=_,kk;
int k; //添え字用
for(k=1;k<=x;k++)
{s_; //多分式が入る。
kk=(double)k;
a_; //多分式が入る。
}
return s;
}
下線部に適当な文字や式を入れて、この関数を完成させてください。(ヒントをください)
※できれば、このプログラムの形は変えないで、下線部のみを埋めてください。
No.1
- 回答日時:
> マチンの公式
は、ざっと調べただけで詳しくないので、「一般論」で申し訳ありません。
> 途中までは考えたのですが以下の空欄の部分が、よく分かりません。
どういう風に考えたんです?
途中まででよいでは、どう考えたか説明してもらえませんか?
特に、変数「s」や「a」には、何に使う(何の値を格納する)つもりで宣言したのでしょう?
後・・・
> for(k=1;k<=x;k++)
これ、間違ってると思うんですけど・・・
どうして(どういう考えで)、こういう式になったんでしょう?
この回答への補足
変数sは、atanの値を入れるために宣言しました。
また、aは、forループで、方針のa(1),a(2),a(3),…,a(N)の値を順番に計算するために宣言したものです。
forループについてですが、これは、a(1),a(2),…の値をk=1からx(方針ではN)まで計算するために、このようにしました(a(k)の値を求めるため)。違うような気がしてはいたのですがそのことをコメントしておくのを忘れました。そこも含め、何を入れたらよいのか分かりません。
残りの部分についてですが、「kk=(double)k」については、もとから、このようにヒントが書いてあったため、そのまま用いました。また、最後の「return s」は計算したatanの値をsとして返すということです。
No.2
- 回答日時:
> 変数sは、atanの値を入れる
> aは、forループで、方針のa(1),a(2),a(3),…,a(N)の値を順番に計算
なるほど。とすると、
> s_; //多分式が入る。
> kk=(double)k;
> a_; //多分式が入る。
ここの計算順番おかしくないですか?
「kk(kの値)」から、「a」を計算して、「s」に加算して行くのでは?
> kk=(double)k;
> a_; //多分式が入る。
> s_; //多分式が入る。
こういう順番に実行する必要があるのでは?
で、「a」は、
> a(k)=±(1/2k-1)*x^(2k-1)
を計算して、
「s」は、それを順に足しこんでいけばよさそうですけど・・・
> forループについてですが、これは、a(1),a(2),…の値を
> k=1からx(方針ではN)まで計算するために
って事ですが・・・
> 2.a(1)+a(2)+a(3)+…+a(N)の値をatan(x)の近似値とする。
つまり「atan(x)=a(1)+a(2)+a(3)+…+a(N)」で、精度(つまりループ回数)を決める「N」と、
個々の「a(k)」を計算するための「x」は、全く別物ですよね?
ループを「k=1からx」として大丈夫なんですか?
#例えば「Atan(0.576996400392873)」(答えは0.523333333333333ラジアン=30度)を求めようとした場合、
#「x=0.576996400392873」で、1より小さいので、全くループしないことに・・・
別に「N」を設定しなければ成らないって事ですよね?
#Nを、どうやって渡すか(引数で渡すとか、constで固定値にするか)は
#方針によるでしょうけど・・・
ありがとうございます。
皆さんのアドバイスのおかげで、何とか課題を完成することが出来ました!!
もしかしたら、また、別の問題で分からない所が出てくるかもしれません。
そのときは是非ともよろしくお願いいたします。
No.3
- 回答日時:
円周率のプログラムとか懐かしい^^
何か間違えてないですか?
使用するのグレゴリ級数じゃないのかな?
この数列±あるし、課題をもう一度確認した方が良いと思います。
グレゴリ級数って
Σ[n=0,∞]((-1)^n / (2n + 1)) * x^(2n + 1)
です。
数列で書きたかったら
a(1) = x
a(2) = x - (1 / 3) * x^3
a(3) = x - (1 / 3) * x^3 + (1 / 5) * x^5
a(4) = x - (1 / 3) * x^3 + (1 / 5) * x^5 - (1 / 7) * x^7
この数列を漸化式にすると
a(n+1) = a(n) + ((-1)^n / (2n + 1)) * x^(2n + 1)
a(1) = x
普通にΣをループでぶん回せば良いだけかと。
この回答への補足
すみません。
間違えていました!
同じ課題の中にマチンの公式の紹介もしてあったので、勘違いをしていました。
もらったヒントを参考にもう一度考えてみたのですが、まだよく分かりません。
ループの部分を中心にもう少し詳しく教えてください。
(下線部にどんなものが入るのかなど・・・)
よろしくお願いします!
No.4ベストアンサー
- 回答日時:
グレゴリ級数
Σ[n=0,∞]((-1)^n / (2n + 1)) * x^(2n + 1)
グレゴリ級数をN項まで展開する場合、n=0~N-1になります。
Σ[n=0,N-1]((-1)^n / (2n + 1)) * x^(2n + 1)
問題と成っている関数の下線を埋めてもプログラムは完成しません。
根本的に間違えがあります。
グレゴリ級数を素直に書いた場合。
double MyAtan(double x)
{
double s = (1)___;
int n;
for (n = 0; n < N; n ++) {
s (2)___
}
return s;
}
と言う形状が一般的です。
Σは総和です。
Σ[n=0,N-1]((-1)^n / (2n + 1)) * x^(2n + 1)
の場合、
> for (n = 0; n < N; n ++) {
の様に0~N未満までループさせます。
この時の各nで式「((-1)^n / (2n + 1)) * x^(2n + 1)」を計算し全てを加算したのが総和です。
よって、(2)の下線には式「((-1)^n / (2n + 1)) * x^(2n + 1)」が入る事になります。
「s = s + 加算式」or 「s += 加算式」
また、Σ[n=0,N-1]の初項(n=0)は0.0に対してn=0時の数値を加算したものと考えられます。
よって、(1)には0.0が入ります。
double MyAtan(double x)
{
double s = 0.0;
int n;
for (n = 0; n < N; n ++) {
s += 式
}
return s;
}
式には「((-1)^n / (2n + 1)) * x^(2n + 1)」が入ります。
乗数はpow関数を使用します。
・テクニックとして
初項がxと分かっているので
double MyAtan(double x)
{
double s = x; <-- 初項(n=0)分が計算済み
int n;
for (n = 1; n < N; n ++) { <-- n = 1と成っている
s += 式
}
return s;
}
とすると複雑な計算の回数が1回減り、少し速くなります。
この関数を大量に実行しない限り、測定誤差の範囲ですが。
また、「(-1)^n 」の部分も条件文にし、powを使わない方が速くなります。
まずは素直に作ってみるのが良いでしょう。
ありがとうございます。
皆さんのアドバイスのおかげで、何とか課題を完成することが出来ました!!
もしかしたら、また、別の問題で分からない所が出てくるかもしれません。
そのときは是非ともよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
たくさんの数の平均を求める方...
-
doubleの変数にintとintの割り...
-
2次方程式の解を求めるプログ...
-
C言語
-
三角形OABの面積を求めるプ...
-
C言語 関数プロトタイプ宣言の...
-
c言語のプログラミングについて...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語の型による処理速度の違い
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C++で外積
-
double型とint型で三分の一乗の...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
C言語初心者 構造体 課題について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報