Попытка использовать оператор суммы в matplotlib дает ошибку - PullRequest
0 голосов
/ 30 октября 2019

Итак, я хотел бы сначала упомянуть, что я абсолютно новичок практически во всем, что связано с Jupyter Notebook, matplotlib и numpy. Поэтому я, скорее всего, не смогу четко выразить свою проблему. Поэтому я прошу у вас терпения :) (ага, да и мой английский тоже отстой ...)

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

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

%matplotlib inline

plt.rcParams['figure.figsize'] = (11,4)
plt.rcParams['figure.dpi'] = 150

from ipywidgets import interact,interactive, fixed, interact_manual
import ipywidgets as Widgets


def f(n):

    plt.plot(      np.arange(0,10), 1/pi * sum(  2/(i* pi) * (1- cos(i*pi) ) * sin(i*np.arange(0,10)) for i in range(1,n)   )       ) 
    plt.ylim(-2,2)
interact(f, n= 1)

Теперь все работает нормально до строки, где я установил свою функцию, поэтому строка с этим

plt.plot (np.arange. ..)

Это дает мне следующую ошибку:

ValueError: x и y должны иметь одинаковое первое измерение, но иметь формы (10,) и (1,)

Я уже понял, что это связано с использованием оператора sum () и использованием в нем переменной n . Если я не введу n в сумму , то все работает хорошо, и я получаю свой график.

Итак, вопрос в том, что я буду делатьнужно сделать, чтобы моя идея осуществилась.

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

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Итак, для тех из вас, кто интересуется ответом (возможно, есть некоторые): я нашел хорошее и простое решение.

Проблема заключалась в том, что линия

interact(f, n= 1)

не работал сам по себе. Теперь, когда я сказал это следующим образом,

interact(f, n =widgets.IntSlider(min=2, max=100, step=1, value=2))

и, самое главное, сказал, что ползунок должен быть IntSlider, все работает просто отлично!

Спасибо за помощь в любом случае! Поскольку я новичок в этой платформе, я не знаю, как можно закрыть решаемые вопросы, но этот здесь, безусловно, может быть закрыт.

0 голосов
/ 30 октября 2019

Использование sum означает, что вы свернете список значений до одного значения, это то, что вам говорит numpy - у вас есть 10 x значений и только 1 y значения (потому что вы только что добавили их все). Я думаю, что вы хотите сделать, это создать список сумм, поэтому просто переместите одну закрывающую скобку ()) от после for i in range(n) до него:

plt.plot(np.arange(0,10), 1/pi * sum(2/(i* pi) * (1- cos(i*pi)) * sin(i*np.arange(0,10))) for i in range(1,n))
...