如何为实测数据拟合三维指数曲面并实现绘图与方程获取
三维指数曲面拟合与绘图实现
实现思路
我们采用指数曲面模型:z = a·e^(b·x + c·y),其中x对应变量d,y对应变量J4,z为实测数据。通过非线性最小二乘法拟合模型参数a、b、c,最终同时绘制原始散点与拟合曲面,并输出曲面的数学方程。
完整代码
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.optimize import curve_fit # 实测数据 data = [ [1.0183786345931547, 1.0299586760768078, 1.038641346963767, 1.0450398412805133, 1.194598528164483], [1.0498980141678536, 1.0740481275807727, 1.101990429736493, 1.1528998376687427, 1.4439775675193383], [1.072406763443829, 1.150808521648661, 1.2306731013044911, 1.3516512408949992, 1.8936625169205694] ] J4 = [0.3, 0.4, 0.5, 0.6, 0.7] d = [0.25, 0.333333, 0.5] # 将数据整理为拟合所需的一维数组 x_data = np.repeat(d, len(J4)) y_data = np.tile(J4, len(d)) z_data = np.array(data).flatten() # 定义指数曲面模型 def exponential_surface(xy, a, b, c): x, y = xy return a * np.exp(b * x + c * y) # 非线性最小二乘法拟合参数 initial_guess = [1, 1, 1] # 参数初始猜测值,可根据数据趋势调整 params, _ = curve_fit(exponential_surface, (x_data, y_data), z_data, p0=initial_guess) a_fit, b_fit, c_fit = params # 生成拟合曲面的网格数据 x_grid, y_grid = np.meshgrid(d, J4) z_fit = exponential_surface((x_grid, y_grid), a_fit, b_fit, c_fit) # 绘制散点与拟合曲面 fig = plt.figure(figsize=(6, 10)) ax = Axes3D(fig) # 原始实测散点 ax.scatter(x_grid, y_grid, np.array(data).transpose(), s=40, alpha=1, label='实测数据') # 拟合曲面 ax.plot_surface(x_grid, y_grid, z_fit, alpha=0.5, cmap='viridis', label='拟合曲面') ax.set_proj_type('ortho') ax.set_xlabel('d') ax.set_ylabel('J4') ax.set_zlabel('测量值') ax.legend() plt.tight_layout() plt.show() # 输出拟合的数学方程 print(f"拟合的指数曲面方程:z = {a_fit:.4f}·e^({b_fit:.4f}·x + {c_fit:.4f}·y)")
关键说明
- 拟合依赖
scipy.optimize.curve_fit实现非线性最小二乘法,初始猜测值initial_guess可根据数据大致趋势微调,提升拟合精度。 - 拟合完成后,参数
a_fit、b_fit、c_fit会被输出,直接代入模型即可得到最终的曲面方程。 - 绘图时通过设置曲面的
alpha=0.5,保证原始散点与拟合曲面互不遮挡。
内容的提问来源于stack exchange,提问作者Ladislav Révay
相关产品推荐
相关产品推荐

