Как cplot() условная функция

Я хочу построить график этой функции, определенной для комплексных чисел: 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 01.08.2024 09:53

@trincot Он строит другую функцию (z) и вообще не отображает грех, как будто я никогда его не писал.

pie 01.08.2024 09:54

Что произойдет, если вы запустите это в отладчике, установите точки останова и проверите переменные? Наверняка вы можете следить за тем, что именно происходит в f?

trincot 01.08.2024 09:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, как вы относитесь к 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()

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

Другие вопросы по теме