”已知二维平面上一组坐标点(x,y),这些坐标点的图像近 似于正弦曲线。请尝试分别使用1~9阶曲线进行最小二乘拟 合,并综合考量选择最优的拟合阶数。”

”已知二维平面上一组坐标点(x,y),这些坐标点的图像近
似于正弦曲线。请尝试分别使用1~9阶曲线进行最小二乘拟
合,并综合考量选择最优的拟合阶数。”

望采纳,已帮忙完成代码


在使用最小二乘法进行曲线拟合时,通常需要对不同阶数的曲线进行拟合,然后选择最优的拟合阶数。下面示例展示了如何使用 Python 和 Numpy 库进行拟合:

import numpy as np

# 定义正弦曲线函数
def f(x, a, b, c):
    return a * np.sin(b * x + c)

# 构造测试数据
x = np.linspace(0, 2 * np.pi, 100)
y = f(x, 1, 1, 0)

# 添加噪声
y_noise = y + np.random.normal(0, 0.5, size=y.shape)

# 使用1~9阶曲线进行拟合
for i in range(1, 10):
    # 对每个阶数构造多项式拟合函数
    p = np.polyfit(x, y_noise, i)
    # 计算拟合后的 y 值
    y_fit = np.polyval(p, x)
    # 计算拟合误差
    error = np.mean((y_fit - y) ** 2)
    # 输出拟合误差
    print(f"{i}-order fit error: {error:.4f}")

在上面的代码中,我们首先定义了一个正弦曲线函数 f(),然后构造了一组测试数据,并在每个数据点上添加了一些噪声。然后我们使用 Numpy 库的 polyfit()polyval() 函数进行拟合,分别用 1~9 阶多项式进行拟合,并计算拟合误差,最后选择最小的拟合误差对应的阶数作为最优拟合阶数。

刚测试了一下,起码得17阶多项式才能很好拟合

import numpy as np
import matplotlib.pyplot as plt
def show(x,y_fit,y_noise,title):
    plt.figure(figsize=(18,6))    # 设置绘图大小为20*15
    plt.xlabel('X')          # 设置x、y轴标签
    plt.ylabel('Y')
    plt.ylim((-2,2))               # 设置y轴刻度范围为0~11
    plt.title(title)             # 设置绘图标题

    #plt.plot(x, y_noise, ':sm', x, y_noise, ':vb')    # 以x为横坐标、y_noise为纵坐标绘制折线图
    plt.plot(x, y_fit)    #
    plt.scatter(x, y_noise,  marker='o', edgecolors='r', s=10)
    plt.grid()                           # 绘制网格
    plt.legend(['ys','nh'])                   # 绘制图例,LEGEND=['Test 1','Test 2']
    #plt.annotate('Key Point', (20, 0), xycoords='data', color='r')    # 在图上点(600, 4)处添加标注
    #plt.savefig('Hight.png')       # 保存绘图为png图片
    plt.show()                     # 程序运行时显示绘图,且阻止命令继续往下运行,关闭绘图后命令会继续运行
    
# 定义正弦曲线函数
def sin_func(x, a, b, c):
    return a * np.sin(b * x + c)
# 构造测试数据
x = np.linspace(0, 20 * np.pi, 100)
y = sin_func(x, 1, 0.5, 0)
# 添加噪声
y_noise = y + np.random.normal(0, 0.1, size=y.shape)
# 使用1~9阶曲线进行拟合
for i in range(10, 20):
    # 对每个阶数构造多项式拟合函数
    p = np.polyfit(x, y_noise, i)
    # 计算拟合后的 y 值
    y_fit = np.polyval(p, x)
    # 计算拟合误差
    error = np.mean((y_fit - y) ** 2)
    # 输出拟合误差
    print(f"{i}-order fit error: {error:.4f}")
    show(x,y_fit,y_noise,f"polyfit with {i}")

img