数学建模入门-python拟合曲面

前言

找了好久python拟合曲面的方法,没找到,就借鉴 https://blog.csdn.net/Haipai1998/article/details/85345823 这篇博客,对方法进行封装更便于使用。

代码

处理符号问题

def fun(x): 
    round(x, 2)
    if x >= 0:
        return '+'+str(x)
    else:
        return str(x)

求解系数


def get_res(X, Y, Z, n):
    # 求方程系数
    sigma_x = 0
    for i in X: sigma_x += i
    sigma_y = 0
    for i in Y: sigma_y += i
    sigma_z = 0
    for i in Z: sigma_z += i
    sigma_x2 = 0
    for i in X: sigma_x2 += i * i
    sigma_y2 = 0
    for i in Y: sigma_y2 += i * i
    sigma_x3 = 0
    for i in X: sigma_x3 += i * i * i
    sigma_y3 = 0
    for i in Y: sigma_y3 += i * i * i
    sigma_x4 = 0
    for i in X: sigma_x4 += i * i * i * i
    sigma_y4 = 0
    for i in Y: sigma_y4 += i * i * i * i
    sigma_x_y = 0
    for i in range(n):
        sigma_x_y += X[i] * Y[i]
    # print(sigma_xy)
    sigma_x_y2 = 0
    for i in range(n): sigma_x_y2 += X[i] * Y[i] * Y[i]
    sigma_x_y3 = 0
    for i in range(n): sigma_x_y3 += X[i] * Y[i] * Y[i] * Y[i]
    sigma_x2_y = 0
    for i in range(n): sigma_x2_y += X[i] * X[i] * Y[i]
    sigma_x2_y2 = 0
    for i in range(n): sigma_x2_y2 += X[i] * X[i] * Y[i] * Y[i]
    sigma_x3_y = 0
    for i in range(n): sigma_x3_y += X[i] * X[i] * X[i] * Y[i]
    sigma_z_x2 = 0
    for i in range(n): sigma_z_x2 += Z[i] * X[i] * X[i]
    sigma_z_y2 = 0
    for i in range(n): sigma_z_y2 += Z[i] * Y[i] * Y[i]
    sigma_z_x_y = 0
    for i in range(n): sigma_z_x_y += Z[i] * X[i] * Y[i]
    sigma_z_x = 0
    for i in range(n): sigma_z_x += Z[i] * X[i]
    sigma_z_y = 0
    for i in range(n): sigma_z_y += Z[i] * Y[i]
    # print("-----------------------")
    # 给出对应方程的矩阵形式
    a = np.array([[sigma_x4, sigma_x3_y, sigma_x2_y2, sigma_x3, sigma_x2_y, sigma_x2],
                  [sigma_x3_y, sigma_x2_y2, sigma_x_y3, sigma_x2_y, sigma_x_y2, sigma_x_y],
                  [sigma_x2_y2, sigma_x_y3, sigma_y4, sigma_x_y2, sigma_y3, sigma_y2],
                  [sigma_x3, sigma_x2_y, sigma_x_y2, sigma_x2, sigma_x_y, sigma_x],
                  [sigma_x2_y, sigma_x_y2, sigma_y3, sigma_x_y, sigma_y2, sigma_y],
                  [sigma_x2, sigma_x_y, sigma_y2, sigma_x, sigma_y, n]])
    b = np.array([sigma_z_x2, sigma_z_x_y, sigma_z_y2, sigma_z_x, sigma_z_y, sigma_z])
    # 高斯消元解线性方程
    res = np.linalg.solve(a, b)
    return res

def matching_3D(X, Y, Z):
    n = len(X)
    res = get_res(X, Y, Z, n)
    # 输出方程形式
    print("z=%.6s*x^2%.6s*xy%.6s*y^2%.6s*x%.6s*y%.6s" % (
    fun(res[0]), fun(res[1]), fun(res[2]), fun(res[3]), fun(res[4]), fun(res[5])))
    # 画曲面图和离散点
    fig = plt.figure()  # 建立一个空间
    ax = fig.add_subplot(111, projection='3d')  # 3D坐标

    n = 256
    u = np.linspace(-20, 20, n)  # 创建一个等差数列
    x, y = np.meshgrid(u, u)  # 转化成矩阵

    # 给出方程
    z = res[0] * x * x + res[1] * x * y + res[2] * y * y + res[3] * x + res[4] * y + res[5]
    # 画出曲面
    ax.plot_surface(x, y, z, rstride=3, cstride=3, cmap=cm.jet)
    # 画出点
    ax.scatter(X, Y, Z, c='r')
    plt.show()

调用演示

这样以后用起来就方便了
在这里插入图片描述

### 回答1: 可以使用Python中的Scipy库中的interpolate模块来进行散点拟合曲面方程。以下是一个简单的例子: ```python import numpy as np from scipy.interpolate import griddata import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 生成3D散点数据 x = np.random.random(100) y = np.random.random(100) z = np.sin(x * np.pi) * np.cos(y * np.pi) # 在网格上进行插值 xi = np.linspace(0, 1, 100) yi = np.linspace(0, 1, 100) X, Y = np.meshgrid(xi, yi) Z = griddata((x, y), z, (X, Y), method='cubic') # 绘制3D图形 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z, c='b', marker='o') ax.plot_surface(X, Y, Z, cmap='coolwarm') plt.show() ``` 这个例子中,首先生成了一个包含100个随机散点的3D数据,然后使用griddata函数进行插值,最后绘制了散点和拟合曲面的3D图形。可以根据需要修改数据和插值方法,来得到更符合实际情况的拟合曲面。 ### 回答2: Python中可以使用scipy库中的`scipy.optimize.curve_fit`函数进行散点拟合曲面方程。`curve_fit`函数需要传入一个拟合函数和输入数据,然后返回拟合后的曲面方程的参数。 首先,导入scipy库和numpy库,使用`curve_fit`函数进行拟合。假设要拟合曲面方程为z = f(x, y),我们需要定义这个拟合函数。假设我们选择的拟合函数为z = ax^2 + by^2 + cxy + dx + ey + f。则代码如下: ```python import numpy as np from scipy.optimize import curve_fit # 定义拟合函数 def func(xy, a, b, c, d, e, f): x, y = xy return a * x**2 + b * y**2 + c * x * y + d * x + e * y + f # 定义输入数据 x_data = np.array([1, 2, 3, 4, 5]) # x坐标 y_data = np.array([2, 3, 1, 5, 7]) # y坐标 z_data = np.array([5, 4, 3, 2, 1]) # z坐标 data = (x_data, y_data, z_data) # 使用curve_fit函数进行曲面拟合 params, params_cov = curve_fit(func, (x_data, y_data), z_data) # 输出拟合后的参数 print(params) ``` 这样,使用Python就可以进行散点拟合曲面方程。需要注意的是,拟合函数的定义需要根据具体的曲面方程进行确定,参数的个数根据拟合函数的形式而定。在此示例中,我们选择的拟合函数是一个二次函数。 以上代码中的`params`即为拟合后得到的曲面方程的参数。 ### 回答3: Python中可以使用Scipy库中的函数来拟合散点数据的曲面方程。首先,我们需要导入需要的库和模块,并且准备散点数据。 ```python import numpy as np from scipy.optimize import curve_fit # 准备散点数据 xdata = np.array([1, 2, 3, 4, 5]) ydata = np.array([1, 4, 9, 16, 25]) zdata = np.array([1, 8, 27, 64, 125]) ``` 接下来,我们可以定义需要拟合曲面方程。这里以二次曲面方程作为示例: ```python def func(x, y, a, b, c): return a * x**2 + b * y**2 + c ``` 然后,使用curve_fit函数来拟合曲面方程。这个函数用于对函数进行最小二乘逼近拟合拟合出一个与给定数据最接近的曲面方程。 ```python # 初始参数猜测值 initial_guess = [1, 1, 1] # 进行曲面拟合 params, params_covariance = curve_fit(func, (xdata, ydata), zdata, initial_guess) ``` 最后,我们可以打印出拟合出的曲面方程的参数值: ```python print('拟合参数:', params) ``` 通过上述步骤,我们就可以使用Python拟合散点数据的曲面方程了。需要注意的是,拟合曲面方程可以根据实际需求进行选择和调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值