Scipy 曲线拟合无法将数据准确拟合到傅里叶级数

Scipy curve fitting unable to accurately fit data to Fourier series

我正在利用现有 中的代码。在那个答案中,信号在零附近振荡。在我的数据中,我移动到 x 轴上方,但曲线拟合算法无法有效捕捉到这一点。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit


x_raw = np.loadtxt( 'x_values.csv',delimiter=',', unpack=True)
y_raw = np.loadtxt( 'y_values.csv',delimiter=',', unpack=True)

tau = 180

def fourier(x, *a):
    ret = a[0] * np.cos(np.pi / tau * x)
    for deg in range(1, len(a)):
        ret += a[deg] * np.cos((deg+1) * np.pi / tau * x)
    return ret


popt, pcov = curve_fit(fourier, x_raw, y_raw, [1.0] * 15)

# Plot data, 15 harmonics, and first 3 harmonics
fig = plt.figure()
ax1 = fig.add_subplot(111)
#
p1, = plt.plot(x_raw,y_raw)
p2, = plt.plot(x_raw, fourier(x_raw, *popt))
plt.show()

这是我得到的结果,您可以看到它是一个错误(蓝色 = 数据,橙色 = 适合)我不确定如何解决。

原始值样本原始值

0   354
0   355
0   355
0.25    355
0.5 355
0.75    354
1.25    355
1.5 355
1.75    354
2.25    355
2.75    354
3   354
3.25    354
3.75    353
4.25    354
4.5 353
5   353
5.25    353
5.75    353
6   353
6.5 353
6.75    353
7.25    354
7.5 354
8   354
8.25    355
8.75    355
9.25    356
9.75    356
10  355
10.5    356
10.75   355
11.25   355
11.5    356
12  356
12.5    356
12.75   356
13.25   356
13.5    357
14  356
14.25   356
14.75   356
15  356
15.5    356
15.75   356
16.25   356
16.5    357
17  356
17.25   356
17.75   357
18  357
18.5    358
18.75   358
19.25   358
19.5    359
20  359
20.25   358
20.75   359
21  358
21.5    358
21.75   357
22.25   357
22.5    358
22.75   358
23.25   358
23.75   359
24  359
24.5    359
24.75   359
25.25   359
25.5    359
26  359
26.5    359
27  359
27.25   359
27.5    360
28  360
28.5    360
28.75   361
29.25   361
29.5    361
30  362
30.25   362
30.5    362
31  362
31.25   362
31.75   363
32  363
32.5    363
33  363
33.25   362
33.5    363
34  363
34.25   363
34.75   364
35  364
35.5    364
35.75   365
36.25   365
36.5    366
36.75   366
37.25   366
37.5    367
38  367
38.25   367
38.75   368
39  367
39.5    368
40  368
40.25   368
40.75   368
41  368
41.25   368
41.75   369
42  369
42.25   369
42.75   369
43  369
43.5    370
43.75   370
44.25   371
44.5    371
44.75   371
45.25   372
45.75   372
46  372
46.25   372
46.75   372
47.25   372
47.5    373
47.75   374
48.25   374
48.5    375
49  375
49.25   376
49.5    376
50  376
50.25   377
50.75   377
51  377
51.25   377
51.5    377
52  378
52.25   378
52.75   378
53  379
53.25   379
53.75   379
54  379
54.5    379
54.75   380
55.25   381
55.5    381
55.75   381
56  381
56.5    382
56.75   383
57.25   383
57.5    384
57.75   384
58.25   384
58.5    384
58.75   384
59.25   385
59.5    385
60  385
60.25   386
60.75   386
61  387
61.5    387
62  387
62.25   389
62.5    390
63  390
63.25   391
63.5    391
64  392
64.25   393
64.75   393
65  393
65.25   394
65.75   395
66  395
66.25   395
66.75   395
67  396
67.5    397
67.75   397
68.25   398
68.5    398
69  399
69.25   399
69.5    400
69.75   401
70.25   401
70.5    401
70.75   402
71  403
71.5    404
71.75   404
72  404
72.5    405
72.75   405
73  405
73.25   406
73.75   406
74  407
74.25   408
74.5    408
75  409
75.25   409
75.75   410
76  410
76.25   410
76.75   412
77  413
77.25   414
77.5    415
78  414
78.25   414
78.5    416
78.75   417
79.25   418
79.75   418
80  418
80.5    419
80.75   420
81.25   421
81.5    422
82  422
82.5    423
82.75   424
83  425
83.25   426
83.75   426
84  426
84.25   426
84.5    427
85  429
85.25   430
85.5    431
85.75   432
86  432
86.5    433
86.75   434
87  433
87.25   434
87.75   435
88  436
88.25   437
88.75   437
89  438
89.25   438
89.5    439
90  441
90.25   442
90.5    443
90.75   444
91.25   444
91.5    445
91.75   447
92  448
92.25   449
92.5    449
93  450
93.25   451
93.5    451
94  451
94.25   451
94.75   452
95  453
95.5    455
95.75   455
96.25   455
96.5    456
96.75   458
97.25   460
97.5    460
97.75   461
98  462
98.5    465
98.75   467
99  468
99.25   469
99.75   471
100 472
100.5   473
100.75  473
101 474
101.5   476
101.75  477
102.25  478
102.5   478
102.75  479
103.25  479
103.5   480
103.75  482
104 485
104.5   487
104.75  487
105 488
105.25  491
105.5   494
106 496
106.25  495
106.5   495
106.75  498
107 500
107.75  501
108 501
108.25  502
108.5   504
108.75  505
109.25  506
109.5   507
109.75  507
110.25  509
110.75  511
111 512
111.5   513
111.75  515
112.25  516
112.5   517
113 518
113.25  521
113.5   525
114 526
114.25  527
114.75  528
115 531
115.5   536
116 537
116.25  539
116.5   541
117 543
117.5   544
117.75  547
118.25  549
118.5   553
119 556
119.25  559
119.5   562
120 564
120.25  566
120.5   569
121 573
121.25  575
121.75  578
122 580
122.25  583
122.75  586
123 588
123.5   591
123.75  595
124 598
124.5   600
124.75  602
125 607
125.5   610
125.75  612
126 615
126.25  618
126.5   622
127 626
127.25  628
127.5   631
127.75  634
128.25  638
128.75  641
129 642
129.5   645
129.75  649
130.25  651
130.75  653
131 656
131.25  660
131.75  665
132.25  668
132.5   672
132.75  677
133.25  683
133.5   687
133.75  690
134.25  695
134.5   701
135 705
135.25  710
135.75  715
136 718
136.5   723
136.75  726
137 730
137.5   735
138 738
138.25  743
138.5   747
139 753
139.25  758
139.5   761
139.75  765
140.25  771
140.5   774
140.75  779
141.25  785
141.5   788
141.75  793
142.25  797
142.5   800
143 807
143.25  810
143.75  815
144 820
144.25  823
144.75  829
145 832
145.5   836
145.75  841
146 845
146.5   850
147 854
147.25  859
147.5   863
148.25  868
148.5   872
148.75  877
149 881
149.5   886
149.75  890
150.25  895
150.5   899
151 904
151.25  907
151.75  912
152 916
152.5   921
153 927
153.25  931
153.5   935
154 941
154.25  944
154.5   947
154.75  951
155.25  956
155.5   959
155.75  963
156.25  967
156.5   970
157 975
157.25  979
157.5   982
157.75  986
158.25  991
158.5   994
158.75  997
159.25  1001
159.5   1005
159.75  1008
160 1012
160.5   1014
160.75  1018
161 1021
161.25  1023
161.75  1026
162 1030
162.25  1033
162.75  1037
163 1039
163.25  1043
163.75  1045
164 1047
164.25  1050
164.5   1052
165 1055
165.25  1058
165.5   1060
166 1062
166.25  1064
166.5   1067
167 1069
167.25  1072
167.5   1074
168 1076
168.25  1077
168.5   1081
168.75  1083
169.25  1085
169.5   1088
170 1090
170.25  1093
170.5   1095
171 1097
171.25  1099
171.5   1101
172 1103
172.5   1105
172.75  1107
173 1108
173.25  1109
173.75  1110
174 1112
174.5   1113
174.75  1113
175 1115
175.5   1116
176 1118
176.25  1119
176.5   1120
177 1121
177.25  1122
177.5   1122
177.75  1122
178.25  1123
178.5   1123
179 1124
179.25  1125
179.75  1126
180 1126
180.25  1126
180.75  1126
181.25  1126
181.5   1126
181.75  1126
182.25  1126
182.5   1126
183 1126
183.25  1125
183.5   1125
184 1125
184.5   1125
184.75  1124
185.25  1123
185.5   1122
185.75  1121
186.25  1121
186.5   1120
187.25  1118
187.75  1117
188 1116
188.25  1114
188.75  1113
189 1112
189.25  1111
189.5   1109
190 1108
190.25  1107
190.5   1105
190.75  1104
191.25  1102
191.5   1100
191.75  1099
192 1097
192.25  1096
192.75  1093
193.25  1090
193.5   1089
193.75  1087
194 1084
194.25  1083
194.75  1081
195 1078
195.25  1076
195.5   1074
196 1072
196.25  1069
196.5   1067
196.75  1065
197 1064
197.5   1060
197.75  1059
198.25  1056
198.5   1052
199 1048
199.25  1046
199.5   1043
199.75  1041
200 1038
200.5   1035
200.75  1032
201.25  1029
201.5   1026
201.75  1024
202.25  1020
202.5   1018
202.75  1014
203 1012
203.25  1008
203.5   1005
203.75  1002
204.25  998
204.5   996
204.5   993
205 990
205.5   985
205.75  981
206 978
206.5   974
206.75  971
207.25  966
207.5   963
208 958
208.5   955
208.75  953
209.25  949
209.5   945
209.75  942
210.25  937
210.5   932
211 928
211.25  924
211.75  920
212 916
212.25  912
212.75  908
213 903
213.25  900
213.5   897
214 893
214.25  890
214.5   885
214.75  881
215.25  877
215.5   874
215.75  870
216 868
216.5   864
217 858
217.25  855
217.75  849
218 846
218.25  842
218.75  839
219 835
219.25  832
219.5   829
220 825
220.25  821
220.5   817
220.75  813
221.25  810
221.5   806
222 802
222.25  798
222.75  792
223.25  788
223.5   785
224 779
224.5   775
224.75  772
225.25  766
225.75  762
226.25  757
226.75  753
227 749
227.5   744
228 740
228.5   735
229 731
229.25  727
230 721
230.25  718
230.75  713
231.25  709
231.75  705
232 701
232.5   696
233 692
233.5   689
233.75  685
234.5   680
234.75  677
235.25  673
235.75  668
236.25  663
236.75  660
237.25  656
237.75  652
238.25  648
238.75  643
239.5   637
240 633
240.25  630
241 626
241.25  624
241.75  619
242.25  616
242.75  613
243.25  610
243.75  607
244.25  604
244.75  601
245.25  598
245.75  595
246.25  592
246.5   589
247.25  586
247.75  582
248.25  579
249 576
249.25  573
250 570
250.25  568
250.75  565
251.25  562
251.75  560
252.25  557
252.75  554
253.25  551
253.75  548
254.25  546
255 543
255.5   541
255.75  539
256.5   535
257 531
257.5   529
258 527
258.5   524
259 522
259.5   520
260 518
260.25  515
261 512
261.25  509
262 507
262.5   505
263 502
263.5   500
264 498
264.5   496
265.25  494
265.75  492
266 490
266.5   488
267 487
267.75  485
268.25  484
268.75  482
269.25  480
269.75  478
270.25  475
271 472
271.5   471
272 469
272.5   466
273 465
273.5   463
274 462
274.5   460
275 459
275.5   456
276 454
276.5   451
277 449
277.5   448
278 447
278.5   446
279.25  444
279.75  442
280.25  441
280.75  438
281.25  437
282 436
282.5   434
283 433
283.75  431
284 430
284.5   429
284.75  428
285.25  427
285.75  426
286.25  425
287 423
287.5   422
288 421
288.5   420
289 418
289.5   417
290 416
290.5   414
291 413
291.5   412
292 410
292.5   409
293 408
293.5   407
294 406
294.25  406
294.75  405
295.5   403
296 402
296.25  402
296.75  401
297.25  400
297.75  400
298.25  399
298.75  398
299 398
299.5   397
300 396
300.5   395
301 394
301.25  393
301.75  392
302.25  392
303 390
303.25  389
303.5   389
304 389
304.75  388
305 388
305.5   387
305.75  387
306.25  386
306.75  386
307.25  385
307.5   385
308 384
308.5   383
309 382
309.5   381
310 381
310.25  381
310.75  380
311.25  380
311.75  379
312 379
312.5   379
313 378
313.5   377
314 377
314.25  377
314.75  376
315.25  376
315.75  376
316.25  375
316.75  375
317 375
317.75  374
318 373
318.5   373
319 372
319.5   372
320 372
320.5   372
321 371
321.25  371
321.5   371
322.25  370
322.5   370
323 370
323.5   369
323.75  369
324.5   368
324.75  368
325.25  367
325.75  367
326.25  367
326.5   366
327 366
327.5   366
328 365
328.5   365
329 365
329.25  365
330 364
330.25  365
330.75  364
331 364
331.5   364
332 364
332.5   364
333 364
333.5   363
333.75  363
334.5   363
334.75  363
335.25  362
335.5   362
336 362
336.5   361
337 361
337.5   361
337.75  360
338.5   360
338.75  360
339.25  360
339.75  360
340 360
340.25  360
340.75  360
341.5   360
341.75  360
342.25  360
342.5   360
343 360
343.25  360
343.75  360
344.25  360
344.5   360
345 359
345.5   359
345.75  359
346.25  359
346.75  359
347 359
347.5   359
348 359
348.25  359
348.5   359
349 359
349.5   359
350 358
350.25  358
350.75  358
351.25  358
351.5   358
351.75  358
352.25  359
352.75  359
353 359
353.5   359
353.75  359
354 359
354.25  359
354.75  359
355.25  358
355.75  358
356 358
356.25  358
356.75  358
357.25  358
357.5   357
357.75  357
358.25  357

第一个系数 (a[0]),常量有问题。你不应该将它乘以余弦。看看at wiki.

我不确定您的情况是否需要这种缩放比例(除以 2),但最好遵循一些约定:

def fourier(x, *a):
    ret = a[0] / 2
    for deg in range(1, len(a)):
        ret += a[deg] * np.cos((deg+1) * np.pi / tau * x)
    return ret