怎么写Python这个,应该用π的方法类似写吧

img


好像是要用求π的方法来写代码,但我蒙住了,定积分的做法咋办呢??

定积分就是求曲线在值域期间内与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相加,这种当然是会有误差的