首页 > 编程语言 >【学习笔记】Matlab和python双语言的学习(蒙特卡洛法)

【学习笔记】Matlab和python双语言的学习(蒙特卡洛法)

时间:2024-08-04 19:25:33浏览次数:15  
标签:概率 python else 学习 改变 Matlab np 蒙特卡洛 主意

文章目录


前言

通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=22&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、蒙特卡洛

  • 蒙特卡洛严格意义上讲并不是一种算法模型,它是一种概率统计的思想方法,没有通用的代码,每个问题对应的代码都是不同的。
  • 蒙特卡罗法又称统计模拟法,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。
  • 只要求解的问题与概率模型有关联,就可以用蒙特卡洛法。

二、经典示例:计算圆周率 π

  • 一个经典的蒙特卡洛方法的示例是计算圆周率 π。通过在单位正方形内随机生成点,估计圆的面积来逼近 π 的值。
  • 步骤:
    1.在正方形[0,2]x[0,2] 内随机生成大量点。
    2.计算这些点中有多少点落在单位圆(圆心为 (1,1),半径为 1)内。
    3.单位圆的面积是 π,正方形的面积是 4,因此可以通过以下公式估计 π:
    π ≈ 圆内点的数量 总点数 × 4 \pi\approx\frac{\text{圆内点的数量}}{\text{总点数}} \times 4 π≈总点数圆内点的数量​×4

1.代码实现----Matlab

clear;clc
% 参数初始化:投放10000个点,圆的半径为1,圆心坐标(1,1)
% 初始时还未投放点,有0个点在圆内
p = 100000; r = 1; x0 = 1; y0 = 1; n = 0;
hold on
for i = 1:p
    px = rand*2;
    py = rand*2;
    if (px-1)^2 + (py-1)^2 < 1
        plot(px,py,'.','Color',"b")
        n = n + 1;
    else
        plot(px,py,'.','Color',"r")
    end
end
axis equal

s = (n/p)*4;
pi0 = s;

运行结果图:
在这里插入图片描述
在这里插入图片描述

2.代码实现----python

import matplotlib.pyplot as plt
import random
import numpy as np
# 计算圆周率
# 参数初始化:投放10000个点,圆的半径为1,圆心坐标(1,1)
# 初始时还未投放点,有0个点在圆内
p = 100000
r = 1
x0 = 1
y0 = 1
n = 0
# 设置绘图窗口
plt.figure()
plt.title('Monte Carlo Simulation for Esitimation Pi')
plt.xlabel('x')
plt.ylabel('y')
for i in range(p):
    px = np.random.rand() * 2
    py = np.random.rand() * 2
    if (px - x0) ** 2 + (py - y0) ** 2 < r ** 2:
        plt.plot(px,py,'.',color = 'b')
        n = n + 1
    else:
        plt.plot(px,py,'.',color = 'r')
plt.axis ('equal')
plt.show()

s = n / p * 4
pi0 = s

运行结果图:
在这里插入图片描述
在这里插入图片描述

三、示例2:三门问题

  • 你参加一档电视节目,节目组提供了A、B、C三扇门,主持人告诉你,其中一扇门后边有辆汽车,其他两扇门后面是一头山羊,你可以选择一扇门打开获得门后的东西。
    假如你选择了B门,这时,主持人打开了C门,让你看到C门后是只山羊,然后问你要不要改选A门?(你想要汽车)

这个问题在概率论中是一个条件概率的问题,类似于在排除一个错误选项后,选择到正确选项的概率是多少。求解的问题与概率模型有关,我们使用蒙特卡洛法。

1.代码实现----Matlab

(1)有条件概率

clear;clc
% randi([a,b],m,n)  函数可在指定区间[a,b]内随机取出大小为m*n的整数矩阵
randi([1,5],5,8) % 在区间[1,5]内随机取出大小为5*8的整数矩阵

% 字符串的连接方式:(1)['字符串1','字符串2']  (2)strcat('字符串1','字符串2')

n = 100000;
a = 0;  % 不改变注意能赢的次数
b = 0;  % 改变注意能赢的次数
for i = 1:n
    x = randi([1,3]);    % 有车的那扇门
    y = randi([1,3]);   % 我们选择的那扇门
    if x == y
        a = a + 1; b = b + 0;    % 不改变主意能赢
    else
        a = a + 0; b = b + 1;    % 改变主意能赢
    end
end
disp(['使用蒙特卡洛方法得到不改变主意能赢的概率是', num2str(a/n)]);
disp(['使用蒙特卡洛方法得到改变主意才能赢的概率是', num2str(b/n)]);

运行结果:
在这里插入图片描述
在这里插入图片描述
(2)无条件概率(考虑没有获奖的情况)

clear;clc
% 考虑失败的情况
n = 100000;
a = 0;  % 不改变注意能赢的次数
b = 0;  % 改变注意能赢的次数
c = 0;  % 没有获奖的次数
for i = 1:n
    x = randi([1,3]);    % 有车的那扇门
    y = randi([1,3]);   % 我们选择的那扇门
    change = randi([0,1]);   % 改变主意是1,不改变主意是0
    if x == y   % 不改变才能赢
        if change == 0   % 不改变主意是0
            a = a + 1; b = b + 0; c = c + 0;  
        else
            a = a + 0; b = b + 0; c = c + 1;   
        end
    else        % 改变才能赢
        if change == 0   % 不改变主意是0
            a = a + 0; b = b + 0; c = c + 1;    
        else            % 改变主意是1
            a = a + 0; b = b + 1; c = c + 0;   
        end
    end
end
disp(['使用蒙特卡洛方法得到不改变主意能赢的概率是', num2str(a/n)]);
disp(['使用蒙特卡洛方法得到改变主意才能赢的概率是', num2str(b/n)]);
disp(['使用蒙特卡洛方法不获奖的概率是', num2str(c/n)]);

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码实现----python

(1)有条件概率

import numpy as np

n = 10000
a = 0   # 不改变主意能获胜的次数
b = 0   # 改变主意能获胜的次数

for i in range(n):
    x = np.random.randint(1,4)      #随机生成1-3的整数
    y = np.random.randint(1,4)
    if x == y:
        a += 1
    else:
        b += 1

print("使用蒙特卡洛方法得到不改变主意能赢的概率是", a/n)
print("使用蒙特卡洛方法得到改变主意能赢的概率是", b/n)

运行结果:

在这里插入图片描述
(2)无条件概率(考虑没有获奖的情况)

import numpy as np

n = 10000
a = 0   # 不改变主意能获胜的次数
b = 0   # 改变主意能获胜的次数
c = 0   # 不获胜的次数
for i in range(n):
    x = np.random.randint(1,4)      #随机生成1-3的整数
    y = np.random.randint(1,4)
    change = np.random.randint(0,2)  # % 改变主意是1,不改变主意是0
    if x == y:
        if change == 0:
            a += 1
        else:
            c += 1
    else:
        if change == 0:
            c += 1
        else:
            b += 1

print("使用蒙特卡洛方法得到不改变主意能赢的概率是", a/n)
print("使用蒙特卡洛方法得到改变主意能赢的概率是", b/n)
print("使用蒙特卡洛方法不能赢的概率是", c/n)

运行结果:

在这里插入图片描述

  • 蒙特卡洛适用于概率统计的问题,但得出的结果只能用作估计,并不是一个精确的数值。代码中每次生成的随机数不同也会造成结果上的差异。使用蒙特卡洛法,当测试的数量足够大时,得出的结论才会更精确。

总结

本文介绍了使用蒙特卡洛法解决与概率统计有关联的问题。分析了两个示例,并分别使用Matlab和python进行代码编写。

标签:概率,python,else,学习,改变,Matlab,np,蒙特卡洛,主意
From: https://blog.csdn.net/m0_65032457/article/details/140880739

相关文章

  • 科大讯飞P30、小度K16、优学派U59区别 2024最具性价比学习机推荐
    科大讯飞AI学习机P30是一款为小学到高中学生设计的全能型学习平板。它配备了6GB的运行内存和256GB的存储空间,能够轻松运行各种学习应用和存储大量学习资料。11英寸的大屏幕采用护眼设计,能够有效减少蓝光辐射,保护学生视力。P30覆盖了从小学到高中的全科目课程,配合科大讯飞的AI技术,......
  • 科大讯飞学习机c10s和p30怎么选
    科大讯飞学习机P30和C10两者区别主要在硬件配置方面;软件的核心功能差别不大,都搭载了星火大模型、精准学、及1对1英语口语陪练等。硬件上:1、科大讯飞学习机P30屏幕更大些,是10.95英寸屏幕(近11英寸大小),科大讯飞学习机C10是10.1英寸2、科大讯飞学习机P30定配的是二代作答笔(白色),科大......
  • python-查找元素3(赛氪OJ)
    [题目描述]有n个不同的数,从小到大排成一列。现在告诉你其中的一个数x,x不一定是原先数列中的数。你需要输出最后一个<=x的数在此数组中的下标。输入:输入共两行第一行为两个整数n、x。第二行为n个整数,代表a[i]。输出:请你输出最后一个<=x的数在此数组中的下标。样例输入1541......
  • C语言学习----常用函数
    1.输入输出:scanf输入printf输出格式:scanf("格式控制符",变量的地址);printf(“格式控制符”,变量);注意变量的地址和变量不同,变量的地址用取址符&加变量名组成例如&a;inta;scanf("%d",&a);printf("%d",a);这段代码会要求从控制台输入一个整数,然后输出它。格式控制......
  • C语言零基础学习笔记12——数组(一)
    本节大纲一、数组的概念二、一维数组的创建和初始化三、一维数组的使用四、一维数组在内存中的储存五、sizeof计算数组元素个数一、数组的概念        数组的概念是一组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:1、数组中存放的是1个......
  • Python3 第六十一课 -- 实例三十
    目录一.堆排序二.计数排序一.堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。defheap......
  • Python3 第六十课 -- 实例二十九
    目录一.冒泡排序二.归并排序一.冒泡排序冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名......
  • 记录我在嵌入式学习中的一些经历,建议
    一.内容概括1.1嵌入式介绍1.2嵌入式开始学习阶段1.3入门阶段1.4提高阶段1.5自主寻找方向阶段1.6总结 二.正文 2.1嵌入式介绍:不过多赘述定义:嵌入式系统是一种集成了计算机硬件和软件,并嵌入到专用设备中,以实现对设备控制、监视或辅助操作的系统。特点:专用性:针对特......
  • 使用python对Excel表格某个区域保存为图片
    实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下:pyexcel:pyexcel是......
  • Python Matplotlib Quiver 绘制向量场
    我正在尝试使用Matplotlib的quiver函数绘制引力矢量场,我有一个函数可以计算由任意数量的质量引起的引力场,但是在绘制它时,我在质量位置周围得到了奇怪的结果。出于矢量绘图的目的,该函数返回x和y方向上的场分量、它们的x和y坐标以及2D场数组,这对于绘图不是必需的,但对......