《数据挖掘》第一次实验之蒙特克罗算法实现

《数据挖掘》第一次实验之蒙特克罗算法实现


提示:以下是本篇文章正文内容,下面案例可供参考,案例函数为x^3

一、code

import random
import numpy as np
import matplotlib.pyplot as plt

class Monte_Carlo:
    def __init__(self,all_num,num_down,num_up):
        # 一共有多少个大米粒
        self.m = all_num
        # 落在函数区间里的大米粒
        self.n =0
        # 区间下限
        self.down=num_down
        # 区间上限
        self.up=num_up

    #定义原函数
    def func(self,x):
        return x**3

    #随机点
    def Monte(self):
        self.x_inside = []
        self.y_inside = []
        self.x_outside = []
        self.y_outside = []
        for i in range(self.m):
            x = random.uniform(self.down,self.up)
            y = random.uniform(self.down,Monte_Carlo.func(self.up))
            if y <= Monte_Carlo.func(x):
                self.n = self.n + 1
                self.x_inside.append(x)
                self.y_inside.append(y)
            else:
                self.x_outside.append(x)
                self.y_outside.append(y)
        return self.n,self.m
    #画图函数
    def draw(self):
        x = np.linspace(self.down,self.up, 1000)
        y = Monte_Carlo.func(x)
        fig, ax = plt.subplots()
        ax.plot(x, y, 'r-', label='Function')
        ax.set_title("Monte_Carlo")
        ax.scatter(self.x_inside, self.y_inside, s=2, color='b', label='Inside Points')
        ax.scatter(self.x_outside, self.y_outside, s=2, color='g', label='Outside Points')
        ax.legend(loc="upper left")#左上
        plt.show()

if __name__ == '__main__':
    all_num=eval(input("你有多少个大米粒:"))
    num_down=eval(input("区间下限:"))
    num_up = eval(input("区间上限:"))
    Monte_Carlo=Monte_Carlo(all_num,num_down,num_up)
    n,m=Monte_Carlo.Monte()
    #求得面积
    P = n / m
    S_ju=abs(num_up-num_down)*abs(Monte_Carlo.func(num_up)-0)#仅限于区间为单调函数
    print(P*S_ju)
    #绘图
    Monte_Carlo.draw()

二、answer

1、样例①

在这里插入图片描述在这里插入图片描述


2、样例②

在这里插入图片描述

在这里插入图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幻兒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值