多项式拟合曲线——最小二乘法

直接上代码,最小二乘法比较简单,在拟合效果上也相当不错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy
import random

f = plt.figure()
draw = f.add_subplot(111)
#拟合函数的次数限制
times=9
tail=times+1
x = numpy.arange(-2,2,0.1)
y = [((xi-1)*(xi*xi-1)+0.5)*numpy.cos(xi) for xi in x]
#所有使用到的全局变量声明
i=0
xlabel=[]
ylabel=[]
A=[]
B=[]
tempA=[]
tempB=[]
X=[]
Y=[]
#-----------------------------
#生成数据,加入cos函数,作为噪声!
for xi in x:
r=float(random.randint(80,100))/100
xlabel.append(xi*r)
ylabel.append(y[i]*r)
i+=1
draw.plot(xlabel,ylabel,color='b',linestyle='',marker='*')
length=len(xlabel)
for i in range(0,tail):
tempA=[]
for j in range(0,tail):
temp=0.0
for k in range(0,length):
d=1.0
for m in range(0,j+i):
d=d*xlabel[k]
temp+=d
tempA.append(temp)
A.append(tempA)
for i in range(0,tail):
temp=0.0
for k in range(0,length):
d=1.0
for j in range(0,i):
d=d*xlabel[k]
temp+=ylabel[k]*d
B.append(temp)
#X为可行解
X=numpy.linalg.solve(A,B)
print('可行解a(x的系数)的矩阵表示为:[a0,---,a%d]'%(times))
print(X)
for i in range(0,length):
temp=0.0
for j in range(0,tail):
d=1.0
for k in range(0,j):
d*=x[i]
d*=X[j]
temp+=d
Y.append(temp)
draw.plot(x,Y,color='r',linestyle='-',marker='.')



本文链接: http://home.meng.uno/articles/1af17fd9/ 欢迎转载!

© 2018.02.08 - 2020.10.14 Mengmeng Kuang  保留所有权利!

UV : | PV :

:D 获取中...

Creative Commons License