Я хочу построить график этой функции, определенной для комплексных чисел: iffloor(Re(z))%2==0, f(z)=z else f(z)=sin(z)
Я попытался закодировать это:
import cplot
import math
import numpy as np
def f(z):
if math.floor(np.real(z)[0])%2==0:
res =z
else:
res=np.sin(z)
return res
plt = cplot.plot(f, (-10, +10, 3000), (-10, 10, 3000),5)
plt.show()
Но это не сработало, программа полностью игнорирует существование функции sin и я не знаю почему.
Я подумал, что это из-за того, что я использовал math.
и np.
, поэтому протестировал более простую функцию:
если Re(z)>=0, f(z) =z, иначе f(z)= sin(z)
import cplot
import numpy as np
def f(z):
if np.real(z)[0]>=0:
res =z
else:
res=np.sin(z)
return res
plt = cplot.plot(f, (-10, +10, 3000), (-10, 10, 3000),5)
plt.show()
На этот раз существование z
было полностью проигнорировано.
Я думал, что, возможно, проблема возникла из-за [0]
в np.real(z)[0]
, но удаление его приведет к ошибке.
ValueError: истинное значение массива, содержащего более одного элемента, неоднозначно. Используйте a.any() или a.all().
Я использовал их, и результат все тот же, он полностью игнорирует z
во втором коде, а также, похоже, проблема в знаке >
; если я изменю его на <
, он полностью игнорирует sin
.
@trincot Он строит другую функцию (z) и вообще не отображает грех, как будто я никогда его не писал.
Что произойдет, если вы запустите это в отладчике, установите точки останова и проверите переменные? Наверняка вы можете следить за тем, что именно происходит в f
?
Проблема в том, как вы относитесь к z. Вы рассматриваете его как обычный массив, а не как комплексное число. Итак, вот как это должно быть
def f(z):
if np.floor(z.real) % 2 == 0:
res = z
else:
res = np.sin(z)
return res
Функция, которую вы строите, должна возвращать массив результатов, а не только статический результат для первого элемента входного массива.
Я не любитель Numpy, но на основе применения функции к массиву numpy я бы попробовал что-то вроде
def f(x):
if np.real(x) >= 0:
res = x
else:
res = np.sin(x)
return res
f_v = np.vectorize(f)
plt = cplot.plot(f_v, (-10, +10, 3000), (-10, 10, 3000),5)
plt.show()
Я уверен, что это можно было бы переписать более элегантно, но, по крайней мере, это должно указать направление.
«полностью игнорировать существование функции греха»: что вы подразумеваете под «игнорировать»? Вы имеете в виду, что оператор не выполняется? Каков результат сеанса отладки?