アプリ版:「スタンプのみでお礼する」機能のリリースについて

学校の課題で
y=f(x) の変数xの区間 a<=x<=bの定積分の計算をやるためのプログラムをPostScript言語で書けという課題が出ました。

関数をfとし、台形則か中点則を使うとよい と書かれているのですが、数学が苦手で定積分の解き方すら理解できていません。

どのようにプログラミングすればいいのか、詳しくて大まかな手順と、プログラミングができた際に正しいか確認するための数字をいくつか、教えていただけないでしょうか?

手順と ○○と入力して実行すると××という結果が出る というのをいくつかお願いします

A 回答 (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
    • good
    • 0

>PSで書かせるというのと質問のレベルにギャップがありすぎるから



全然ギャップないように思うのは
普段,手書きでPSもしてるからかな(苦笑).
RPNはそれなりに楽しい.

#ドライバに引き渡されるPSのライブラリを自前で直すという
#比較的不毛な作業が存在したりする・・・・
    • good
    • 0

別に誰もPSでプログラムが書けないなんて書いてないんだけどねえ。


PSで書かせるというのと質問のレベルにギャップがありすぎるから
確認したんだけど。

まあいいや。
    • good
    • 0

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分割

局所変数とか辞書とかいろいろ使って
もっと汎用的にしてください.
    • good
    • 0

PostScriptは一応チューリング完全なので課題で出たことも出来ます。

中にはPostScriptで別の言語のインタープリタを作った方までいます。
http://blog.bugyo.tk/lyrical/2008/01/_o_lisppost …
で、PostScriptである理由はスタック型の言語の代表として出たのではないかと思います。

次に定積分ですが、高校で習うような式変形はコンピューター上では行いにくいので積分区間を微小区間に区切り微小区間を台形や長方形で近似しその面積の総和をその区間における積分とする数値積分を行います。台形則や中点則は数値積分の手法です。台形則は微小区間を台形で近似し中点則は長方形で近似します。
中点則で行くと
F(x)=rΣf(x_i)
となります。ここでrは微小区間の区間幅、x_iは微小区間のi番目における中点のx座標です。
後はこれをリファレンス片手にPostScriptに落とし込んでください。
    • good
    • 0

>詳しくて大まかな手順と



詳しいのか、大まかなのかどっち?w

それと、PostScriptってプリンタとかディスプレイに
図形を描画するためのもの(文字も「描画」する)なので

>プログラミングができた際に正しいか確認するための数字をいくつか

問題文に見落としがあるような気がします。
あるいは前提条件があるとか。
それにしたって PostScriptなんて普通は手書きのプログラムで使うものじゃないから
回答を教えてくれといってもできる人がいないんじゃないかなあ。
丸投げもいいところだし。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!