继续

not image

```python import math import random import time from concurrent.futures import ThreadPoolExecutor, as_completed from dataclasses import dataclass from typing import Callable, List, Tuple # 装饰器:记录函数执行时间 def timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} executed in {end - start:.4f} seconds") return result return wrapper # 数据类:存储积分结果 @dataclass class IntegrationResult: function_value: float weight: float # 计算三维积分的函数 @timer def monte_carlo_integration(function: Callable[[float, float, float], float], num_samples: int, xmin: float, xmax: float, ymin: float, ymax: float, zmin: float, zmax: float) -> float: """ 使用蒙特卡洛方法计算三维积分。 Args: function (Callable[[float, float, float], float]): 被积函数。 num_samples (int): 采样点数。 xmin (float): x轴下限。 xmax (float): x轴上限。 ymin (float): y轴下限。 ymax (float): y轴上限。 zmin (float): z轴下限。 zmax (float): z轴上限。 Returns: float: 三维积分的结果。 """ total_value = 0.0 with ThreadPoolExecutor(max_workers=8) as executor: results = [executor.submit(calculate_sample_contribution, function, xmin, xmax, ymin, ymax, zmin, zmax) for _ in range(num_samples)] for future in as_completed(results): total_value += future.result().function_value * future.result().weight return total_value / num_samples # 计算单个采样点对积分贡献的函数 def calculate_sample_contribution(function: Callable[[float, float, float], float], xmin: float, xmax: float, ymin: float, ymax: float, zmin: float, zmax: float) -> IntegrationResult: x = random.uniform(xmin, xmax) y = random.uniform(ymin, ymax) z = random.uniform(zmin, zmax) function_value = function(x, y, z) weight = 1.0 / ((xmax-xmin) * (ymax-ymin) * (zmax-zmin)) return IntegrationResult(function_value, weight) ``` **代码解释:** * **装饰器 `timer`**: 记录函数执行时间, 用于性能分析 * **数据类 `IntegrationResult`**: 存储每个采样点的函数值和权重信息 * **`monte_carlo_integration` 函数**: 主函数,接受被积函数、采样点数、积分区间等参数,并使用多线程加速计算三维积分。 * 创建一个最大工作进程数为8的线程池`ThreadPoolExecutor` * 使用列表推导式生成多个任务,每个任务调用`calculate_sample_contribution`函数计算一个采样点的贡献 * 并行执行这些任务,使用`as_completed`迭代完成的任务,累加每个任务返回的积分贡献结果 * 返回最终的积分结果 * **`calculate_sample_contribution` 函数**: 为每个采样点计算积分贡献。 * 在指定区间内随机生成x, y, z坐标 * 调用被积函数计算该采样点的函数值 * 计算该采样点的权重,根据积分区间的体积进行缩放。 * 返回包含函数值和权重的`IntegrationResult`对象 **使用方法:** 1. 定义要被积的函数 2. 设置采样点数 (`num_samples`) 和积分区间 (`xmin`, `xmax`, `ymin`, `ymax`, `zmin`, `zmax`) 3. 调用`monte_carlo_integration`函数 例如,计算 f(x, y, z) = x^2 + y^2 + z^2 在立方体区域 [0, 1]^3 内的积分: ```python def f(x, y, z): return x**2 + y**2 + z**2 result = monte_carlo_integration(f, num_samples=1000000, xmin=0, xmax=1, ymin=0, ymax=1, zmin=0, zmax=1) print(f"The integral is approximately: {result}") ``` **注意:** 由于蒙特卡洛方法依赖于随机采样,因此结果会存在一定的误差。增加采样点数可以提高精度但也会延长计算时间。

评论区:

评论:

请输入内容: