定积分就是求曲线在值域期间内与x轴围蔽的面积。矩形法就是将这个面积拆分成一个一个小矩形然后累计矩形面积。这也是微积分的原始思想。蒙特卡洛则是利用概率的频率思想,统计有多少点在围蔽图形内,有多少点在围蔽图形外,从而求出围蔽图形占整个矩形额比例。
我帮你实现了一版,供你参考。如果对你有帮助,望采纳
import math
import random
def linear(x: float) -> float:
return x
def early_pause(x: float) -> float:
return x + (1 - math.sin(x * 2 * math.pi + math.pi / 2)) / (-8)
def late_pause(x: float) -> float:
return x + (1 - math.sin(x * 2 * math.pi + math.pi / 2)) / 8
def slow_wave(x: float) -> float:
return x + (math.sin(x * 5 * math.pi)) / 20
def fast_wave(x: float) -> float:
return x + (math.sin(x * 20 * math.pi)) / 80
def power(x: float) -> float:
return math.pow(x + (1 - x) * 0.03, 2)
def inverse_power(x: float) -> float:
return 1 + math.pow(1 - x, 1.5) * (-1)
def fast_power(x: float) -> float:
return math.pow(x + (1 - x) / 2.0, 8)
def inverse_fast_power(x: float) -> float:
return 1 + math.pow(1 - x, 3) * (-1)
def rectangle(f, x0, x1, delta):
s = 0
x = x0
while x < x1:
y = f(x+delta/2)
s += (y * delta)
x += delta
return s
def mcmc(f, x0, x1, n):
p = 0
for i in range(n):
_x = x0 + random.random() * (x1 - x0)
_y = x0 + random.random() * (x1 - x0)
y = f(_x)
if _y <= y:
p += 1
r = float(p) / n
return r * ((x1 - x0) ** 2)
def main():
step = 0.05 # 矩形步长
n = 10000 # 迭代次数
x0 = 0
x1 = 1
func_list = [linear, early_pause, late_pause, slow_wave, fast_wave, power, inverse_power, fast_power,
inverse_fast_power]
print("\t" * 11 + "矩形法\t\t蒙特卡洛模拟法")
for f in func_list:
s1 = rectangle(f, x0, x1, step)
s2 = mcmc(f, x0, x1, n)
print("{:20s}在值域[{}, {}]的定积分为: {:8f}\t\t{:8f}".format(f.__name__, x0, x1, s1, s2))
if __name__ == "__main__":
main()
这跟π有什么关系
无非两种办法
一种是先把积分解出来,变成一个不带积分符号的表达式,然后直接求解
另一种是取足够小的步进当做微分,然后循环每个x求得y相加,这种当然是会有误差的