数值分析:数据拟合

1 实验目的

       理解数据拟合应用场景,能够根据数据特点,正确选择算法,并且能够编程实验相关算法。

2 实验任务

       某乡镇企业 2010-2016 年的大致生产利润如下表,试采用正确的方法预测2017 和 2018 年的利润。
年份           2010 2011 2012 2013 2014 2015 2016
利润(万元) 70     122   144   152   174   196   202

3 实验相关知识

最小二乘法:最小二乘法是一种常用的数据拟合方法,它通过最小误差的平方和来找到一组数据的最佳函数匹配。
求解最小二乘法的步骤:
(1)根据题干给定的数据,画出草图,初步判断数据变化趋势,给出基函数
(2)通过基函数进行最小二乘拟合,求解基函数中的未知数
(3)将基函数完整写出,即可得到拟合后的最小二乘函数

4 实验流程图

5 实验代码

import numpy as np
import matplotlib.pyplot as plt

def fitting_process(_x1, _x2):
    a, b = 0, 0
    a1 = [[0, 0, 0], [0, 0, 0]]
    r, r1 = 0, 0
    a1[0][0] = 7
    x = [2010, 2011, 2012, 2013, 2014, 2015, 2016]  # 假设x和y是已知的数据
    y = [70, 122, 144, 152, 174, 196, 202]
    for i in range(7):
        a1[0][2] += y[i]
        a1[1][2] += x[i] * y[i]

    for i in range(7):
        r += x[i]
        r1 += (x[i] * x[i])

    a1[0][1] = r
    a1[1][0] = a1[0][1]
    a1[1][1] = r1
    k = a1[1][0] / a1[0][0]
    for j in range(3):
        a1[1][j] -= a1[0][j] * k
    b = a1[1][2] / a1[1][1]
    a = (a1[0][2] - a1[0][1] * b) / a1[0][0]
    print("线性拟合", _x1, "年的预测是:", a + b * _x1)
    print("线性拟合", _x2, "年的预测是:", a + b * _x2)

    # 绘制原始数据点和预测曲线
    plt.scatter(x, y)
    plt.plot(x, a + b * np.array(x), color='red')
    plt.scatter([_x1, _x2], [a + b * _x1, a + b * _x2], color='green')  # 添加预测点
    plt.text(_x1, a + b * _x1, f'({_x1}, {a + b * _x1})', verticalalignment='bottom')  # 显示预测点的坐标
    plt.text(_x2, a + b * _x2, f'({_x2}, {a + b * _x2})', verticalalignment='bottom')  # 显示预测点的坐标
    plt.show()

# 调用函数
fitting_process(2017, 2018)

6 实验结果

7 总结

       这次实验采用的是最小二乘拟合的方法。与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是追求一个函数(曲线),使得该曲线在某种准测下与所有的数据点最为接近,即曲线拟合最好(最小化损失函数)。
        采用拟合的结果是要得到一条确定的曲线。插值算法中,得到的多项式 f(x)要经过所有的样本点。但是如果样本点太多,那么这个多项式的次数过高,会造成龙格现象。尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更要倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茜茜西西CeCe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值