python打靶法求圆周率_利用蒙特卡洛方法计算圆周率并将撒点分布和π估计值可视化(Python大作业)...

本文介绍了使用Python中的蒙特卡洛方法计算圆周率,并通过matplotlib进行可视化的过程。通过随机撒点和统计落在圆内的点数来估计π的值,然后绘制了不同n值下的散点图和π的估计值折线图。文章还提及了可能的优化方法,如引入Circle patches,但作者未成功实现。
摘要由CSDN通过智能技术生成

这个大作业做的比较简单,其他同学动辄两三百行,我只是出于纯个人兴趣,想了解一下第三方库matplotlib的用法以及更加直观的了解蒙特卡洛方法。

首先是蒙特卡洛方法求圆周率的部分:

>>>import time

>>>import random

>>>import numpy as np

>>>n=1000

>>> for i in range(5):

start=time.perf_counter

x=np.random.rand(n)

y=np.random.rand(n)

d=np.sqrt(np.square(x)+np.square(y))

pi=4*len(d[d<1])/n

end=time.perf_counter()

print("n=%-10iπ的值:%f 耗时:%f"%(n,pi,end-start))

n*=10

本段代码用到numpy库和time库

此处np.random.rand()函数能指定生成n个[0, 1)之间的数据

np.sqrt(np.squre(x)+np.squre(y))将两列表中元素平方后,对应位置元素相加并求平方根

由于蒙特卡洛方法是根据落在圆内点的个数除以总撒点的个数,此处是模拟第一象限内的情况,所以4 * len(d[d<1]) / n即是π的估计值

输出结果如下:

好的,我可以为您编写一个基于蒙特卡洛方法计算圆周率的程序,并使用 Python 的 tkinter、NumPy、SciPy 和 Matplotlib 库进行可视化设计。以下是程序的代码: ```python import tkinter as tk from tkinter import messagebox import numpy as np from scipy.stats import uniform import matplotlib.pyplot as plt class MonteCarloPi: def __init__(self, master): self.master = master self.master.title("Monte Carlo Pi Calculator") # 创建菜单栏 menubar = tk.Menu(self.master) self.master.config(menu=menubar) # 创建文件菜单 file_menu = tk.Menu(menubar) file_menu.add_command(label="Exit", command=self.quit_program) menubar.add_cascade(label="File", menu=file_menu) # 创建帮助菜单 help_menu = tk.Menu(menubar) help_menu.add_command(label="About", command=self.about) menubar.add_cascade(label="Help", menu=help_menu) # 创建主要的界面元素 tk.Label(self.master, text="Number of Random Points:").grid(row=0, column=0, padx=10, pady=10) self.num_points_entry = tk.Entry(self.master) self.num_points_entry.grid(row=0, column=1) tk.Label(self.master, text="Approximation of Pi:").grid(row=1, column=0, padx=10, pady=10) self.pi_label = tk.Label(self.master, text="") self.pi_label.grid(row=1, column=1) self.calculate_button = tk.Button(self.master, text="Calculate", command=self.calculate_pi) self.calculate_button.grid(row=2, column=0, padx=10, pady=10) self.plot_button = tk.Button(self.master, text="Plot", command=self.plot_results) self.plot_button.grid(row=2, column=1, padx=10, pady=10) def calculate_pi(self): # 获取用户输入的点数 try: num_points = int(self.num_points_entry.get()) if num_points <= 0: raise ValueError except ValueError: messagebox.showerror("Error", "Please enter a positive integer for number of random points.") return # 生成随机点的坐标 x = uniform.rvs(size=num_points) y = uniform.rvs(size=num_points) # 判断每个点是否在圆内 dist = np.sqrt(x**2 + y**2) inside_circle = np.sum(dist < 1) # 计算 pi 的近似值 pi_approx = 4 * inside_circle / num_points # 更新结果标签 self.pi_label.config(text=str(pi_approx)) def plot_results(self): # 获取用户输入的点数 try: num_points = int(self.num_points_entry.get()) if num_points <= 0: raise ValueError except ValueError: messagebox.showerror("Error", "Please enter a positive integer for number of random points.") return # 生成随机点的坐标 x = uniform.rvs(size=num_points) y = uniform.rvs(size=num_points) # 判断每个点是否在圆内 dist = np.sqrt(x**2 + y**2) inside_circle = dist < 1 # 绘制散点图 plt.figure(figsize=(6,6)) plt.scatter(x[inside_circle], y[inside_circle], color="blue", s=10, label="Inside Circle") plt.scatter(x[~inside_circle], y[~inside_circle], color="red", s=10, label="Outside Circle") plt.xlim(0, 1) plt.ylim(0, 1) plt.title("Approximation of Pi: {:.6f}".format(4*np.sum(inside_circle)/num_points)) plt.legend() plt.show() def quit_program(self): self.master.quit() def about(self): messagebox.showinfo("About", "Monte Carlo Pi Calculator\n\nWritten by [Your Name]\nJune 2021") if __name__ == "__main__": root = tk.Tk() app = MonteCarloPi(root) root.mainloop() ``` 这个程序使用 `tkinter` 创建了一个 GUI 界面,包括一个菜单栏、一个用于输入随机点数的文本框、一个计算按钮、一个用于显示圆周率近似值的标签和一个绘制结果的按钮。程序还使用 `NumPy` 和 `SciPy` 生成随机点并计算圆周率,然后使用 `Matplotlib` 绘制散点图并显示圆周率近似值。 您可以运行这个程序,根据提示输入随机点的数量,然后点击计算按钮来计算圆周率近似值。您还可以点击绘制按钮来绘制随机点和圆的散点图,并在图表标题中显示圆周率近似值。在菜单栏中,您可以选择退出程序或查看关于程序的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值