Код построения функции в интервале (результат графика) - PullRequest
0 голосов
/ 18 декабря 2018

Мне нужна ваша помощь с кодированием результата графика - построением функции с интервалом.

Вопрос, который я получил: «Построить следующую составную функцию. Возможно, вы захотите использовать операторы if ицикл для его построения. Постройте функцию в интервале от [-3, 5].

enter code here
f(x) = {|x|     x<0}
       {-1      0 <= x < 1}
       {+1      1 <= x < 2}
       {ln(x)   2 <= x}

Может кто-нибудь написать мне, пожалуйста, код, в котором результат показывает мне ГРАФ, вкоторая показана вышеупомянутой функцией без последовательности в строке графика.

Заранее большое спасибо!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Обычно простые составные функции можно легко написать, как и любую другую функцию, умножив их на соответствующие условия.Единственное место, где нужно быть осторожным, это логарифм, который не определен для полного обращения.Эту проблему можно обойти, взяв здесь абсолютное значение, поскольку оно в любом случае относится только к диапазону> 2.

import numpy as np
import matplotlib.pyplot as plt

f = lambda x: np.abs(x)*(x<0) - ((0<=x) & (x < 1)) + ((1<=x) & (x < 2)) + np.log(np.abs(x))*(2<=x)

x = np.linspace(-3,5,200)

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

enter image description here


Согласнок комментарию под ответом можно также оценить функцию в каждом из интервалов отдельно,

intervals = [(-3, -1e-6), (0,1-1e-6), (1, 2-1e-6), (2,5)]
for (s,e) in intervals:
    x = np.linspace(s,e,100)
    plt.plot(x,f(x), color="C0")

enter image description here

0 голосов
/ 18 декабря 2018

Большое спасибо за вашу помощь, это действительно полезно:)

Кроме того, я хотел бы знать, как я могу исключить линии, соединяющие каждый шаг интервала с следующим?

Мне нужно показывать только 4 отдельных графических результата на графике, на каждом шаге, без "непрерывности" линий, соединяющих их.

0 голосов
/ 18 декабря 2018

Использование оператора if будет более сложным способом.Вы можете напрямую использовать индексирование и маскирование NumPy для выполнения задачи.Ниже, как я бы это сделал.

Объяснение : Сначала вы создаете сетку точек x-данных в интервале (3, 5).Затем вы инициализируете пустой y-массив той же длины.Далее вы используете условия для x, чтобы получить индексы x-массива.Это делается с помощью маски.mask1 = ((x>=0) & (x<1)) определяет условие, и затем вы используете y[mask1] = -1, что означает, что [mask1] вернет индексы массива, в которых выполняется условие True, а затем вы будете использовать эти индексы для присвоения значения y.Вы делаете это для всех 4 условий.Я просто использовал две маски для двух средних условий.Вы также можете использовать 4 переменные (маски), чтобы сделать то же самое.Это вопрос личного вкуса.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 5, 100)
y = np.zeros(len(x))

mask1 = ((x>=0) & (x<1))
mask2 = ((x>=1) & (x<2))

y[x<0] = np.abs(x[x<0])
y[mask1] = -1
y[mask2] = 1
y[x>=2] = np.log(x[x>=2])

plt.plot(x, y)
plt.xlabel('$x$')
plt.ylabel(r'$f(x)$')
plt.show()

enter image description here

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