包含散点图的抛物线方程

时间:2018-06-01 08:05:39

标签: python python-3.x curve-fitting

我将下图的x和y坐标作为两个不同的列表s和k。如果我想确定最能包含这些点的抛物线方程,我该怎么做?

enter image description here

谢谢!

我不确定如何链接到外部数据集。

What is the best way to add your dataset to a question?

这是我能找到的最好的。所以,我在这里提供一个样本数据集。不过,我稍后会删除它。

                K             S
0    9.500000e-01 -6.500000e-01
1    8.500000e-01 -6.000000e-01
2    9.000000e-01 -6.000000e-01
3    9.500000e-01 -6.000000e-01
4    7.000000e-01 -5.500000e-01
5    7.500000e-01 -5.500000e-01
6    8.000000e-01 -5.500000e-01
7    8.500000e-01 -5.500000e-01
8    9.000000e-01 -5.500000e-01
9    9.500000e-01 -5.500000e-01
10   6.000000e-01 -5.000000e-01
11   6.500000e-01 -5.000000e-01
12   7.000000e-01 -5.000000e-01
13   7.500000e-01 -5.000000e-01
14   8.000000e-01 -5.000000e-01
15   8.500000e-01 -5.000000e-01
16   9.000000e-01 -5.000000e-01
17   9.500000e-01 -5.000000e-01
18   5.000000e-01 -4.500000e-01
19   5.500000e-01 -4.500000e-01
20   6.000000e-01 -4.500000e-01
21   6.500000e-01 -4.500000e-01
22   7.000000e-01 -4.500000e-01
23   7.500000e-01 -4.500000e-01
24   8.000000e-01 -4.500000e-01
25   8.500000e-01 -4.500000e-01
26   9.000000e-01 -4.500000e-01
27   9.500000e-01 -4.500000e-01
28   4.000000e-01 -4.000000e-01
29   4.500000e-01 -4.000000e-01
30   5.000000e-01 -4.000000e-01
31   5.500000e-01 -4.000000e-01
32   6.000000e-01 -4.000000e-01
33   6.500000e-01 -4.000000e-01
34   7.000000e-01 -4.000000e-01
35   7.500000e-01 -4.000000e-01
36   8.000000e-01 -4.000000e-01
37   8.500000e-01 -4.000000e-01
38   9.000000e-01 -4.000000e-01
39   9.500000e-01 -4.000000e-01
40   3.000000e-01 -3.500000e-01
41   3.500000e-01 -3.500000e-01
42   4.000000e-01 -3.500000e-01
43   4.500000e-01 -3.500000e-01
44   5.000000e-01 -3.500000e-01
45   5.500000e-01 -3.500000e-01
46   6.000000e-01 -3.500000e-01
47   6.500000e-01 -3.500000e-01
48   7.000000e-01 -3.500000e-01
49   7.500000e-01 -3.500000e-01
50   8.000000e-01 -3.500000e-01
51   8.500000e-01 -3.500000e-01
52   9.000000e-01 -3.500000e-01
53   9.500000e-01 -3.500000e-01
54   2.000000e-01 -3.000000e-01
55   2.500000e-01 -3.000000e-01
56   3.000000e-01 -3.000000e-01
57   3.500000e-01 -3.000000e-01
58   4.000000e-01 -3.000000e-01
59   4.500000e-01 -3.000000e-01
60   5.000000e-01 -3.000000e-01
61   5.500000e-01 -3.000000e-01
62   6.000000e-01 -3.000000e-01
63   6.500000e-01 -3.000000e-01
64   7.000000e-01 -3.000000e-01
65   7.500000e-01 -3.000000e-01
66   8.000000e-01 -3.000000e-01
67   8.500000e-01 -3.000000e-01
68   9.000000e-01 -3.000000e-01
69   9.500000e-01 -3.000000e-01
70   1.000000e-01 -2.500000e-01
71   1.500000e-01 -2.500000e-01
72   2.000000e-01 -2.500000e-01
73   2.500000e-01 -2.500000e-01
74   3.000000e-01 -2.500000e-01
75   3.500000e-01 -2.500000e-01
76   4.000000e-01 -2.500000e-01
77   4.500000e-01 -2.500000e-01
78   5.000000e-01 -2.500000e-01
79   5.500000e-01 -2.500000e-01
80   6.000000e-01 -2.500000e-01
81   6.500000e-01 -2.500000e-01
82   7.000000e-01 -2.500000e-01
83   7.500000e-01 -2.500000e-01
84   8.000000e-01 -2.500000e-01
85   8.500000e-01 -2.500000e-01
86   9.000000e-01 -2.500000e-01
87   9.500000e-01 -2.500000e-01
88   5.000000e-02 -2.000000e-01
89   1.000000e-01 -2.000000e-01
90   1.500000e-01 -2.000000e-01
91   2.000000e-01 -2.000000e-01
92   2.500000e-01 -2.000000e-01
93   3.000000e-01 -2.000000e-01
94   3.500000e-01 -2.000000e-01
95   4.000000e-01 -2.000000e-01
96   4.500000e-01 -2.000000e-01
97   5.000000e-01 -2.000000e-01
98   5.500000e-01 -2.000000e-01
99   6.000000e-01 -2.000000e-01
100  6.500000e-01 -2.000000e-01
101  7.000000e-01 -2.000000e-01
102  7.500000e-01 -2.000000e-01
103  8.000000e-01 -2.000000e-01
104  8.500000e-01 -2.000000e-01
105  9.000000e-01 -2.000000e-01
106  9.500000e-01 -2.000000e-01
107  8.881784e-16 -1.500000e-01
108  5.000000e-02 -1.500000e-01
109  1.000000e-01 -1.500000e-01
110  1.500000e-01 -1.500000e-01
111  2.000000e-01 -1.500000e-01
112  2.500000e-01 -1.500000e-01
113  3.000000e-01 -1.500000e-01
114  3.500000e-01 -1.500000e-01
115  4.000000e-01 -1.500000e-01
116  4.500000e-01 -1.500000e-01
117  5.000000e-01 -1.500000e-01
118  5.500000e-01 -1.500000e-01
119  6.000000e-01 -1.500000e-01
120  6.500000e-01 -1.500000e-01
121  7.000000e-01 -1.500000e-01
122  7.500000e-01 -1.500000e-01
123  8.000000e-01 -1.500000e-01
124  8.500000e-01 -1.500000e-01
125  9.000000e-01 -1.500000e-01
126  9.500000e-01 -1.500000e-01
127 -5.000000e-02 -1.000000e-01
128  8.881784e-16 -1.000000e-01
129  5.000000e-02 -1.000000e-01
130  1.000000e-01 -1.000000e-01
131  1.500000e-01 -1.000000e-01
132  2.000000e-01 -1.000000e-01
133  2.500000e-01 -1.000000e-01
134  3.000000e-01 -1.000000e-01
135  3.500000e-01 -1.000000e-01
136  4.000000e-01 -1.000000e-01
137  4.500000e-01 -1.000000e-01
138  5.000000e-01 -1.000000e-01
139  5.500000e-01 -1.000000e-01
140  6.000000e-01 -1.000000e-01
141  6.500000e-01 -1.000000e-01
142  7.000000e-01 -1.000000e-01
143  7.500000e-01 -1.000000e-01
144  8.000000e-01 -1.000000e-01
145  8.500000e-01 -1.000000e-01
146  9.000000e-01 -1.000000e-01
147  9.500000e-01 -1.000000e-01
148 -1.000000e-01 -5.000000e-02
149 -5.000000e-02 -5.000000e-02
150  8.881784e-16 -5.000000e-02
151  5.000000e-02 -5.000000e-02
152  1.000000e-01 -5.000000e-02
153  1.500000e-01 -5.000000e-02
154  2.000000e-01 -5.000000e-02
155  2.500000e-01 -5.000000e-02
156  3.000000e-01 -5.000000e-02
157  3.500000e-01 -5.000000e-02
158  4.000000e-01 -5.000000e-02
159  4.500000e-01 -5.000000e-02
160  5.000000e-01 -5.000000e-02
161  5.500000e-01 -5.000000e-02
162  6.000000e-01 -5.000000e-02
163  6.500000e-01 -5.000000e-02
164  7.000000e-01 -5.000000e-02
165  7.500000e-01 -5.000000e-02
166  8.000000e-01 -5.000000e-02
167  8.500000e-01 -5.000000e-02
168  9.000000e-01 -5.000000e-02
169  9.500000e-01 -5.000000e-02
170 -1.500000e-01  8.881784e-16
171 -1.000000e-01  8.881784e-16
172 -5.000000e-02  8.881784e-16
173  8.881784e-16  8.881784e-16
174  5.000000e-02  8.881784e-16
175  1.000000e-01  8.881784e-16
176  1.500000e-01  8.881784e-16
177  2.000000e-01  8.881784e-16
178  2.500000e-01  8.881784e-16
179  3.000000e-01  8.881784e-16
180  3.500000e-01  8.881784e-16
181  4.000000e-01  8.881784e-16
182  4.500000e-01  8.881784e-16
183  5.000000e-01  8.881784e-16
184  5.500000e-01  8.881784e-16
185  6.000000e-01  8.881784e-16
186  6.500000e-01  8.881784e-16
187  7.000000e-01  8.881784e-16
188  7.500000e-01  8.881784e-16
189  8.000000e-01  8.881784e-16
190  8.500000e-01  8.881784e-16
191  9.000000e-01  8.881784e-16
192  9.500000e-01  8.881784e-16
193 -2.000000e-01  5.000000e-02
194 -1.500000e-01  5.000000e-02
195 -1.000000e-01  5.000000e-02
196 -5.000000e-02  5.000000e-02
197  8.881784e-16  5.000000e-02
198  5.000000e-02  5.000000e-02
199  1.000000e-01  5.000000e-02
200  1.500000e-01  5.000000e-02
201  2.000000e-01  5.000000e-02
202  2.500000e-01  5.000000e-02
203  3.000000e-01  5.000000e-02
204  3.500000e-01  5.000000e-02
205  4.000000e-01  5.000000e-02
206  4.500000e-01  5.000000e-02
207  5.000000e-01  5.000000e-02
208  5.500000e-01  5.000000e-02
209  6.000000e-01  5.000000e-02
210  6.500000e-01  5.000000e-02
211  7.000000e-01  5.000000e-02
212  7.500000e-01  5.000000e-02
213  8.000000e-01  5.000000e-02
214  8.500000e-01  5.000000e-02
215  9.000000e-01  5.000000e-02
216  9.500000e-01  5.000000e-02
217 -2.000000e-01  1.000000e-01
218 -1.500000e-01  1.000000e-01
219 -1.000000e-01  1.000000e-01
220 -5.000000e-02  1.000000e-01
221  8.881784e-16  1.000000e-01
222  5.000000e-02  1.000000e-01
223  1.000000e-01  1.000000e-01
224  1.500000e-01  1.000000e-01
225  2.000000e-01  1.000000e-01
226  2.500000e-01  1.000000e-01
227  3.000000e-01  1.000000e-01
228  3.500000e-01  1.000000e-01
229  4.000000e-01  1.000000e-01
230  4.500000e-01  1.000000e-01
231  5.000000e-01  1.000000e-01
232  5.500000e-01  1.000000e-01
233  6.000000e-01  1.000000e-01
234  6.500000e-01  1.000000e-01
235  7.000000e-01  1.000000e-01
236  7.500000e-01  1.000000e-01
237  8.000000e-01  1.000000e-01
238  8.500000e-01  1.000000e-01
239  9.000000e-01  1.000000e-01
240  9.500000e-01  1.000000e-01
241 -1.500000e-01  1.500000e-01
242 -1.000000e-01  1.500000e-01
243 -5.000000e-02  1.500000e-01
244  8.881784e-16  1.500000e-01
245  5.000000e-02  1.500000e-01
246  1.000000e-01  1.500000e-01
247  1.500000e-01  1.500000e-01
248  2.000000e-01  1.500000e-01
249  2.500000e-01  1.500000e-01
250  3.000000e-01  1.500000e-01
251  3.500000e-01  1.500000e-01
252  4.000000e-01  1.500000e-01
253  4.500000e-01  1.500000e-01
254  5.000000e-01  1.500000e-01
255  5.500000e-01  1.500000e-01
256  6.000000e-01  1.500000e-01
257  6.500000e-01  1.500000e-01
258  7.000000e-01  1.500000e-01
259  7.500000e-01  1.500000e-01
260  8.000000e-01  1.500000e-01
261  8.500000e-01  1.500000e-01
262  9.000000e-01  1.500000e-01
263  9.500000e-01  1.500000e-01
264 -1.000000e-01  2.000000e-01
265 -5.000000e-02  2.000000e-01
266  8.881784e-16  2.000000e-01
267  5.000000e-02  2.000000e-01
268  1.000000e-01  2.000000e-01
269  1.500000e-01  2.000000e-01
270  2.000000e-01  2.000000e-01
271  2.500000e-01  2.000000e-01
272  3.000000e-01  2.000000e-01
273  3.500000e-01  2.000000e-01
274  4.000000e-01  2.000000e-01
275  4.500000e-01  2.000000e-01
276  5.000000e-01  2.000000e-01
277  5.500000e-01  2.000000e-01
278  6.000000e-01  2.000000e-01
279  6.500000e-01  2.000000e-01
280  7.000000e-01  2.000000e-01
281  7.500000e-01  2.000000e-01
282  8.000000e-01  2.000000e-01
283  8.500000e-01  2.000000e-01
284  9.000000e-01  2.000000e-01
285  9.500000e-01  2.000000e-01
286 -5.000000e-02  2.500000e-01
287  8.881784e-16  2.500000e-01
288  5.000000e-02  2.500000e-01
289  1.000000e-01  2.500000e-01
290  1.500000e-01  2.500000e-01
291  2.000000e-01  2.500000e-01
292  2.500000e-01  2.500000e-01
293  3.000000e-01  2.500000e-01
294  3.500000e-01  2.500000e-01
295  4.000000e-01  2.500000e-01
296  4.500000e-01  2.500000e-01
297  5.000000e-01  2.500000e-01
298  5.500000e-01  2.500000e-01
299  6.000000e-01  2.500000e-01
300  6.500000e-01  2.500000e-01
301  7.000000e-01  2.500000e-01
302  7.500000e-01  2.500000e-01
303  8.000000e-01  2.500000e-01
304  8.500000e-01  2.500000e-01
305  9.000000e-01  2.500000e-01
306  9.500000e-01  2.500000e-01
307  8.881784e-16  3.000000e-01
308  5.000000e-02  3.000000e-01
309  1.000000e-01  3.000000e-01
310  1.500000e-01  3.000000e-01
311  2.000000e-01  3.000000e-01
312  2.500000e-01  3.000000e-01
313  3.000000e-01  3.000000e-01
314  3.500000e-01  3.000000e-01
315  4.000000e-01  3.000000e-01
316  4.500000e-01  3.000000e-01
317  5.000000e-01  3.000000e-01
318  5.500000e-01  3.000000e-01
319  6.000000e-01  3.000000e-01
320  6.500000e-01  3.000000e-01
321  7.000000e-01  3.000000e-01
322  7.500000e-01  3.000000e-01
323  8.000000e-01  3.000000e-01
324  8.500000e-01  3.000000e-01
325  9.000000e-01  3.000000e-01
326  9.500000e-01  3.000000e-01
327  5.000000e-02  3.500000e-01
328  1.000000e-01  3.500000e-01
329  1.500000e-01  3.500000e-01
330  2.000000e-01  3.500000e-01
331  2.500000e-01  3.500000e-01
332  3.000000e-01  3.500000e-01
333  3.500000e-01  3.500000e-01
334  4.000000e-01  3.500000e-01
335  4.500000e-01  3.500000e-01
336  5.000000e-01  3.500000e-01
337  5.500000e-01  3.500000e-01
338  6.000000e-01  3.500000e-01
339  6.500000e-01  3.500000e-01
340  7.000000e-01  3.500000e-01
341  7.500000e-01  3.500000e-01
342  8.000000e-01  3.500000e-01
343  8.500000e-01  3.500000e-01
344  9.000000e-01  3.500000e-01
345  9.500000e-01  3.500000e-01
346  1.500000e-01  4.000000e-01
347  2.000000e-01  4.000000e-01
348  2.500000e-01  4.000000e-01
349  3.000000e-01  4.000000e-01
350  3.500000e-01  4.000000e-01
351  4.000000e-01  4.000000e-01
352  4.500000e-01  4.000000e-01
353  5.000000e-01  4.000000e-01
354  5.500000e-01  4.000000e-01
355  6.000000e-01  4.000000e-01
356  6.500000e-01  4.000000e-01
357  7.000000e-01  4.000000e-01
358  7.500000e-01  4.000000e-01
359  8.000000e-01  4.000000e-01
360  8.500000e-01  4.000000e-01
361  9.000000e-01  4.000000e-01
362  9.500000e-01  4.000000e-01
363  2.000000e-01  4.500000e-01
364  2.500000e-01  4.500000e-01
365  3.000000e-01  4.500000e-01
366  3.500000e-01  4.500000e-01
367  4.000000e-01  4.500000e-01
368  4.500000e-01  4.500000e-01
369  5.000000e-01  4.500000e-01
370  5.500000e-01  4.500000e-01
371  6.000000e-01  4.500000e-01
372  6.500000e-01  4.500000e-01
373  7.000000e-01  4.500000e-01
374  7.500000e-01  4.500000e-01
375  8.000000e-01  4.500000e-01
376  8.500000e-01  4.500000e-01
377  9.000000e-01  4.500000e-01
378  9.500000e-01  4.500000e-01
379  3.000000e-01  5.000000e-01
380  3.500000e-01  5.000000e-01
381  4.000000e-01  5.000000e-01
382  4.500000e-01  5.000000e-01
383  5.000000e-01  5.000000e-01
384  5.500000e-01  5.000000e-01
385  6.000000e-01  5.000000e-01
386  6.500000e-01  5.000000e-01
387  7.000000e-01  5.000000e-01
388  7.500000e-01  5.000000e-01
389  8.000000e-01  5.000000e-01
390  8.500000e-01  5.000000e-01
391  9.000000e-01  5.000000e-01
392  9.500000e-01  5.000000e-01
393  4.000000e-01  5.500000e-01
394  4.500000e-01  5.500000e-01
395  5.000000e-01  5.500000e-01
396  5.500000e-01  5.500000e-01
397  6.000000e-01  5.500000e-01
398  6.500000e-01  5.500000e-01
399  7.000000e-01  5.500000e-01
400  7.500000e-01  5.500000e-01
401  8.000000e-01  5.500000e-01
402  8.500000e-01  5.500000e-01
403  9.000000e-01  5.500000e-01
404  9.500000e-01  5.500000e-01
405  5.000000e-01  6.000000e-01
406  5.500000e-01  6.000000e-01
407  6.000000e-01  6.000000e-01
408  6.500000e-01  6.000000e-01
409  7.000000e-01  6.000000e-01
410  7.500000e-01  6.000000e-01
411  8.000000e-01  6.000000e-01
412  8.500000e-01  6.000000e-01
413  9.000000e-01  6.000000e-01
414  9.500000e-01  6.000000e-01
415  6.000000e-01  6.500000e-01
416  6.500000e-01  6.500000e-01
417  7.000000e-01  6.500000e-01
418  7.500000e-01  6.500000e-01
419  8.000000e-01  6.500000e-01
420  8.500000e-01  6.500000e-01
421  9.000000e-01  6.500000e-01
422  9.500000e-01  6.500000e-01
423  7.500000e-01  7.000000e-01
424  8.000000e-01  7.000000e-01
425  8.500000e-01  7.000000e-01
426  9.000000e-01  7.000000e-01
427  9.500000e-01  7.000000e-01
428  8.500000e-01  7.500000e-01
429  9.000000e-01  7.500000e-01
430  9.500000e-01  7.500000e-01

2 个答案:

答案 0 :(得分:2)

此解决方案需要一些迭代,但似乎大部分时间都有效。然而,在同样的情况下,它会被错误的抛物线卡住,有时开口看起来太宽了。但是,如果输入数据与OP建议的图像一样密集(与我的随机输入数据相反),则可能会避免这种情况。

该示例使用a + b * x**2类型的抛物线,但添加线性项是没有问题的。

代码如下:

import matplotlib.pyplot as plt
import numpy as np
from random import random
from scipy.optimize import leastsq, curve_fit, fmin
from scipy.spatial import ConvexHull
import warnings
np.set_printoptions( precision = 5 )

def parabola( x, a, b, c ):
    return a + b * x + c * x**2

### find the shortest distance between a given point and a parabola
### actually give x such as ( x, f(x) ) is closest to ( x0, y0 )
def orth_dist( x0, y0, a, b, c ):
    f = lambda x: np.sqrt( ( x - x0 )**2 + ( parabola( x, a, b, c ) - y0 )**2 )
    sol = fmin( f, x0, disp=False )
    return sol[ 0 ]

### cost function: standard distance if point is above parabola
### or extra cost if point is below
def myDist( r, dy , off=4e0 ):
    out =  abs( r )
    if dy <= 0:
        out = max( [out, off + off * abs( r)  ] )
    return out

def residuals( p, data, off=0 ): # data is of type [ [x0,y0], [x1,y1],... ] 
    xList, yList = zip( *data )
    ### a standard fit uses the distance in y direction between curve and 
    ### data point. Here it is better to use the shortest distance.
    ### To find the shortest distance some extra numerics is required.
    xopt = [ orth_dist( x0, y0, *p ) for x0, y0 in zip( xList, yList ) ]
    yopt = [ parabola( x, *p ) for x in xopt ]
    yFitList = [ parabola( x, *p ) for x in xList ]
    rList = [ np.sqrt( ( x - x0 )**2 + (y - y0 )**2 ) for x, x0, y , y0 in zip( xList, xopt, yList, yopt ) ]
    signList = [ y - yTh  for y, yTh in zip( yList, yFitList ) ]
    out = [ myDist( r, dy , off=off ) for r, dy in zip( rList, signList ) ]
    return out

### removing the upper points of the convex hull
### as it is convex, it can be at most a straight line 
### from the most left to the most right point
### if a point of the hull is on or above this line, dump it
def remove_upper( data ):
    sortedByX = sorted( data)
    xList, yList = zip( *sortedByX )
    m = ( yList[-1] - yList[0] ) / ( xList[-1] - xList[0] )
    out = [ sortedByX[0] ]
    for p in range( 1, len(data ) ):
        x = xList[ p ]
        y = yList[ p ]
        if y < m * ( x - xList[0]) + yList[0]:
            out += [ sortedByX[ p ] ]
    out += [ sortedByX[ -1 ] ]
    return out

### my choice of 'true' parameters
myParameters = ( .45, -1.3, 2.33)

### just some random data for testing
scatterData = list()
for i in range(180):
    x = 3*( 2 * random() - 1) + 1.1
    y = 8 * random()
    if y > parabola( x, *myParameters ):
        scatterData += [ [ x, y ] ]

### to fit the parabula we do not need inner points, 
### so let's take the convex hull
hull = ConvexHull(scatterData )
scatterDataHull = list()
for index in hull.vertices:
    scatterDataHull += [ scatterData[ index ] ]

### the upper points of the convex hull are also useless 
#### if not disturbing, so get rid of them as well 
scatterDataHullR = remove_upper( scatterDataHull )

### exact data for plotting
xxList = np.linspace( -4, 4, 300 )
yyList = [ parabola( x, *myParameters ) for x in xxList ]

scatterX, scatterY =zip(*scatterDataHullR)

start, pcov = curve_fit( parabola,  *zip(*scatterDataHullR) )

fit = list( start )
counter = 0
test = True
myOff = .1
while test:
    counter += 1
    ### "simple" fit with orthogonal distance
    fit, err = leastsq( residuals, x0=fit, args=( scatterDataHullR, myOff ) )
    ### as points below the parabola are forbidden, we give those a high
    ### cost in the fitting. Starting with very high costs, however, 
    ### results in bad convergence. So we start with a rather low cost,
    ### check if some points are below and---if so---increase the cost.
    ### We then fit again with the previous result as starting point.
    ### (Note sometimes this fails, but I did not have time to
    ### investigate this cases. Moreover I hope that this is due 
    ### to my quite random points, while the points in the OP look 
    ### by for more regular.)
    print "fit",fit 
    xList, yList = zip( *scatterDataHullR )
    yFitList = [ parabola( x, *fit ) for x in xList ]
    signList = [ y - yTh  for y, yTh in zip( yList, yFitList ) ]
    print counter, myOff
    print signList
    if min( signList ) < 0:
        myOff *= 2
    else:
        test = False
    if counter > 50: # maxiter
        test = False
        warnings.warn( "Max iterations reached.", UserWarning )

startList = [ parabola( x, *start ) for x in xxList ]
fitList = [ parabola( x, *fit ) for x in xxList ]

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( xxList, yyList , label='true parabula')
ax.plot( xxList, startList, label='simple fit' )
ax.plot( xxList, fitList, label='result')
ax.scatter( *zip( *scatterData ), s=60, label='full data')
ax.scatter( *zip( *scatterDataHull ), s=40, label='convex hull')
ax.scatter( *zip( *scatterDataHullR ), s=20, label='lower hull' )
ax.legend( loc=0 )
ax.set_xlim( [ -2, 5 ] )
ax.set_ylim( [ 0, 10 ] )
plt.show()

输出是:

>>fit [ 0.62572 -1.75611  2.81445]
>>1 0.1
>>[0.6213711303862084, 0.18684681979766804, -0.30967646606163246, -0.146185783279136, 1.5115384666142262e-08, 0.04091503213347902, -0.22456258154469477, -0.10366901944547369]
>>fit [ 0.6484  -1.80986  2.75176]
>>2 0.2
>>[0.62199186259362, 0.17515271586535786, -0.34273136096659584, -0.17923227341075365, 9.718855165097295e-10, 0.057645756995909014, -0.10363664705794662, 0.13933840419257315]
>>fit [ 0.6484  -1.80986  2.75176]
>>3 0.4
>>[0.62199186259362, 0.17515271586535786, -0.34273136096659584, -0.17923227341075365, 9.718855165097295e-10, 0.057645756995909014, -0.10363664705794662, 0.13933840419257315]
>>fit [ 0.53489 -1.56037  2.54129]
>>4 0.8
>>[1.3184522612014575, 0.7674472388911582, -0.021666294928952112, 0.025470161835318805, 0.056401815047789794, 0.10025191012633528, 2.6445583856116173e-07, 0.4250810523461581]
>>fit [ 0.51566 -1.53254  2.53166]
>>5 1.6
>>[1.3836247162551256, 0.8254553204503852, 0.016315167888327764, 0.0536843248273029, 0.06793421458085641, 0.10848235358916569, 2.42328743738085e-08, 0.42471967128564003]

enter image description here

答案 1 :(得分:0)

尝试使用此代码。它通过反复试验来近似抛物线。

import matplotlib.pyplot as plt
import numpy as np
s = list([0,1,2,3,4,5,6,7,8])
k = list([0,1,4,9,16,25,36,49,64]) #Insert Data Here(positive side only)

def parab(x):
    for f in range(0,len(s)): 
        v = f**2/(x/2)
        yield v

def parab2():
    t = 201
    for i in range(0,200):
        g = 0
        t-=1
        foo = np.fromiter(parab(t), dtype = 'int')
        for bar in range(0,len(s)):
            if foo[bar] < k[bar]+0.5 and foo[bar] > k[bar]-0.5:
                g += 1
        if g >= len(s)/2:
            print(foo)
            print("x**2/",t/2)

parab2()

试试吧。如果它粗略地近似于你,那就试着摆弄x ^ 2被除以的东西。

此外,随着数据集大小的增加,请尝试增加行中的值 if g>=4:

您可以决定哪种尺寸最适合您。

编辑更新后的代码:效果更好。