利用蒙特卡洛方法计算圆周率并展示结果,要求python(tkinter) + Numpy + Scipy + matplotlib,采用可视化设 计,有菜单界面
时间: 2024-01-03 13:03:04 浏览: 282
用蒙特卡洛方法计算圆周率
5星 · 资源好评率100%
好的,我可以为您编写一个基于蒙特卡洛方法计算圆周率的程序,并使用 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` 绘制散点图并显示圆周率近似值。
您可以运行这个程序,根据提示输入随机点的数量,然后点击计算按钮来计算圆周率近似值。您还可以点击绘制按钮来绘制随机点和圆的散点图,并在图表标题中显示圆周率近似值。在菜单栏中,您可以选择退出程序或查看关于程序的信息。
阅读全文