Equation of the parabola enclosing a scatter plot

只愿长相守 提交于 2019-12-20 02:33:07

问题


I have the x and y coordinates of the following graph as two different lists s and k. If I want to determine the equation of the parabola that best encloses these points, how do I do it?

Thanks!

I am not sure how to link to an external data set.

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

This was the best I could find. So, I am putting up a sample data set here. I will be removing this later, though.

                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

回答1:


This solution requires some iterations but seems to work most of the time. In same occasions, however, it gets stuck with the parabola on the wrong side, sometimes the opening seems by far too wide. But if the input data is as dense as the image of the OP suggests ( in contrast to my random input data ), this is probably avoided.

The example uses parabolas of type a + b * x**2 but adding a linear term is no problem.

Code is as follows:

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()

Output is:

>>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]

and




回答2:


Try this code out. It approximates the parabola through trial and error.

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()

Try it. If it approximates to roughly for you try fiddling around with what x^2 is divided by.

Also, as your dataset size increases, try to increase the value in the line if g>=4:

You can decide on which size works best for you.

EDIT Updated code: this works better.



来源:https://stackoverflow.com/questions/50638823/equation-of-the-parabola-enclosing-a-scatter-plot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!