大学の課題で ∫0~5 e^(-3t) * cos^2 *(2t) をシンプソン則を用いて求めるプログラムを作成せよ。積分の刻みは0.01毎 という課題がでました。
私は授業で作ったプログラムを元に、以下のプログラムを作ったのですが、答えが大きすぎて(5より大きいと間違いと言っていました)受け取ってもらえません。どこがいけないのでしょうか?
あと、nには どのような数字をいれればよいのでしょうか?nは使わないのでしょうか。
お願いします。
#include "stdio.h"
#include "math.h"
void main()
{
int n;
double i, a, b, h, S, S1, S2, S3;
double f (double);
a = 0.;
b = 5.;
printf ("N=");
scanf ("%d", &n);
h = (b - a) / (double)n;
S1 = 0.;
S2 = 0.;
S3 = f (a) + f (b); /* 両端の値*/
/* 奇数番目の値*/
for (i = 0.01; i < 5; i = i + 0.02)
{
S1 = S1 + 4. * (f (a + (double)i * h));
}
/* 偶数番目の値*/
for (i = 0.0; i < 5; i = i + 0.02)
{
S2 = S2 + 2. * (f (a + (double)i * h));
}
S = (h / 3.) * (S1 + S2 + S3);
printf ("%d %lf\n", n, S);
}
double f (double t)
{
double y;
y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.);
return y;
}
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
A No.8 です。
アルゴリズムはそれで合っていると思いますよ。
(細かいところは見ていないですが…。)
ただ i はもともと double で宣言しているので、(double)i としなくて良いと思います。そのまま a + i で良いです。
No.9
- 回答日時:
こうだと思います。
#include <stdio.h>
#include <math.h>
double f(double x)
{
return exp(-3 * x) * cos(2 * x) * cos(2 * x);
}
int main(void)
{
double a, b, h, s;
int n, i;
a = 0, b = 5;
h = 0.01;
n = (b - a) / h + 0.5; // +0.5 は丸め誤差への対応
for (s = 0, i = 1; i < n; i++)
s += ((i % 2 == 0) ? 2 : 4) * f(a + i * h);
s += f(a) + f(b);
s *= h / 3;
printf("面積=%f\n", s);
return 0;
}
(注)インデントのため、全角空白を使っています。
No.8
- 回答日時:
だんだんまどろっこしくなってきたので…
もう言ってしまいますね。。(^^;)
i は 0.02 ずつ増えています。
a + (double)i*h は、例えば偶数のほうでは、
a, a + 0.02*h, a + 0.04*h, .....
と増えていきますね。
しかし、ほんとうは、a, a + 0.02, a + 0.04, ... でよいのですから、*h が余分ですよね。
a + i だけで良いです。
奇数のほうでも同様です。
もし a + (double)i * h の形にしたければ、
h = 0.01 刻みで増えていくようにするには、i は 2 刻みで増やさないといけませんね。(i=1,3,5,... と i=0,2,4,... )
なかなか理解出来ずにすみません。
このプログラムでよいのでしょうか?
本当にありがとうございました!
#include "stdio.h"
#include "math.h"
void main()
{
int n;
double i, a, b, h, S, S1, S2, S3;
double f (double);
a = 0.;
b = 5.;
printf ("N=");
scanf ("%d", &n);
h = (b - a) / (double)n;
S1 = 0.;
S2 = 0.;
S3 = f (a) + f (b); /* 両端の値*/
/* 奇数番目の値*/
for (i = 0.01; i < 5; i = i + 0.02)
{
S1 = S1 + 4. * (f (a + (double)i));
}
/* 偶数番目の値*/
for (i = 0.0; i < 5; i = i + 0.02)
{
S2 = S2 + 2. * (f (a + (double)i));
}
S = (h / 3.) * (S1 + S2 + S3);
printf ("%d %lf\n", n, S);
}
double f (double t)
{
double y;
y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.);
return y;
}
No.4
- 回答日時:
できるだけ自分で考えてほしいので、まどろっこしい書き方になってしまいますが…。
> double fの中での t にうまく代入されていないということですか?
そういうことではなく…
for (i = 0.01; i < 5; i = i + 0.02)
では、i はどのように増えていっていますか?
そして、
f(a + (double)i * h) と書かれていますが、
この変数は意図したように値が増えていっていますか?
よ~く、考えてみてください。
h = ?
もしこの式なら、i はどう増えていくべきですか?
修正の仕方は二通りあります。
for (i = 0.01; i < 5; i = i + 0.02)は奇数だけを考えるようにしたので0.02ずつ増えていくようにしました。その代わり偶数を考えるfor文も作り、こぼれがないようにしたつもりです。
f(a + (double)i * h) の式の意味が分からなくなってしまいました。今回の問題には使えないような気がしてきました・・・。
No.3
- 回答日時:
あ, h はその意味なんですね. それなら 3 ですね. 了解です.
あと, ちょっとそのプログラムを動かしてみたんだけど危険なところがいくつかありますね. 簡単に列挙すると
・stdio.h や math.h は #include <~> でインクルードすべし
・f の宣言は main の中でしない方が安全
・やたらと無駄なキャストをし過ぎ
・for で double の変数を動かすのは危険
くらい?
ついでにいうと, #2 で挙げられたコメントとは別件で, 多分もう 1つ間違ってますね. 「偶数番目の値」のコメントのあとの for 文があやしい感じ.
y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.) のtに値を入れていくのはdouble fのなかで forで回せばいいのですか?
for (i = 0.02; i < 5; i = i + 0.02)にすればよいでしょうか?
質問ばかりですみません!
No.2
- 回答日時:
どこが間違っているのか指摘したら、getherさんの勉強にならないと思うので、ヒントをお教えします。
きざみ幅が0.01で、区間の幅が5なら、きざみの数 n はどうなるか考えてみてください。また、h = (b-a)/n と書いた h は何を表しているのかも考えてみてください。0.01とhの両方がプログラムの中に書かれていますが…。
そして、f(x) の x は loop の中で思ったように増えていっているか、よく考えてみてください。
n=500ということでしょうか?
hは0.01刻みごとの幅だと考えています。
double fの中での t にうまく代入されていないということですか?
回答ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
c言語のコンパイルエラー canno...
-
doubleの変数にintとintの割り...
-
c言語のプログラミングについて...
-
実数型の変数に値を入力した計...
-
VBの As Single はC++では・...
-
listに構造体を格納
-
c言語で、繰り返し文の中で、0....
-
sin,cos,tanを求めるプログラム...
-
サンプル遅れ
-
^この記号を使わない
-
C言語(プログラミング)関連の質...
-
long doubleの有効桁数を教えて...
-
シンプソン則について
-
セグメントエラー
-
C++プログラムの問題。。
-
テイラー展開(C言語)
-
関数におけるif文とreturn文に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語でdouble型の小数点の引き...
-
たくさんの数の平均を求める方...
-
斜辺と角度て底辺と高さを出したい
-
C言語で台形公式を使った二重積...
-
float?数字の後にLがつくもの
-
listに構造体を格納
おすすめ情報