用python拟合三维数据的曲面,并画出曲面的等高线图,求出曲面的波峰和波谷
2条回答 默认 最新
关注主要用 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}')
如果有帮助,请点击一下采纳该答案~谢谢
解决 无用评论 打赏 举报