• 締切済み

PostScript言語で定積分の計算

学校の課題で y=f(x) の変数xの区間 a<=x<=bの定積分の計算をやるためのプログラムをPostScript言語で書けという課題が出ました。 関数をfとし、台形則か中点則を使うとよい と書かれているのですが、数学が苦手で定積分の解き方すら理解できていません。 どのようにプログラミングすればいいのか、詳しくて大まかな手順と、プログラミングができた際に正しいか確認するための数字をいくつか、教えていただけないでしょうか? 手順と ○○と入力して実行すると××という結果が出る というのをいくつかお願いします

みんなの回答

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.6

中点則と台形則さらにガウス・ルジャンドル積分を用いて数値積分を行い横軸に必要な点数、縦軸に積分結果をとったグラフを書かせてみました。ガウス・ルジャンドル積分の優秀さが分かります。どの色がどのグラフかはソースを見てください。 以下ソース: %!PS-Adobe-2.0 100 dict begin % f(x)の定義 % 例としてf(x)=x^2 /F { /X exch def X dup mul } def % 積分範囲の定義 % 例として0から1 /Start 0 def /End 3 def % 区間幅を計算するマクロ /Span { End Start sub Imax div } def % 分割数を引数に中点則で数値積分 /Integ { 10 dict begin % 微小区間への分割数の定義 /Imax exch def 0 Start Span 2 div add Span End Span 2 div sub { F add } for Span mul end } def % 分割数を引数に台形則で数値積分 /Integ_daikei { 20 dict begin % 微小区間への分割数の定義 /Imax exch def 0 Start Span End Span sub { /XI exch def XI F XI Span add F add Span mul 2 div add } for end } def % ガウス・ルジャンドル積分 % n=2 /Integ_gauss_2 { 30 dict begin /UI 0.577350269189626 def /KX End Start sub 2 div def /KF { KX mul Start End add 2 div add F } def UI KF -1 UI mul KF add KX mul end } def % n=3 /Integ_gauss_3 { 40 dict begin /UI 0.774596669241483 def /KX End Start sub 2 div def /KF { KX mul Start End add 2 div add F } def UI KF -1 UI mul KF add 0.5555555555555556 mul 0.0 KF 0.888888888888889 mul add KX mul end } def % n=4 /Integ_gauss_4 { 50 dict begin /KX End Start sub 2 div def /KF { KX mul Start End add 2 div add F } def /U1 0.861136311594053 def /U2 0.339981043584856 def U1 KF -1 U1 mul KF add 0.347854845137454 mul U2 KF -1 U2 mul KF add 0.652145154862546 mul add KX mul end } def % n=5 /Integ_gauss_5 { 60 dict begin /KX End Start sub 2 div def /KF { KX mul Start End add 2 div add F } def /U1 0.906179845938664 def /U2 0.538469310105683 def U1 KF -1 U1 mul KF add 0.236926885056189 mul U2 KF -1 U2 mul KF add 0.478628670499366 mul add 0 KF 0.568888888888889 mul add KX mul end } def /inch { 72 mul } def /cm { inch 2.54 div } def % main gsave mark 1 cm 1 cm scale 0 setlinewidth /tx 1 def tx tx Integ moveto (tyuten) = tx Integ = 9 { /tx tx 1 add def tx tx Integ lineto tx Integ = } repeat 1 0 0 setrgbcolor stroke /tx 1 def tx 1 add tx Integ_daikei moveto (daikei) = tx Integ_daikei = 8 { /tx tx 1 add def tx 1 add tx Integ_daikei lineto tx Integ_daikei = } repeat 0 1 0 setrgbcolor stroke (gauss) = 2 Integ_gauss_2 moveto Integ_gauss_2 = 3 Integ_gauss_3 lineto Integ_gauss_3 = 4 Integ_gauss_4 lineto Integ_gauss_4 = 5 Integ_gauss_5 lineto Integ_gauss_5 = 0 0 1 setrgbcolor stroke 0 9 moveto 10 9 lineto 0 0 0 setrgbcolor stroke 1 1 cm div 1 1 cm div scale cleartomark end grestore showpage

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.5

>PSで書かせるというのと質問のレベルにギャップがありすぎるから 全然ギャップないように思うのは 普段,手書きでPSもしてるからかな(苦笑). RPNはそれなりに楽しい. #ドライバに引き渡されるPSのライブラリを自前で直すという #比較的不毛な作業が存在したりする・・・・

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

別に誰もPSでプログラムが書けないなんて書いてないんだけどねえ。 PSで書かせるというのと質問のレベルにギャップがありすぎるから 確認したんだけど。 まあいいや。

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

PostScriptは 単に「表示系」が「印刷向け」というだけで 印刷専用言語ではないです. PostScriptで書かれたhttpサーバとかライフゲームまであるくらい(笑). さてさて・・・それにしても マニアックな課題というか, 確かにスタックの挙動を見るにはいいのかも. それとPSの処理系として何を使ってますか? たぶん,GhostScriptですかね 丸投げで削除されるかもしれないけどね. うんじゃ,取りあえず簡単なものだけ y=x^2 で[0,1]でn分割,分点として下端をとって 下積分でも計算しますか /f { dup mul } def /int { /n exch def /I 0 def 0 1 n 1 sub { n div f 1 n div mul I add /I exch def} for I } def 100 int %100分割 1000 int %1000分割 局所変数とか辞書とかいろいろ使って もっと汎用的にしてください.

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.2

PostScriptは一応チューリング完全なので課題で出たことも出来ます。中にはPostScriptで別の言語のインタープリタを作った方までいます。 http://blog.bugyo.tk/lyrical/2008/01/_o_lisppostscriptlisp.html で、PostScriptである理由はスタック型の言語の代表として出たのではないかと思います。 次に定積分ですが、高校で習うような式変形はコンピューター上では行いにくいので積分区間を微小区間に区切り微小区間を台形や長方形で近似しその面積の総和をその区間における積分とする数値積分を行います。台形則や中点則は数値積分の手法です。台形則は微小区間を台形で近似し中点則は長方形で近似します。 中点則で行くと F(x)=rΣf(x_i) となります。ここでrは微小区間の区間幅、x_iは微小区間のi番目における中点のx座標です。 後はこれをリファレンス片手にPostScriptに落とし込んでください。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>詳しくて大まかな手順と 詳しいのか、大まかなのかどっち?w それと、PostScriptってプリンタとかディスプレイに 図形を描画するためのもの(文字も「描画」する)なので >プログラミングができた際に正しいか確認するための数字をいくつか 問題文に見落としがあるような気がします。 あるいは前提条件があるとか。 それにしたって PostScriptなんて普通は手書きのプログラムで使うものじゃないから 回答を教えてくれといってもできる人がいないんじゃないかなあ。 丸投げもいいところだし。

関連するQ&A