数学建模社区-数学中国

标题: 使用 numpy 包进行最小二乘拟合 [打印本页]

作者: 2744557306    时间: 2024-3-15 11:01
标题: 使用 numpy 包进行最小二乘拟合
1.使用 np.polyfit() 函数对数据进行多项式拟合,分别拟合为一次、二次和三次多项式,得到拟合系数。
0 f  c) a2 r/ i$ q1 z4 K8 M" {2.使用 np.poly1d() 函数根据拟合系数创建多项式对象。. E3 p6 o1 h2 i0 A$ B
3.打印出三个多项式对象。) |' a+ ?; x) W+ z1 }4 o
4.生成一组新的 x 值,在指定范围内均匀分布。
( j: W5 q/ g) L5.使用多项式对象计算对应的 y 值。, E  _8 S4 L; i3 W+ B
6.使用 plt.scatter() 绘制原始数据点,使用 plt.plot() 绘制拟合曲线,并添加图例。
! {/ M; G" \+ ?4 L4 n7 T3 d9 {7.最后,显示图形。
9 m, c1 y7 A+ Y5 ?
+ y. f3 r, d9 k% ?( w这段代码将原始数据拟合为一次、二次和三次多项式,并在同一图中展示了拟合曲线。
0 w& U- [1 M. o% P1 e- Y. U当你执行这段代码时,它会进行以下操作:
5 V) ?" d: t  z7 z* G- q
) x: x7 k* ]4 j* D/ }: b1.导入所需库:

  1. 6 X4 {# u( I' z* w1 t
  2.    import matplotlib.pyplot as plt
      K" S# z& W) r0 d) h9 I
  3.    import numpy as np1 q7 S8 i  ]  a
复制代码
2.定义源数据:

  1. + ?2 u' H. G7 e. @
  2.    x = np.array([1, 2, 3, 4])5 s) R% Q; b, Y) K" A0 V
  3.    y = np.array([4, 10, 18, 26])
    $ [! f: P& U0 R: L, |
复制代码
这里 x 和 y 分别是输入数据的 x 和 y 值,用于进行多项式拟合。; n) C. z7 h2 j, Q( n$ M
% R/ v3 [8 g; W
3.多项式拟合:
  1.    z1 = np.polyfit(x, y, 1)
    + x4 M: e( F. F6 @4 z
  2.    z2 = np.polyfit(x, y, 2)
    6 j3 ?. p$ ?9 r! q& O/ v& H: ]
  3.    z3 = np.polyfit(x, y, 3)
复制代码
使用 np.polyfit() 函数对数据进行多项式拟合,分别拟合为一次、二次和三次多项式,并返回拟合系数。& {* g: z7 o6 ^$ Z
/ s& C% m1 O! o; }* n  T
4.创建多项式对象:
  1.    p1 = np.poly1d(z1)! V! W" a( ?, |+ r; z* F5 h/ v: K; {
  2.    p2 = np.poly1d(z2)
    # e5 h4 f( H; ^( i. V$ V
  3.    p3 = np.poly1d(z3)
    ( `, ~8 y) }5 Q# T1 E4 p' r6 ^
复制代码
使用 np.poly1d() 函数根据拟合系数创建多项式对象,这样可以方便地对多项式进行计算。/ W5 q+ d) _. d) g: z5 F$ B
- E, H. W; ^" p$ _5 X6 G1 j
5.打印多项式对象:
  1.    print('p1 =\n', p1); y" y, k8 j3 P& H! ?  V
  2.    print('p2 =\n', p2)
    , P$ }- h- m- i: L8 Q
  3.    print('p3 =\n', p3)
    8 e+ f+ h% m* k4 b4 J9 x3 h0 v
复制代码
打印出三个多项式对象,分别对应一次、二次和三次多项式。
% p! m0 x4 h: U4 s
* E0 f/ H4 {3 D! `, X/ K9 s4 M6.生成新的 x 值:
  1.    x1 = np.linspace(-2, 7, 100)
复制代码
使用 np.linspace() 函数生成了一组新的 x 值,在范围从 -2 到 7 之间均匀分布,用于绘制拟合曲线。. ~. ~: q  [% A9 U/ X6 [, U
- o# x1 K6 i* ~' h# W7 |( e, |* {
7.计算对应的 y 值:
  1.    y1 = p1(x1)
    ( U( N$ }  p8 W" B3 J5 H
  2.    y2 = p2(x1)
    : w+ b. b0 E0 d9 k  w2 ?
  3.    y3 = p3(x1)
复制代码
使用多项式对象 p1、p2 和 p3 计算了对应于新 x 值的 y 值。
  D( {% K2 ~2 q; K* w/ P) h1 w. z+ N7 t" f' x0 x0 ?
8.绘制图形:
  1.    plt.scatter(x, y)
    - {1 Q0 ?! U' i) ^% Y  _
  2.    plt.plot(x1, y1, label='linear'); Q- P' p+ ^/ v7 z9 ~% b# t) u
  3.    plt.plot(x1, y2, label='quadratic')
    / j1 B" K4 J. R2 I7 z3 l" s
  4.    plt.plot(x1, y3, label='cubic')
    ( H3 V6 Q* A# f; T5 P& |# ]
  5.    plt.legend()
复制代码
使用 plt.scatter() 绘制原始数据点,使用 plt.plot() 绘制拟合曲线,并添加图例,标记不同曲线对应的多项式阶数。
8 X% p% g! m3 m5 k9 t
9 f* c$ j8 T! L1 v4 j. [( n* C9.显示图形:
  1.    plt.show()
复制代码
最后,显示绘制的图形。6 y7 p& C( Z& X/ ?
这样,你就能够看到原始数据点以及拟合的一次、二次和三次多项式曲线,并对其进行比较。
0 G1 J, f% s' g8 a$ l: E2 E9 |/ P
2 }3 k6 x2 I+ D* W4 q0 F$ w4 d: m. j( k4 f: Q/ Z
4 O( f; N6 H0 _

09.least_square_fitting.py

699 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5