- 1 名前:デフォルトの名無しさん [2007/10/23(火) 23:48:35 ]
- あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】 回答者の便宜のため、質問の際は以下を行うことを推奨します。 ・質問は【質問テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。 ・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 【前スレ】 C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
- 237 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:09:55 ]
- int function(int n)
{ return n<2 ? 1 : n * function(n-1); } int nCr(int n, int r) { return function(n) / function(r) / function(n-r); }
- 238 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:11:28 ]
- 一瞬で片付くというのもある意味爽快だ
- 239 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:20:03 ]
- >>234
中間試験は筆記と実技があって 実技は端末からサーバーにアクセスして書きます。 実技は今のままじゃ、受かる気がしません… ファイル処理、ポインタがかなりヤバイです
- 240 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:23:34 ]
- 関数名functorialだw
階乗ならfactorialだし、関数ならfunctionだからfuncだけみて間違っちまった。
- 241 名前:デフォルトの名無しさん [2007/10/26(金) 10:59:15 ]
- 1] 授業単元: プログラミング
[2] 問題文:3人の昼食代を入力し、その平均を関数aveにて計算し、 「割り勘で△円」と表示するプログラム (定義例:double ave(double c1,double c2,double c3)) [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月26日まで] できれば早いほうがうれしいです。 [5] その他の制限:定義例を使ってください if,while,switch,forは習いました お願いします
- 242 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:01:22 ]
- なんで金額がdoubleなんだよ・・・
- 243 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:05:00 ]
- >>234
別人だけど、フロッピーでソース提出とか、メールで添付とかもあるけど、一番多いのは紙。 正直、このご時勢で紙でやるのは馬鹿だと思う。
- 244 名前:デフォルトの名無しさん [2007/10/26(金) 11:14:18 ]
- >>242
小数点出てもいいらしいです。要はaveを使って計算したいのだと思います。
- 245 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:18:40 ]
- 俺の高校は紙にVBA書かされたぜ
- 246 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:19:06 ]
- >>243
国がやってる情報処理系の資格試験は、全部紙だぞ?
- 247 名前:デフォルトの名無しさん [2007/10/26(金) 11:24:49 ]
- 先日はありがとうござました。
[1] 授業単元: C言語演習U [2] 問題文(含コード&リンク): 前回の授業で"姓/名"という形式の文字列を入力すると、これを姓と名を表す2つの文字列に分割するプログラムを作成した。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5158.txt このプログラムを関数を用いた形に書き換えようと思い、次のプログラムを作成した。 このプログラムを実行すると、おかしな出力になってしまった。 問題1:このプログラムのどこが間違っているのか、その理由を答えよ。 (ヒント:pt_s,pt_mはローカル変数) 問題2:プログラムを書き直せ。 (配列を渡す方法、ポインタのアドレスを渡す方法などある) [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: cygwin gcc [3.3] 言語: C言語 [4] 期限:29日(月)
- 248 名前:デフォルトの名無しさん [2007/10/26(金) 11:34:38 ]
- >>239
うちも紙〜 さすがにプログラムを卓上で作りコード全部書けは無いけど、 5〜6行くらいの穴埋めでプログラムを完成させよとか。
- 249 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:59:09 ]
- 流石に資格試験でソース全部書けは無いだろ。
あったら死ねるけどw 普段書かない記号とか書かなきゃならんし、 インデント一つ追加しようと思ったらその間書き直しだし、 書いてる事がタイプ以上に考えてる事に追いつかないし、 変数名チェックも全部自分でしなけりゃならんから面倒だし。
- 250 名前:デフォルトの名無しさん [2007/10/26(金) 12:01:52 ]
- >>239
うちは進んでるよ。 テストプログラムを当日教室で下してきて実行すると、P検みたいなプログラムが走って画面左半分が問題書いてあって、右半分の上がコマンドプロンプト?で下がテキストパッドになってる。 問題にある仕様のプログラムをテキストパッドで作って、「実行」ボタンがその下にあるから押すとコマンドプロンプトで自動的にコンパイル+実行してくれる。 作ってる途中のものを試しでコンパイルする度、実行はうざかった。 問題全部作ったら問題1番最後の回答終了を押すと自動で結果をサーバーに送信して、プログラム終了。 ファイヤーウォールに引っ掛かって提出できないとか、提出時に回線が込んでて提出できないとかで、良悪あるけどね。
- 251 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:04:09 ]
- >>250
なんだかすごい環境だな。
- 252 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:09:33 ]
- >>239
高専電気科の情報の授業では ごく普通にPCでやってるぞ しかも、授業で書いたコードを参照してもいいというオマケ付きで。 授業理解度を確かめるのならこういう方式でもよさげな気がする。
- 253 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:12:10 ]
- >>241
これは……一見するととても簡単そうなプログラムに見える…… そう見えるのはオレだけか……?
- 254 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 14:03:27 ]
- strcpyの使い方で質問があるんですが、
strcpy(a+(変数),b+(変数)); これはどういう意味でしょうか?+が特に分からないんですが… a、bは配列です
- 255 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 14:06:41 ]
- >>250
せっかくプログラミングやってんだから、 講師の側でもそんな感じでテスト用プログラム作って欲しいもんだな >>252 そういう方式もいいよなあ 実際のプログラミングだとソース参照し放題、ネットで調べ放題なわけで それでもできない人がいるんだから、十分実力測れるだろう プログラミングは暗記じゃない
- 256 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 14:38:19 ]
- >>254
その配列a, bの +変数分以降のみの文字列をコピーするという意味。 変数が 2 だったらaの先頭 2 文字は変化しない。
- 257 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 15:04:04 ]
- >>256
分かり易い解説ありがとうございました
- 258 名前:235 mailto:sage [2007/10/26(金) 15:23:52 ]
- >>237
ありがとうございました!!
- 259 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:17:50 ]
- >>247
元のプログラムではポインタ変数は仮引数なので呼び出し元に結果が反映されない #include <stdio.h> void namesplit(char [], char **, char **); int main(void){ char full[200]; char *pt_sei, *pt_mei; printf ("姓/名で入力せよ:"); scanf("%s", full); namesplit(full, &pt_sei, &pt_mei); printf("姓:%s\n 名:%s\n", pt_sei, pt_mei); return 0; } void namesplit(char f[], char **pt_s, char **pt_m) { /*pt_sとpt_mをfの先頭アドレスにセット*/ *pt_s = f; *pt_m = f; /*スラッシュまでpt_mを移動*/ while (**pt_m != '/') (*pt_m)++; **pt_m = '\0'; (*pt_m)++; /*これで、pt_seiとpt_meiはそれぞれ姓と名を指す場所に移動した?*/ }
- 260 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:08:00 ]
- >>253
わかる人は簡単だよ でも、習ったばっかりなんだろ 最初はみんなわからないもんだよ
- 261 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:32:12 ]
- 一分で書けるけど書かない
- 262 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:04:04 ]
- なぜ書かない?
- 263 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:17:14 ]
- 単純に3つの引数とって平均を求める関数て言えばいいのに、なんで割り勘とか余計な設定つけてんだよ。
一人一人の代金がわかってるなら、割り勘になんてしないだろ。
- 264 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:43:15 ]
- >>263
「相乗平均じゃなくて相加平均だよ^^ お前ら間違えんなよ^^」て言いたかったんだよ 気の回る良い先生じゃないか
- 265 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 19:40:50 ]
- 宿題マダァ?(・∀・ )っ/凵⌒☆チンチン
- 266 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:09:36 ]
- ひつまぶしキボンヌ
- 267 名前:デフォルトの名無しさん [2007/10/26(金) 22:12:45 ]
- 質問テンプレ】
[1] プログラミング [2] 自然対数の底eを求めるプログラムをSRT除算を用いて求めよ。 exp(x)=Σ(n=0,∞){1/n!}=1/0!+1/2!+1/3!+…+1/n! =1+(1+1/2(1+1/3(1+…+1/n))) 固定小数点で、整数部を16ビット、小数部を48ビットとする(n≧17) [3] 環境 [3.1] Vine Linux [3.2] gcc [3.3] C言語 [4] 2007年10月29日8:40まで でも早い方がいいです。 [5] ループを使用してお願いします。
- 268 名前:デフォルトの名無しさん [2007/10/26(金) 22:12:55 ]
- 全ディレクトリのファイルを調べてサイズが一致するファイルをプルパスで出力せよ
- 269 名前:デフォルトの名無しさん [2007/10/26(金) 22:19:18 ]
- journal.mycom.co.jp/column/architecture/087/index.html
- 270 名前:デフォルトの名無しさん [2007/10/26(金) 22:22:06 ]
- >>265
自分で要求するほど、宿題を回答してやりたいのか。 この掲示板の鏡だな、解けない問題は無いってか?
- 271 名前:デフォルトの名無しさん [2007/10/26(金) 22:25:20 ]
- SRT除算は簡単ではないな
- 272 名前:デフォルトの名無しさん [2007/10/26(金) 22:43:03 ]
-
[1] プログラミング [2] doiob.net/doiob/uploader/src/up11903.jpg シンプソンの公式を用いて定積分を求めるプログラムを作成し、 以下2つの定積分を計算せよ。ただし刻み幅 h=0.1 とする。 [3] 環境 [3.1] Linux [3.2] gcc [3.3] C言語 [4] 2007年10月29日 お願いします
- 273 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:46:03 ]
- >>269
これはむずい もう少し前のページから見ないと単語がわからなすぎる
- 274 名前:デフォルトの名無しさん [2007/10/26(金) 22:54:36 ]
- シンプソンは簡単 関数をf(x)とし、 区間(a,b)を一分割で積分するとする
m=(a+b)/2 、d=(b-a)とするとき積分値は d/6 * (f(a)+f(b)+4f(m))だ N分割のときはこの値を使えばいい
- 275 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:57:47 ]
- >>274
なぜコードで示さないんだ
- 276 名前:デフォルトの名無しさん [2007/10/26(金) 22:59:44 ]
- 具体的には、区間(a,b)をN分割するならば、
F(s,t)= (t-s)/6 * (f(s)+f(t)+4f(s+t /2)) 、 d = (b-a)/Nとおくとき n=0,・・・,N-1に対しF(a+nd, a+(n+1)d)の和を計算すればよい
- 277 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:02:42 ]
- >>276
擬似コードだけなら単位はやれないな
- 278 名前:デフォルトの名無しさん [2007/10/26(金) 23:03:56 ]
- >>275
プログラム自体は計算と結果の出力だけの簡単なものだからチャレンジしてみなってことじゃない? 計算内容自体は>>274が解説してくれてるし。 もしくは作成中か。
- 279 名前:デフォルトの名無しさん [2007/10/26(金) 23:08:01 ]
- >>259
ありがとうございます。ポインタ変数が問題だったんですね。 仮引数だったのをポインタのポインタで呼び出しが出来るようにしたと。 なるほど納得しました。
- 280 名前:デフォルトの名無しさん [2007/10/26(金) 23:09:01 ]
- #include <stdio.h>
#include <math.h> double f(double x){return exp(-x*x);} double g(double x){return exp(1/sqrt(1+x*x*x*x));} #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 #define G(a,b) (g(a)+g(b)+4*g((a+b)/2))*(b-a)/6 int main(){ double x,d=0.1,sum; sum=0; for(x=0;x<1;x+=d)sum+=F(x,x+d); printf("%f\n",sum); sum=0; for(x=0;x<1;x+=d)sum+=G(x,x+d); printf("%f\n",sum); }
- 281 名前:デフォルトの名無しさん [2007/10/26(金) 23:10:31 ]
- 訂正
double g(double x){return 1/sqrt(1+x*x*x*x);}
- 282 名前:デフォルトの名無しさん [2007/10/26(金) 23:12:03 ]
- 値があっているか確認したいが数値計算ソフトだれか持っている?
- 283 名前:デフォルトの名無しさん [2007/10/26(金) 23:12:09 ]
- 何にせよ動作するリストを出すのがこのスレってもん
- 284 名前:デフォルトの名無しさん [2007/10/26(金) 23:12:15 ]
- >>274 >>276
で組み込む計算式作ってくれてるから、もう課題出来てるも同然な気がする。 だって、その式を表示するだけで完成でしょ。
- 285 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:17:30 ]
- >>272 カウンタは整数のが良いと思うので便乗
#include <stdio.h> #include <math.h> double func1(double x) { return sqrt(pow(x, 4) + 1); } double func2(double x) { return exp(-pow(x, 2)); } int main(void) { double l = 0.0, r = 1.0, h = 0.1, s = 0; int i; for(i = 0; i < (r - l)/h; i += 2) s += h/3*(func1(l + i*h) + 4*func1(l + (i + 1)*h) + func1(l + (i + 2)*h)); printf("%g\n", s); for(i = 0; i < (r - l)/h; i += 2) s += h/3*(func2(l + i*h) + 4*func2(l + (i + 1)*h) + func2(l + (i + 2)*h)); printf("%g\n", s); return 0; }
- 286 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:03:16 ]
- [1] 授業単元: コンピューター
[2] 問題文(含コード&リンク):整数演算と浮動小数点演算で自分のプロセッサのスピードをテストするプログラムと結果を示しなさい。 テストするのは整数、浮動小数点ともに、加減乗除の4つづ、計8つです。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [5] その他の制限: 結果はcygwinのtimeを使えってばっちゃが言ってました。 お願いします。
- 287 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:07:31 ]
- ふざけてんの
- 288 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:13:39 ]
- >>280
副作用乙
- 289 名前:デフォルトの名無しさん [2007/10/27(土) 00:18:05 ]
- なんで6で割っているんだぜ?
- 290 名前:デフォルトの名無しさん [2007/10/27(土) 00:34:16 ]
- >>289
#include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return exp(1/sqrt(1+x*x*x*x));} #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 #define G(a,b) (g(a)+g(b)+4*g((a+b)/2))*(b-a)/6 int main(){ double x,d=0.001,sum; sum=0;for(x=0;x<1;x+=d)sum+=F(x,x+d); printf("%f\n",sum); sum=0;for(x=0;x<1;x+=d)sum+=G(x,x+d); printf("%f\n\n",sum); //単純な定積分 int n,N=1/d; sum=0;for(n=0;n<N;n++)sum+=d*g(n*d); printf("%f\n",sum);}
- 291 名前:デフォルトの名無しさん [2007/10/27(土) 00:47:03 ]
- Integral(f,a,b,d)って出来るの? 関数わたし
- 292 名前:デフォルトの名無しさん [2007/10/27(土) 00:55:29 ]
- スマソ全然見てなかったわ
- 293 名前:272 [2007/10/27(土) 01:03:57 ]
- ありがとうございました
解説で分かってきたので色々と試してみます
- 294 名前:291 [2007/10/27(土) 01:09:38 ]
- できた
#include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return 1/sqrt(1+x*x*x*x);} #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 typedef double (*func)(double); double Integral(func f,int a,int b, double d){ int n,N=(int)1/d;double s=0; for(n=0;n<N;n++)s+=F(n*d,n*d+d); return s;} int main(){ double d=0.001; printf("%f\n",Integral(f,0,1,d)); printf("%f\n",Integral(g,0,1,d));}
- 295 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:19:55 ]
- 先こされた。
#include<stdio.h> #include<math.h> double quadInterpol( double (*fun)( double ), double begin, double end ) { return ((*fun)(begin) + 4*(*fun)( (begin+end)/2 ) + (*fun)(end)) * (end-begin)/3; } double integral( double (*fun)( double ), double begin, double end, double h ) { double result = 0.0; double pos = begin; while( pos <= end ) { result += quadInterpol( (*fun), pos, pos+h ); pos += h; } return result; } double f(double x) { return exp(-x*x); } int main(void) { const double diff = 0.1; printf("result=%f\n",integral(f,0.0,1.0,diff)); return 0; }
- 296 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:26:36 ]
- >>294
出題者じゃないんだが。 typedef double (*func)(double); これってなにやってるの?
- 297 名前:57 mailto:sage [2007/10/27(土) 01:29:04 ]
- >>228
自分も詳しい理由は分かりませんが、この再帰の問題以前にも、リストで 色々な動作をする関数を作ったので、その関数を作る時、関数に引数を 渡したりするのに、リストの先頭にデータを入れない方が都合が 良いんじゃないですかね? リストは先頭にデータを入れないとばかり思ってたので、よく分かりませんが。
- 298 名前:291 [2007/10/27(土) 01:30:26 ]
- >>296
たとえばDLLを使うとき次のように書く 型の定義 typedef int (__stdcall *FNC)(const HWND , LPCSTR , LPSTR , const DWORD); main(){ HINSTANCE hd = LoadLibrary("UNZIP32.DLL"); FNC p = (FNC)GetProcAddress(hd,"UnZip"); }
- 299 名前:デフォルトの名無しさん [2007/10/27(土) 01:30:41 ]
- >>290
すいませんd=0.001となってるのが良く分からないんですが
- 300 名前:291 [2007/10/27(土) 01:31:39 ]
- >>299 細かくした方が値が正確になるって事だけだ d=0.1でいい
- 301 名前:コッチェビン [2007/10/27(土) 01:32:28 ]
- なんかすごいシコシコしたい・・・
- 302 名前:デフォルトの名無しさん [2007/10/27(土) 01:33:37 ]
- >>300
どうもです
- 303 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:34:19 ]
- >>298
つまりfuncという関数型ができたということ? そうしたらIntegral(func funcName,...) とすべきでは? それと #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 ここでfつかっちゃったらマクロFでは常に関数fが呼び出されることにならない?
- 304 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:35:47 ]
- ちなみに追い詰めてるわけじゃないです。数値あわせがしたいだけです。
計算結果に自信がないので。
- 305 名前:291 [2007/10/27(土) 01:36:19 ]
- >>303
呼び出すのはfでいいんだよ 引数でfとかgを指定するから
- 306 名前:291 [2007/10/27(土) 01:37:56 ]
- >>304
単純な定積分の値と比較したから正解だろう >>290で求めている あと>>290はgが間違えていて 正しくは double g(double x){return 1/sqrt(1+x*x*x*x);}
- 307 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:38:07 ]
- >そうしたらIntegral(func funcName,...)
スマソ。そうなってた。
- 308 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:40:16 ]
- >>305
double Integral(func f,int a,int b, double d){ int n,N=(int)1/d;double s=0; for(n=0;n<N;n++)s+=F(n*d,n*d+d); return s;} 引数でfという関数を取っているのは確かなんだけど 関数内で一回も使ってない。
- 309 名前:291 [2007/10/27(土) 01:41:38 ]
- >>308
Fがマクロだから使っている あと使っていないのはaとbだ 勝手に(0,1)だとおもって書いてしまった
- 310 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:41:57 ]
- >>308
マクロ展開してみればいい でも名前が被っているのは気持ち悪いな #include<stdio.h> void a(void){printf("func a\n");} void b(void){printf("func b\n");} void c(void (*a)(void)){a();} int main(void){ c(a); c(b); return 0; }
- 311 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:43:31 ]
- >>309
なるほどね。理解できました。 exp(-x*x)の関数名をfにしないでくれたらよかった。
- 312 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:53:03 ]
- >>294
粘着すまん。 6じゃなくて3で割らないといけなくないか? h=0.1で指定されているし。
- 313 名前:修正版 [2007/10/27(土) 02:00:49 ]
- #include <stdio.h>
#include <math.h> double exp_x2(double x){return exp(-x*x);} double ichiwaru_root_1tasu_x4(double x){return 1/sqrt(1+x*x*x*x);} #define F(a,b) (f((a))+f((b))+4*f(((a)+(b))/2))*((b)-(a))/6 typedef double (*func)(double); double Integral(func f,double a,double b, double d){ int n,N;double s=0; N=(int)(b-a)/d; for(n=0;n<N;n++) s+=F(a+n*d,a+(n+1)*d); s+=F(N*d,b);return s;} int main(){ double d=0.1; printf("%f\n",Integral(exp_x2,0,1,d)); printf("%f\n",Integral(ichiwaru_root_1tasu_x4,0,1,d));}
- 314 名前:修正版 [2007/10/27(土) 02:03:09 ]
- >>312
そもそも2hの幅で積分しろってことか それならそうだな
- 315 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:04:51 ]
- うがあぁ数値が合わない。
何が違うんだ。。。。。
- 316 名前:修正版 [2007/10/27(土) 02:07:29 ]
- >>312
でも最小の区間を与えた方が標準的だと思う Integral(f, 0, 1, 0.2))と呼び出せば正解と一致する値が出るはずだ
- 317 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:11:03 ]
- >>316
考えてみる。 正解はちなみにいくつなんだ 俺は result=1.560123 result=1.988458 そっちは 1.493648 1.854075 他の検証方法ってある?Excelあたりでできるもんかね?
- 318 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:12:30 ]
- あ。6->3にした値ね。
- 319 名前:修正版 [2007/10/27(土) 02:17:43 ]
- 正解は0.746825と0.927040じゃないか
単純な積分値とほぼ一致する #include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return 1/sqrt(1+x*x*x*x);} int main(){ double x,s,d=0.001; s=0;for(x=0;x<1;x+=d)s+=d*f(x); printf("%f\n",s); s=0;for(x=0;x<1;x+=d)s+=d*g(x); printf("%f\n",s); }
- 320 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:25:04 ]
- Excelで確認したところ俺もexp(-x*x)の単純な積分の値は
0.747508011 ぐらいになった。 では6で割るべきなのか。
- 321 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:28:04 ]
- 6->3にした結果
俺 result=0.780061 result=0.994229 そちら 0.746825 0.927040 そっちの勝ちだ.orz ノシ
- 322 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:28:58 ]
- 間違えた
3->6
- 323 名前:修正版 [2007/10/27(土) 02:31:52 ]
- doiob.net/doiob/uploader/src/up11903.jpg
この式よく見てみろ hを算出するときに既に2で割っている 分割数nに対して2nで割っているからややこしいだけ
- 324 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:34:34 ]
- そういうことか・・・ややこしい。
- 325 名前:デフォルトの名無しさん [2007/10/27(土) 02:40:23 ]
- 便乗質問なんだけど
h=0.1で与えられてるから式の通りに3で割るんじゃないの? の辺りがイマイチ理解できんので教えてくれ…
- 326 名前:修正版 [2007/10/27(土) 02:46:21 ]
- >>325
問題どおりにやるとひとつひとつの積分区間は2hなので 6で割る部分と打ち消しあって3になる 幅hの積分を求めるのではなく x とx+hとx+2hの三点を2次関数で近似したいと言うことなんだろう だから2h幅になっている
- 327 名前:修正版 [2007/10/27(土) 02:48:01 ]
- >>325
原理、近似の方法はここに書いてある ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%83%97%E3%82%BD%E3%83%B3%E3%81%AE%E5%85%AC%E5%BC%8F
- 328 名前:デフォルトの名無しさん [2007/10/27(土) 02:54:49 ]
- ありがとうございます
- 329 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 03:05:21 ]
- >>287
ふざけてないです。 おおマジです。
- 330 名前:デフォルトの名無しさん [2007/10/27(土) 03:57:35 ]
- 引用しますが、計算式を
#define F(a,b,h) (f(a)+f(b)+4*f((a+b)/2))*h/3 #define G(a,b,h) (g(a)+g(b)+4*g((a+b)/2))*h/3 というようにhを用いた式で表すなら 図のように d=0.1 for(x=0;x<1;x+=d*2) とすればいいのか
- 331 名前:修正版 [2007/10/27(土) 04:06:02 ]
- >>330
#include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return 1/sqrt(1+x*x*x*x);} #define F(x,h) (f(x) + 4*f(x+h) + f(x+2*h)) * h/3 #define G(x,h) (g(x) + 4*g(x+h) + g(x+2*h)) * h/3 int main(){ double x,sum,h=0.1; sum=0; for(x=0;x<1;x+=2*h)sum+=F(x,h); printf("%f\n",sum); sum=0; for(x=0;x<1;x+=2*h)sum+=G(x,h); printf("%f\n",sum);}
- 332 名前:デフォルトの名無しさん [2007/10/27(土) 04:12:10 ]
- 何か邪魔臭くなっていましたね さんくすこ
- 333 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 08:27:42 ]
- まだやってたのか。俺は寝てしまって今起きた
#define F(x,h) (f(x) + 4*f(x+h) + f(x+2*h)) * h/3 #define G(x,h) (g(x) + 4*g(x+h) + g(x+2*h)) * h/3 じゃなくて #define F(x,h) (f(x) + 4*f(x+h/2) + f(x+h)) * h/6 #define G(x,h) (g(x) + 4*g(x+h/2) + g(x+h)) * h/6 にするかもしくはh=0.05にしないといけない。
- 334 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 08:35:59 ]
- すまん。寝ぼけて間違えた。
>>331でOK。
- 335 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 08:37:39 ]
- やっと数値のずれが直ったので貼る
#include<stdio.h> #include<math.h> double quadInterpol( double (*fun)( double ), double begin, double h ) { return ((*fun)( begin ) + 4.0*(*fun)( begin + h ) + (*fun)( begin + 2.0*h )) * h/3.0; } double integral( double (*fun)( double ), double begin, double end, double h ) { double result = 0.0; double pos = begin; do { result += quadInterpol( (*fun), pos, h ); pos += 2.0*h; } while( pos < end ); return result; } double f(double x) { return exp(-x*x); } double g(double x) { return 1.0/sqrt(1 + x*x*x*x); } int main(void) { const double diff = 0.1; printf("result=%f\n",integral(f,0.0,1.0,diff)); printf("result=%f\n",integral(g,0.0,1.0,diff)); return 0; }
- 336 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 08:55:22 ]
- ひゃっほう。
- 337 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 10:08:16 ]
- なんでシンプソン公式だけでこんなにスレ進むんだよw
|

|