• MATLAB线性函数拟合并预测


    线性函数拟合,由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y=(x)的形式给出,并且其中f(x)满足:

    y=mx+b

    要求得 m 和b的值,我们可以使用一个称为 polyii(x,y,n)的 MATLAB 函数,其中n是我们要 MATLAB 求出的多项式的次数,对于y= mx+b 形式的方程,我们把n设为等于 1,因此调用的语句将是 polyfit(x,y,1)。polyfit函数采用最小二乘法计算。

    示例:

    首先输入数据:

    1. H=[6:2:24];
    2. A=[3.94,3.8,4.1,3.87,4.45,4.33,4.12,4.43,4.6,4.5];
    3. x=H
    4. y=A

    接着调用 pobyit 让 MATLAB 计算拟合数据的多项式的系数。

    p=polyfit(x,y,1)
    

    1. m=p(1)
    2. b=p(2)
    3. y=m*x+b

     画出拟合图形:

    1. x=[1:0.1:24];
    2. y=m*x+b
    3. plot(H,A,'o',x,y),xlabel('差点'),ylabel('平均成绩')

    运行结果如下:

    看看本例中由拟合直线对特定的差点所预计的成绩值的情况

    1. w=H*m+b
    2. % 3.8616 3.9399 4.0182 4.0965 4.1748 4.2532 4.3315 4.4098 4.4881 4.5664

     计算r平方程序如下所示:

    1. Mean=mean(A)
    2. S=sum((A-Mean).^2);
    3. A1=sum((A-w).^2);
    4. r2=1-A1/S
    5. %0.6899

    r平方为0.6899,说明拟合效果一般。

    往前预测三步,并且画出95%的置信区间代码如下(完整版):

    1. clc;
    2. clear;
    3. % 导入数据
    4. H = [6:2:24];
    5. A = [3.94, 3.8, 4.1, 3.87, 4.45, 4.33, 4.12, 4.43, 4.6, 4.5];
    6. x = H;
    7. y = A;
    8. a = [x; y];
    9. a1 = a(1, :);
    10. [a1, pos] = sort(a1);
    11. a2 = a(2, pos);
    12. % 多项式拟合
    13. [p, s] = polyfit(a1, a2, 2);
    14. fprintf("拟合系数分别为:%f %f\n", p(1), p(2));
    15. y1 = polyval(p, a1);
    16. % 95% 预测区间计算:
    17. [yfit, dy1] = polyconf(p, x, s);
    18. % 95% 置信区间计算:
    19. [yfit, dy] = polyconf(p, a1, s, 'predopt', 'curve');
    20. % 往前预测三个数
    21. x_pred = [26, 28, 30];
    22. [y_pred, delta] = polyval(p, x_pred, s);
    23. % 绘制图表
    24. figure;
    25. hold on;
    26. plot(a1, y1 + dy, 'r--', a1, y1 - dy, 'r--', a1, y1 + dy1, 'y--', a1, y1 - dy1, 'y--', 'LineWidth', 1.5);
    27. plot(a1, y1, 'k', 'LineWidth', 1.5);
    28. scatter(x, y, 'k', 'filled'); % 原始数据点
    29. scatter(x_pred, y_pred, 'r', 'filled'); % 往前预测的数据点标红
    30. plot(x_pred, y_pred + delta, 'r--'); % 预测区间上界
    31. plot(x_pred, y_pred - delta, 'r--'); % 预测区间下界
    32. xlabel('H');
    33. ylabel('A');
    34. title('多项式拟合结果及预测');
    35. grid on;
    36. % 计算 R^2
    37. A1=sum((y1 - a2).^2);
    38. S=sum((a2 - mean(a2)).^2);
    39. r2 = 1-A1/S;
    40. fprintf("R^2 值为:%f\n", r2);

    运行结果如下:

     

  • 相关阅读:
    【Flutter】包管理(4)Flutter 数据存储 shared_preferences 详解
    HTML基础知识
    QObject::connect: signal not found in QPushButton
    C# 实例解释面向对象编程中的接口隔离原则
    实验四.集合
    文件逻辑结构与物理结构对比(从用户,操作系统的角度)
    Vue报错: Avoid mutating a prop directly since the value will 问题解决
    Meta 开源语音 AI 模型支持 1,100 多种语言
    如何使用 Vue.js 中的自定义指令编写一个URL清洗器
    决策单调性优化dp
  • 原文地址:https://blog.csdn.net/qq_56891068/article/details/138199274