#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()
команды.