Google Colaboratory で、標準正規分布の確率密度関数の積分、出来ましたよ。以下、参考まで。
追記
コメントに対する回答です。コメントいただいてから調べましたが、lambdify というのを使うと、不定積分の結果を、pythonの関数(というか、callableオブジェクト)として取り出せるようです。
python
1from sympy import *
2
3x = Symbol('x')
4f = (1/sqrt(2*pi)) * exp(-(x**2 / 2)) # 標準正規分布の確率密度関数
5
6F = integrate(f, x) # f の不定積分を求める
7print(F) # => erf(sqrt(2)*x/2)/2
8print()
9
10F1 = lambdify(x, F) # Fをpythonの関数化したものを取得
11
12# 検算のため、erf(sqrt(2)*x/2)/2 を scipy.erf と math.sqrt から求める関数を作る
13from scipy.special import erf
14import math
15
16def F2(x):
17 u = (math.sqrt(2) / 2) * x
18 return erf(u) / 2
19
20
21# F1(x) と F2(x) とが同じ結果を返すことの確認
22print(F1(0), '/', F2(0))
23print(F1(1), '/', F2(1))
24print(F1(2), '/', F2(2))
25
26# x=5 あたりから 0.5 に漸近する。
27print(F1(5), '/', F2(5))
28print(F1(6), '/', F2(6))
29print(F1(7), '/', F2(7))
30print(F1(8), '/', F2(8))
31print(F1(9), '/', F2(9))
32print(F1(10), '/', F2(10))
33print(F1(100), '/', F2(100))
34
35# F は奇関数なので、xの符号を変えると、結果もマイナスになる。
36print(F1(-100), '/', F2(-100))
erf(sqrt(2)*x/2)/2
0.0 / 0.0
0.3413447460685429 / 0.3413447460685429
0.4772498680518208 / 0.4772498680518208
0.49999971334842813 / 0.49999971334842813
0.49999999901341236 / 0.49999999901341236
0.4999999999987202 / 0.4999999999987202
0.4999999999999994 / 0.4999999999999994
0.5 / 0.5
0.5 / 0.5
0.5 / 0.5
-0.5 / -0.5
上記の結果は、標準正規分布の確率密度関数を-∞から+∞まで定積分(もとい、広義積分)した値は、確率密度関数の性質上、1 ですが、この1は、上記のコードで求めた、F1(x)
によって、a
を十分大きな正の数(といっても、上記の結果から、a=9 程度のことですが。)として、
F1(a) - F1(-a) = 0.5 - (-0.5) = 1
と算出される結果に合致しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/05 13:47
退会済みユーザー
2021/11/05 16:11 編集
2021/11/06 09:29
退会済みユーザー
2021/11/06 13:59