Как я могу генерировать числа между x и n с кривой с Python? - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь сгенерировать нелинейную кривую между двумя целыми числами, скажем, 0 и 25, которая соответствует этой кривой:

enter image description here

Это кажется глупой простой проблемой, нужная мне кривая даже выглядит как часть круга, поэтому создание большого круга и выделение точек в правом нижнем углу решит эту проблему, но я не знаю, как это сделать что-нибудь из этого.

Все, что мне нужно, это список от 0 до 25 с кривой, являющейся частью этого списка, если это имеет смысл. Начиная медленно увеличиваться, затем ускоряться, а затем приближаться к концу.

Я пробовал это с похожим результатом, но он не под точным углом / кривой.

x=[]
y=range(25)

for i in range(25):
    x.append((i**.25)**2)

plt.plot(x, y)
plt.show()

enter image description here

Спасибо

1 Ответ

3 голосов
/ 28 марта 2019

Если вы действительно хотите иметь ту же кривую, вы можете загрузить изображение графика и использовать PIL для получения каждого синего пикселя:

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen('https://i.stack.imgur.com/NpiMq.png'))
X = []
Y = []
for x in range(img.size[0]):
    for y in range(img.size[1]):
        r, g, b, a = img.getpixel((x, y))
        if b > r and b > g:
            X.append(x)
            Y.append(y)

Затем, зная, что (0, 20) на графике - это пиксель (63, 355), а (25, 160) на графике - это пиксель (516, 32), вы можете преобразовать координаты пикселя в точки данных. :

X = [(x - 63) * (25 - 0) / (516 - 63) + 0 for x in X]
Y = [(y - 355) * (160 - 20) / (32 - 355) + 20 for y in Y]

Наконец, вы можете использовать nimpy polyfit, чтобы получить полиномиальную подгонку к полученным ранее точкам:

>>> np.polyfit(X, Y, 3)
[ 8.23918277e-03 -7.33330644e-02  2.60046715e+00  2.03012850e+01]

И затем выведите на график результат, используя poly1d, чтобы получить функцию, которая с указанным значением x возвращает свое значение y:

import numpy as np
from matplotlib import pyplot as plt

x2y = np.poly1d(np.polyfit(X, Y, 3))
new_X = [x / 10 for x in range(250)]
new_Y = [x2y(x) for x in new_X]
plt.plot(new_X, new_Y)
plt.show()

Output of the plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...