
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
一応ね。
与式がどーなってるのか分からんのだけど(教えて!gooだと写真が勝手に縮小されるんで、写真上げるより文章で書いた方が結果面倒が少ない)、一応、台形公式のプログラムと・・・多分「合成シンプソン公式」だと思うんだけど、
合成シンプソン公式:
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3 …
のPythonコードは次のようなカンジかな。
# 台形公式
def trapezoidal(f, a, b, n = 1):
def x(k): # 等分割されたk番目のx座標を求めるローカル関数
return a + k*(b - a)/n
if n < 1: # 1分割以下はあり得ないんで、エラー
raise ValueError
xs = [x(k) for k in range(n + 1)] # x_k座標のリスト
ys = [f(x) for x in xs] # x_k座標に対応するyのリスト
return ((b - a)/n) * ((ys[0] + ys[-1])/2 + sum(ys[1:-1]))
# シンプソン公式
def simpson(f, a, b, n = 1):
if n < 1: # 1分割以下はあり得ないんで、エラー
raise ValueError
h = (b - a)/n
xs = [(a + i * h, i) for i in range(n + 1)] # 分割されたx座標とインデックスのリスト
ys = [(f(x[0]), x[1]) for x in xs] # x座標に対応するyとインデックスのリスト
return (h/3) * (ys[0][0] + sum([2 * y[0] if y[1] % 2 == 0 else 4 * y[0] for y in ys[1:-1]]) + ys[-1][0])
これは高階関数として設計されてるんで、fに積分したい関数を入れて計算させます。
積分したい関数を別に作っても良いし、あるいは無名関数(ラムダ式)で与えても良いでしょう。
例えば、
∫(1/x)dx [積分区間はa = 1〜 b = 2]
を計算させたい場合、台形公式で1分割の場合、
>>> trapezoidal(lambda x: 1/x, 1, 2)
0.75
>>>
同じ積分をシンプソンで2分割で計算させたい場合、
>>> simpson(lambda x: 1/x, 1, 2, 2)
0.6944444444444443
>>>
となります。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報