蒙特卡洛方法的简单应用

news2024/9/22 14:25:40
  • 蒙特卡洛方法的简单应用

圆周率估算

eastimate pi
python version 3.11
RNG:np.random.random

import os
figure_save_path = "file_fig"
import warnings
warnings.filterwarnings("error")
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from PIL import Image

def main(times=100):
    print("RNG:", "Python numpy.random.random")
    print("开始估算")
    Nlist = [1000000*i for i in range(1, times)]
    Pilist = []
    Slist  = []
    gif_frames = []

    for i in range(1, times):
        N = Nlist[i-1]
        random_points = np.random.random((2, N))
        radius = sum(random_points[:]**2)
        count = np.sum(radius<=1)
        ave = count/N
        S2 = ((N-count)*ave**2+count*(1-ave)**2)/(N-1)
        S  = S2**0.5 
        Pilist.append(4*ave)    
        Slist.append(4*S/N**0.5)

        plt.xlabel("test_times")
        plt.ylabel("estimate_pi_value", rotation=90)
        plt.title("Estimate Pi")
        plt.errorbar(Nlist[:i], Pilist[:i], Slist[:i], label="estimate pi", c="green")
        plt.axhline(np.pi,label="exact pi", c="red")
        plt.legend()
        if not os.path.exists(figure_save_path):
            os.makedirs(figure_save_path)
        else:
            pass
        plt.savefig(os.path.join(figure_save_path, str(i) + ".jpg"))  
        plt.cla()
     
        img = Image.open(os.path.join(figure_save_path, str(i) + ".jpg"))
        gif_frames.append(img)
    print("估算完成")
    print("开始绘制动画")
    gif_frames[0].save("estimate-pi.gif",
        save_all=True, append_images=gif_frames[1:], duration=200, loop=0)
    print("动画绘制完成")
    
main()
input("press any key to exit")
  • 动画

二维积分估算

  • 2dintegral
  • RNG:numpy.random.random
  • Python version:3.11
  • 允许积分类型 \int\int f(x,y)dxdy

    

  • 若实现手动输入方程功能会增加程序解析负担,大约是十倍左右,故不予实现
  • 若需要实现,可以仿照如下例子:
def main(X_start=0, X_end=1, Y_start=0, Y_end=1):
    print("RNG:numpy.random.random")
    print("")
    funstr = input("输入方程")
    #funstr = "x**2*y**2"
    f = lambda x,y: eval(funstr)
    #f = lambda x,y:x**2*y**2
    print("运算开始")
    
    N = 10000
    
    start = time.time()
    random_xpoints = np.random.uniform(X_start, X_end, N)
    random_ypoints = np.random.uniform(Y_start, Y_end, N)

    X = np.arange(X_start, X_end, 100)
    Y = np.arange(Y_start, Y_end, 100)

    guess = np.array(list(map(f, random_xpoints, random_ypoints)))

    ave = sum(guess)/N
    I = ave*(X_end-X_start)*(Y_end-Y_start)

    S2 = sum((guess-ave)**2)/(N-1)
    S  = S2**0.5
    end = time.time()
    
    print(I, "\pm", S/N**0.5)
    print("运算结束,用时:", round(end-start, 4))

拒绝抽样方法

import os
figure_save_path = "file_fig"
import warnings
warnings.filterwarnings("error")
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from PIL import Image
from copy import deepcopy

plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False

######
#待抽样分布x~f(x)
#已有分布g(x)
#建议分布c*g(x)
#在概率空间有c*g(x)恒大于f(x)

#step 1 按f(x)抽样 得x,x_i~f(x) x.size 
#step 2 生成u,u_i~U[0, max(c*g(x))] u.size = x.size
#step 3 从x中选取满足u_i<f(x_i)的样本
######

f1 = lambda x:0.3/np.sqrt(np.pi*2)*np.exp(-(x+2)**2/2) +\
              0.7/np.sqrt(np.pi*2)*np.exp(-(x-4)**2/2)

x_start = -10
x_end   =  10

def main(f1=f1, x_start=x_start, x_end=x_end, N = int(1e+7), maxiter = 1000):

    #已有分布为 numpy.random.random 导出的均匀分布
    
    num_wanted  = deepcopy(N)
    result = np.zeros(num_wanted)
    
    has_get_num = 0
    itertimes   = 0
    random_num  = np.zeros(N)
    x           = np.arange(x_start, x_end, 0.01)
    
    if N >= int(1e4):
        N = int(num_wanted /10)
    else:
        pass
    
    while has_get_num < num_wanted:
        itertimes += 1
        if itertimes >= maxiter:
            print("无法生成足够多的随机数")
            break
        else:
            pass

        #拒绝方法:cg(x)<=f(x)        
        sample_try = np.random.random(N)
        sample_try = (x_end - x_start) * sample_try + x_start

        sample_test= f1(sample_try)
        c = 1 + max(f1(x))
        sample_test *= c
        
        sample_help = np.random.random(N) * (max(sample_test)-0) + 0
        
        sample = sample_try[sample_help<sample_test]

        if has_get_num + sample.size > num_wanted:
            result[has_get_num:num_wanted-1] = sample[:num_wanted-has_get_num-1]
        else:
            result[has_get_num:has_get_num+sample.size] = sample

        has_get_num += sample.size

    plt.title("随机数生成分布")
    plt.xlabel("随机数")
    plt.ylabel("比例")
    plt.plot(x, f1(x), color='red', label="待抽样分布", linewidth=2)
    plt.hist(result, bins=200, label="随机数柱状分布图", color='green', density=True)
    plt.legend(prop={'size': 10})
    plt.pause(0.01)
    if not os.path.exists(figure_save_path):
        os.makedirs(figure_save_path)
    else:
        pass
    plt.savefig(os.path.join(figure_save_path, "随机数生成分布" + ".jpg"))
    return result

c = main()

多维随机向量的抽样

  • 拒绝抽样方法
  • 条件密度抽样方法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

温度在线检测技术在电力电缆线路的应用

在电力电缆的日常运行检测中&#xff0c;针对电缆温度的状况&#xff0c;所采用的电力温度在线检测技术也得到了大范围的普及。电网系统中&#xff0c;其单位时间内可输送的电力能源受到其温度的变化影响。因此&#xff0c;采用更有效的方式实时检测电缆系统运行温度&#xff0…

虾皮商品链接获取虾皮商品详情数据(用 Python实现虾皮商品信息抓取)

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取虾皮网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;虾皮网站…

miRNA测序数据生信分析——第三讲,已知物种的生信分析实例

miRNA测序数据生信分析——第三讲&#xff0c;已知物种的生信分析实例 miRNA测序数据生信分析——第三讲&#xff0c;已知物种的生信分析实例1. 下载测序数据2. 原始数据质控——软件fastqc3. 注释tRNA和rRNA&#xff0c;使用Rfam数据库——软件blast&#xff0c;Rfam_statisti…

MySQL数据库技术笔记(3)

概述 学习MySQL数据库技术其实只需要安装mysql服务器就可以使用了。只不过对于初学者来说直接操作dos窗口方式比较麻烦&#xff0c;命令不熟悉&#xff0c;导致经常写错。在真实的开发当中直接操作dos窗口效率比较慢&#xff0c;企业中也会经常使用一些mysql数据库支持的可视化…

【VR开发】【Unity】0-课程简介和概述

【说明】 这是我录制的一套VR基础开发课程的文字版本&#xff0c;更加便于快速参考。 应大家在后台所提的需求&#xff0c;从今天开始&#xff0c;我计划带给大家一套完整达40课时的VR开发基础课程。 在开始学习前需要注意如下几点&#xff1a; 本教程基于Unity2022.2.1f1版…

【Python 零基础入门】基础语法

【Python 零基础入门】第四课 基础语法 【Python 零基础入门】第四课 基础语法怎么写 Python 代码缩进注释Python 标识符规则Python关键字代码行和块导包 字符串操作字符串连接字符串的其他常用方法 循环for 循环while 循环 判断语句比较运算符逻辑运算符if 判断三元表达式brea…

【已解决】ORA-01722: invalid number

文章目录 ORA-01722: invalid number问题思路解决 ORA-01722: invalid number 问题 invalid number 字符与数值不匹配 oracle 截取 ‘1-2’ 只需要’-前面的 思路 一、问题提示 执行Oracle的sql语句提示【ORA-01722: invalid number】无效数字错误。 二、问题分析 2.1、类…

共模电感在EMC电路里有哪些原理及作用?|深圳比创达EMC

共模电感在EMC电路里有哪些原理及作用&#xff1f;相信不少人是有疑问的&#xff0c;今天深圳市比创达电子科技有限公司就跟大家解答一下&#xff01; 一、共模电感在EMC电路里的作用 EMC电路设计中共模干扰问题居多&#xff0c;所以共模电感很常见。共模电感是可以抑制共模干…

亚马逊“黑五网一”大促开启!如何抓住流量密码实现爆单?

亚马逊“黑五网一”大促从起10月30日正式开始&#xff0c;对比往年活动周期增加至11天&#xff0c;作为海外电商年度盛宴&#xff0c;将覆盖Choice day年度盛典、双十一、黑色星期五三大营销节点&#xff0c;备受全民瞩目。 去年&#xff0c;仅是美国消费者在“黑五”期间消费…

golang使用energy开发GUI桌面程序,CEF,LCL

1、概述 仓库&#xff1a;https://github.com/energye/energy 文档&#xff1a;https://energy.yanghy.cn/ Energy 是 Go 基于 CEF(Chromium Embedded Framework) 开发的框架&#xff0c;内嵌 CEF 二进制 使用 Go 和 Web 端技术 ( HTML CSS JavaScript ) 构建支持Windows, …

配电室六氟化硫气体泄漏报警装置安装位置

六氟化硫气体泄漏报警装置安装位置产品的设计、检验、制造均遵循GB16808-2008《可燃气体报警控制器》和GB12358-2006《作业场所环境气体检测报警仪通用技术要求》严格设计。是经过高速CPU数据处理&#xff0c;通过LCD显示出探测器的浓度、状态并输出相应的控制信号。报警控制器…

什么是 API 接口?给大家举例说明

Api 接口也就是所谓的应用程序接口&#xff0c;api 接口的全称是 Application Program Interface&#xff0c;通过 API 接口可以实现计算机软件之间的相互通信&#xff0c;开发人员可以通过 API 接口程序开发应用程序&#xff0c;可以减少编写无用程序&#xff0c;减轻编程任务…

KdMapper扩展实现之SOKNO S.R.L(speedfan.sys)

1.背景 KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动&#xff0c;本文是利用其它漏洞&#xff08;参考《【转载】利用签名驱动漏洞加载未签名驱动》&#xff09;做相应的修改以实现类似功能。需要大家对KdMapper的代码有一定了解。 2.驱动信息 驱动名称spee…

JavaScript算法43- 分类求和并作差(leetCode:100103easy)周赛

2894. 分类求和并作差 一、题目 给你两个正整数 n 和 m 。 现定义两个整数 num1 和 num2 &#xff0c;如下所示&#xff1a; num1&#xff1a;范围 [1, n] 内所有 无法被 m 整除 的整数之和。num2&#xff1a;范围 [1, n] 内所有 能够被 m 整除 的整数之和。 返回整数 num1…

Spring Cloud 微服务系列文章合集,一次性看个够!

微服务架构图 为了方便大家可以直接下载编辑&#xff0c;这里用的ProcessOn画的架构图&#xff0c;可以直接克隆一个出来进行编辑&#xff0c;地址&#xff1a;https://www.processon.com/view/6523a1b37fde9c4bb35c7278 微服务系列文章合集&#xff0c;点击阅读 Spring Cl…

CAD(计算机辅助设计)软件的开发框架

CAD&#xff08;计算机辅助设计&#xff09;软件的开发通常使用特定的CAD开发框架和工具。这些框架提供了一组API&#xff08;应用程序编程接口&#xff09;和开发工具&#xff0c;使开发人员能够创建自定义插件、应用程序和功能。以下是一些常见的CAD开发框架和平台&#xff0…

linux系统配置Samba实现与Windows系统的文件共享

1.linux系统下载安装Samba sudo apt install samba 2.在linux文件系统中创建一个共享目录(通常在用户目录下面创建一个名为share的目录) mkdir share 3.修改samba配置文件 sudo vim /etc/samba/smb.conf 添加配置信息(path share路径,需要修改) ,保存修改 [Share]comm…

MySQL-3(9000字详解)

一&#xff1a;索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.1索引的意义 索引的意义&#xff1a;加快查找速度&#xff0c;但需要…

什么是嵌入式Linux?

什么是嵌入式Linux&#xff1f; 对于很多电气、电信、通信专业的同学来说&#xff0c;对口专业就业方向主要有软、硬件两个方向。无论是对于学生还是就业而言&#xff0c;软硬件的开发学习&#xff0c;嵌入式物联网在近年来无疑是一个摆在面前的“香饽饽”。 近年来国家社会愈…

百花齐放:解锁大型语言模型的潜力 | 开源专题 No.32

这一系列开源项目共同特点在于它们提供多模型支持、具备可定制性、开源可自由修改、并且提供多功能性&#xff0c;为用户提供了灵活、强大的AI聊天和模型访问工具&#xff0c;为AI交互和实验提供了广泛的选择和创新机会。 jtsang4/claude-to-chatgpt Stars: 2.3k License: MI…