Проблемы с cmath в 3D-графике с использованием Matplotlib - PullRequest
1 голос
/ 27 сентября 2019

У меня есть этот простой код, который пытается получить трехмерный график реальных частей двух комплексных чисел E1 и E2 в виде функций t и g.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import cmath


eps=0.5


def ReE1(t,g):
    E1=eps+cmath.sqrt(t**2-g**2)
    return E1.real 

def ReE2(t,g):
    E2=eps-cmath.sqrt(t**2-g**2)
    return E2.real 



fig = plt.figure()
ax = plt.axes(projection="3d")

t = np.linspace(0, 10, 50)
g = np.linspace(0, 10, 50)

X, Y = np.meshgrid(t, g)
Z = ReE1(X, Y)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='winter', edgecolor='none')
Z = ReE2(X, Y)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='summer', edgecolor='none')
plt.show()

Я получаю следующую ошибку при работе с Python 3.

Traceback (most recent call last):
  File "t2.py", line 28, in <module>
    Z = ReE1(X, Y)
  File "t2.py", line 11, in ReE1
    E1=eps+cmath.sqrt(t**2-g**2)
TypeError: only length-1 arrays can be converted to Python scalars

Как мы можем это исправить?Кроме того, можем ли мы использовать сложные функции E1 и E2 напрямую (вместо ReE1 и ReE2) и вызывать модуль real во время построения?

1 Ответ

1 голос
/ 27 сентября 2019

Кажется, проблема в том, что sqrt из cmath принимает только скаляры, тогда как вы пытаетесь использовать его в векторизованном виде, предоставляя ему двумерный массив.Одним из решений является применение cmath.sqrt к каждому элементу t и g путем их циклического повторения следующим образом:

def ReE1(t,g):
    E1 = np.zeros(t.shape, dtype='complex')    
    for i in range(t.shape[0]):
        for j in range(t.shape[1]):
            E1[i][j]=eps+cmath.sqrt(t[i][j]**2-g[i][j]**2)
    return E1.real 

def ReE2(t,g):
    E2 = np.zeros(t.shape, dtype='complex')    
    for i in range(t.shape[0]):
        for j in range(t.shape[1]):
            E2[i][j]=eps-cmath.sqrt(t[i][j]**2-g[i][j]**2)
    return E2.real 

enter image description here

...