【建模算法】蒙特卡罗模拟法(Python实现)

目录

【建模算法】蒙特卡罗模拟法

01 算法用途

02 实例分析

03 模拟求近似圆周率

04用蒙特卡罗法估算定积分



【建模算法】蒙特卡罗模拟法

01 算法用途

蒙特卡罗(Monte Carlo)方法,也称为随机模拟(random simulation)。

基本思想:为了解决数学、物理、工程技术等方面的问题,首先建立一个概率模型或随机过程,使它的参数等于问题的解;然后通过对模型或过程的观察或抽样试验来计算所求参数的统计特征,最后给出所求解的近似值。

02 实例分析

本文将以简单案例的形式介绍蒙特卡罗的用法

  • 模拟寻求近似圆周率

  • 用蒙特卡罗法估算定积分

03 模拟求近似圆周率

绘制单位圆和外接正方形,正方形ABCD的面积为:2^2=4 ,圆的面积为:S=\pi*1^{2}=\pi,现在模拟产生在正方形ABCD中均匀分布的点n个,如果这n个点中有m个点在该圆内,则圆的面积与正方形ABCD的面积之比可近似为m/n;

\frac{\pi}{4}\approx \frac{m}{n}=>{\pi}\approx \frac{4m}{n}

模拟图:

 

运行时间是: 14.61761s

Python源码:
#模拟求近似圆周率
import numpy as np
from random import random
from time import perf_counter
import matplotlib.pyplot as plt

start=perf_counter()       #计时开始
num=np.arange(0,20000,10)    #抛点数序列
mypi=np.ones((1,len(num)))
mypi=mypi[0]    #模拟值
for j in range(1,len(num)):
    n=num[j]
    m=0
    for i in range(1,n+1):
        if (-1+2*random())**2+(-1+2*random())**2<=1:
            m=m+1    #统计落在圆内点数
    mypi[j]=4*m/n

#作图
plt.figure(figsize=(18, 8))
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
plt.xlim(0, 2500)
plt.ylim(0, 4)
plt.plot(mypi)
plt.plot([0,len(num)*1.1],[np.pi,np.pi],color='r')
plt.text(0,np.pi,'${\pi}$',color='r',fontsize=16)
plt.legend(['模拟π','实际π'])
plt.grid(visible='True')     #在notebook里需要添加此句
plt.grid(linestyle=":", color="r")
plt.show()
print("运行时间是: {:.5f}s".format(perf_counter()-start))

04用蒙特卡罗法估算定积分

利用蒙特卡洛原理求:\int^{1}_{0}{x}^{2}dx=\frac{1}{3} 的定积分

思想:对于\int^{b}_{a}{f(x)}dx ,如果f(x)>0 ,则可以通过模拟的方法计算其定积分.

构造一个矩形包含了曲边梯形d>max(a,b),产生n(足够大)个在矩形区域内的点,如果落在由函数f(x)构成的曲边梯形内的点为m个,则所求定积分为:

\int^{b}_{a}{f(x)}dx=\frac{m}{n}(b-a)d

模拟图:

运行时间是: 5.82076s

Python源码:

import numpy as np
from random import random
from time import perf_counter
import matplotlib.pyplot as plt

start=perf_counter()       #计时开始
num=np.arange(0,10**5,500)    #抛点数序列
s=np.ones((1,len(num)))
s=s[0]    #模拟值
for j in range(1,len(num)):
    n=num[j]
    a,b=0,1
    d=max(a,b)+1
    m=0
    for i in range(1,n+1):
        x=a+random()*(b-a)
        y=d*random()
        if y<=x**2:
            m=m+1
    s[j]=m/n*d*(b-a)

#作图
plt.figure(figsize=(18, 8))
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
plt.xlim(0, 250)
plt.ylim(0, 0.4)
plt.plot(s)
plt.plot([0 ,len(num)*1.1],[1/3,1/3],color='r')
plt.text(0,1/3,'1/3',color='r',fontsize=16)
plt.legend(['模拟','实际1/3'])
plt.grid(visible='True')     #在notebook里需要添加此句
plt.grid(linestyle=":", color="r")
plt.show()
print("运行时间是: {:.5f}s".format(perf_counter()-start))

  • 7
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数学建模是将实际问题抽象为数学模型,并通过数学方法进行求解和分析的过程。它在实际问题的解决中起到了重要的作用。而模拟退火算法是一种全局优化算法,常用于求解复杂的优化问题。下面是一个简单的模拟退火算法Python代码示例: ```python import random import math def simulated_annealing(cost_func, initial_solution, initial_temperature, cooling_rate, max_iterations): current_solution = initial_solution best_solution = current_solution current_temperature = initial_temperature for i in range(max_iterations): new_solution = generate_neighbor(current_solution) current_cost = cost_func(current_solution) new_cost = cost_func(new_solution) if new_cost < current_cost: current_solution = new_solution if new_cost < cost_func(best_solution): best_solution = new_solution else: probability = math.exp((current_cost - new_cost) / current_temperature) if random.random() < probability: current_solution = new_solution current_temperature *= cooling_rate return best_solution def generate_neighbor(solution): # 生成邻居解的方法,根据具体问题进行定义 pass def cost_func(solution): # 计算解的成本函数,根据具体问题进行定义 pass # 使用示例 initial_solution = [1, 2, 3, 4, 5] initial_temperature = 100 cooling_rate = 0.95 max_iterations = 1000 best_solution = simulated_annealing(cost_func, initial_solution, initial_temperature, cooling_rate, max_iterations) print("Best solution:", best_solution) ``` 请注意,上述代码中的`generate_neighbor`函数和`cost_func`函数需要根据具体问题进行定义。`generate_neighbor`函数用于生成邻居解,而`cost_func`函数用于计算解的成本函数。在实际应用中,你需要根据具体的优化问题来编写这两个函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值