Почему моя функция не может рисовать с помощью matlibplot - PullRequest
1 голос
/ 12 апреля 2020

Я установил такую ​​функцию:

def triangular(x, a, b, c):
    if x <= a:
        return 0
    if a < x <= b:
        return (x - a)/(b - a)
    if b < x <= c:
        return (c - x)/(c - b)
    if c < x:
        return 0

Я хочу нарисовать изображение этой функции, поэтому я использую:

x = range(-10, 10, 0.1)
y = triangular(x,1,2,3) 
plt.figure()
plt.plot(x,y)
plt.show()

Тем не менее, он показывает ошибку: 'float' object cannot be interpreted as an integer , Почему? мне нужно исправить свою функцию или ввод?

Я пытался изменить на

x = np.arange(-10, 10, 0.1)
y = triangular(x,1,2,3)
plt.figure()
plt.plot(x,y)
plt.show()

, это показывает

 The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Вместо

x = range(-10, 10, 0.1)
y = triangular(x,1,2,3) 

используйте

import numpy as np
...
x = np.arange(-10, 10, 0.1)
y = [triangular(elem_x,1,2,3) for elem_x in x]
1 голос
/ 12 апреля 2020

Вы также можете использовать индексирование и маскирование NumPy для решения этой проблемы, избегая циклов. Ниже описано, как вы можете это сделать. Условия, которые я пишу внутри функции triangular в квадратных скобках [...], являются лишь граничными условиями, описанными в вашей задаче. Это более интуитивно понятно, как написано

def triangular(x, a, b, c):
    x[x<=a] = 0
    x[(a<x) & (x<=b)] = (x[(a<x) & (x<=b)] - a)/(b - a)
    x[(b<x) & (x<=c)] = (c - x[(b<x) & (x<=c)])/(c - b)
    x[x>c] = 0
    return x


x = np.arange(-10, 10, 0.1)
y = triangular(x.copy(),1,2,3) 
plt.figure()
plt.plot(x,y)
plt.show()

enter image description here

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