weixin_48584695 2023-06-13 10:56 采纳率: 0%
浏览 28

用python拟合三维数据的曲面,并画出曲面的等高线图,求出曲面的波峰和波谷

用python拟合三维数据的曲面,并画出曲面的等高线图,求出曲面的波峰和波谷

  • 写回答

2条回答 默认 最新

  • TechLead KrisChang 优质创作者: 人工智能技术领域 2023-06-13 11:42
    关注

    主要用 scipy.optimize.curve_fit 拟合曲面
    用matplotlib画图

    试试这段逻辑,先定义一个二次曲面,然后用curve_fit拟合,其他里面有备注,试试看

    
    import numpy as np
    from scipy.optimize import curve_fit
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    
    # 定义二次曲面模型
    def model(data, a, b, c, d, e, f):
        x, y = data
        return a * x**2 + b * y**2 + c * x * y + d * x + e * y + f
    
    # 生成一些示例数据
    x = np.random.rand(100) * 10
    y = np.random.rand(100) * 10
    z = model((x, y), 0.5, 0.3, 0.1, 0.2, 0.1, 1.0) + np.random.rand(100) - 0.5
    
    # 拟合曲面
    params, _ = curve_fit(model, (x, y), z)
    
    # 生成曲面和等高线图的数据
    x_range = np.linspace(x.min(), x.max(), 100)
    y_range = np.linspace(y.min(), y.max(), 100)
    x_grid, y_grid = np.meshgrid(x_range, y_range)
    z_grid = model((x_grid, y_grid), *params)
    
    # 绘制曲面图
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(x, y, z, color='b')  # 原始数据
    ax.plot_surface(x_grid, y_grid, z_grid, color='r', alpha=0.3)  # 拟合曲面
    plt.show()
    
    # 绘制等高线图
    plt.contour(x_grid, y_grid, z_grid, levels=20)
    plt.show()
    
    # 通过求导找出极值点
    # 请注意,在这里我们假设模型是二次曲面,如果使用其他模型,求导的过程将会不同
    # 对于二次曲面,极值点就是曲面的顶点,我们可以直接通过公式计算出来
    x_peak = -(params[3] * params[1] - params[2] * params[4]) / (4 * params[0] * params[1] - params[2]**2)
    y_peak = -(params[4] * params[0] - params[2] * params[3]) / (4 * params[0] * params[1] - params[2]**2)
    z_peak = model((x_peak, y_peak), *params)
    print(f'Peak: x={x_peak}, y={y_peak}, z={z_peak}')
    
    

    如果有帮助,请点击一下采纳该答案~谢谢

    评论

报告相同问题?

问题事件

  • 创建了问题 6月13日