Ошибка типа: объект типа ‘Add’ не сериализуем в формате JSON — График Python

#python #arrays #json #numpy #sympy

#python #массивы #json #numpy #симпатия

Вопрос:

Я работаю над попыткой создания касательной аппроксимации функции. Однако пытаюсь найти способ отобразить его поверх графика. Обе функции работают, но когда я строю график функций, я получаю сообщение об ошибке типа «Объект типа ‘Add’ не является сериализуемым в формате JSON»

 x = sp.Symbol("x")
y = sp.Symbol("y")
f = 1*(np.e**(-2*(((x**2   y**2)**(1/2))-1))-2*np.e**(-1*(((x**2   y**2)**(1/2))-1)))
fx = f.diff(x)
fy = f.diff(y)
x = np.linspace(-5,5,50)
y = np.linspace(-5,5,50)
[xx,yy] = np.meshgrid(x,y)
ff = 1*(np.e**(-2*(((xx**2   yy**2)**(1/2))-1))-2*np.e**(-1*(((xx**2   yy**2)** 
(1/2))-1)))
uu = f.subs(x,2).subs(y,2)   fx.subs(x,2).subs(y,2)*(xx)   fy.subs(x,2).subs(y,2)*(yy)


import plotly.graph_objects as go
fig = go.Figure(data=[go.Surface(x=xx,y=yy,z=uu),go.Surface(x=xx,y=yy,z=ff)])
fig.show()
  

Ошибка возникает в последней строке кода.

Комментарии:

1. Проверьте вашу uu переменную. Я подозреваю, что это sympy object ( Add ), а не числовой ( numpy массив), как ff и xx , yy являются. Я не знаком plotly , но очевидно, что он не может обрабатывать этот sympy объект.

2. Вы найдете много ответов / комментариев SO, которые предостерегают от numpy sympy совместного использования и. У вас есть дополнительное усложнение plotly .

3. Вы заменяете np.linspace объект на 2 вместо sp.Symbol объекта с 2. Вам нужно либо переименовать ваши объекты linspace, либо переместиться uu выше ваших определений объектов linspace. Я также настоятельно рекомендую не использовать функции numpy в выражениях sympy. Скорее используйте sp.exp(...) . Я также предлагаю выполнить .evalf() после замены, чтобы все объекты sympy были удалены перед любыми дальнейшими манипуляциями.

Ответ №1:

Проблема связана с вашими коэффициентами ( f.subs(x,2).subs(y,2) , fx.subs(x,2).subs(y,2) , и fy.subs(x,2).subs(y,2) ). Коэффициенты имеют тип <class 'sympy.core.numbers.Float'> , который несовместим для вычислений с массивами numpy. Вы можете преобразовать коэффициенты с помощью float() команды.